home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mkresdll.zip / SOURCES.ZIP / MKRESDLL.C < prev    next >
C/C++ Source or Header  |  1997-10-11  |  17KB  |  358 lines

  1. /*----------------------------------------------------------------------*/
  2. /* Copyright(C) 1997, Tomoki Yoshioka. All rights reserved.             */
  3. /* Åêù¥èTùvüFâèâ\ü[âXé╠é▌é╠écékéké≡ì∞ɼé╖éΘüB                           */
  4. /* è╓ÉöêΩùùüFstatic int  Usage(char *)                                  */
  5. /* ü@ü@ü@ü@üFstatic int  load_resource(char *)                          */
  6. /* ü@ü@ü@ü@üFstatic int  save_file(char *, char *, ULONG)               */
  7. /* ü@ü@ü@ü@üFstatic int  make_obj(char *, char *)                       */
  8. /* ü@ü@ü@ü@üFstatic void get_base_name(char *, char *, char *)          */
  9. /* ü@ü@ü@ü@üFstatic int  make_def_file(char *, char *)                  */
  10. /* ü@ü@ü@ü@üFstatic int  link_obj(char *, char *, char *)               */
  11. /* ü@ü@ü@ü@üFstatic int  make_dll(char *, char *)                       */
  12. /* ü@ü@ü@ü@üFstatic int  make_dll_main(char *, char *, char *)          */
  13. /* ü@ü@ü@ü@üFextern int  main(int, char *[])                            */
  14. /*----------------------------------------------------------------------*/
  15. /* ìXÉVùÜù≡                                                             */
  16. /* Ver.0.00 1997/10/11                                                  */
  17. /* üEÅëö┼ì∞ɼ                                                           */
  18. /*----------------------------------------------------------------------*/
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <process.h>
  23. #include <io.h>
  24. #include <fcntl.h>
  25. #define INCL_DOS
  26. #include <os2.h>
  27. #include "mkresdll.h"
  28.  
  29.  
  30. #define NO_ERROR    (0)
  31. #define ERROR        (-1)
  32.  
  33.  
  34. /*----------------------------------------------------------------------*/
  35. /* è╓Éöû╝üFint  Usage(szPrgName) ;                                      */
  36. /* ï@ö\ü@üFÄgéóò√é≡ò\Īé╖éΘüB                                           */
  37. /* ôⁿù═ü@üFchar  *szPrgName ; âvâìâOâëâÇû╝                              */
  38. /* Åoù═ü@üFé╚é╡                                                         */
  39. /* ò£ïAÆlüF0 é≡ò╘é╡é▄é╖üB                                               */
  40. /*----------------------------------------------------------------------*/
  41. /* ìXÉVùÜù≡                                                             */
  42. /* Ver.0.00 1997/10/11                                                  */
  43. /* üEÅëö┼ì∞ɼ                                                           */
  44. /*----------------------------------------------------------------------*/
  45. int Usage(char *szPrgName)
  46. {
  47.     char  szDrive[_MAX_DRIVE] ;
  48.     char  szDir[_MAX_DIR] ;
  49.     char  szFName[_MAX_FNAME] ;
  50.     char  szExt[_MAX_EXT] ;
  51.     _splitpath(szPrgName, szDrive, szDir, szFName, szExt) ;
  52.  
  53.     printf("Usage : %s  RCFileName\n", szFName) ;
  54.  
  55.     return NO_ERROR ;
  56. }
  57.  
  58.  
  59. /*----------------------------------------------------------------------*/
  60. /* è╓Éöû╝üFint  load_resource(buffer) ;                                 */
  61. /* ï@ö\ü@üFécékékì∞ɼùpâIâuâWâFâNâgâtâ@âCâïé≡âèâ\ü[âXé⌐éτĵéΦÅoé╖üB     */
  62. /* ôⁿù═ü@üFchar  *buffer ; âèâ\ü[âXô╟é▌ì₧é▌ùpâoâbâtâ@é╠âAâhâîâX         */
  63. /* ü@ü@ü@üFULONG *pnSize ; âoâbâtâ@é╠âTâCâY                             */
  64. /* Åoù═ü@üFchar *buffer  ; âèâ\ü[âXé⌐éτô╟é▌ì₧é±é╛ .OBJ âtâ@âCâïé╠âfü[â^ */
  65. /* ü@ü@ü@üFULONG *pnSize ; âèâ\ü[âXé⌐éτô╟é▌ì₧é±é╛ .OBJ âtâ@âCâïé╠âTâCâY */
  66. /* ò£ïAÆlüFâGâëü[âRü[âh                                                 */
  67. /*----------------------------------------------------------------------*/
  68. /* ìXÉVùÜù≡                                                             */
  69. /* Ver.0.00 1997/10/11                                                  */
  70. /* üEÅëö┼ì∞ɼ                                                           */
  71. /*----------------------------------------------------------------------*/
  72. static int  load_resource(char *buffer, ULONG *pnSize)
  73. {
  74.     int  rc ;
  75.     ULONG ulResSize ;
  76.     PBYTE pbResource = NULL ;
  77.  
  78.     rc = (int)DosQueryResourceSize(
  79.                         NULLHANDLE, RT_MAKEDLL, IDR_MAKEDLL, &ulResSize) ;
  80.     if (rc != NO_ERROR) return rc ;
  81.     if (ulResSize > *pnSize) return ERROR ;
  82.     /* âèâ\ü[âXé╓é╠â|âCâôâ^é≡ĵô╛é╡é▄é╖üB*/
  83.     rc = (int)DosGetResource(
  84.                         NULL, RT_MAKEDLL, IDR_MAKEDLL, (PPVOID)&pbResource) ;
  85.     if (rc != NO_ERROR) return rc ;
  86.     /* âèâ\ü[âXé≡âüâéâèé╔ô╟é▌ì₧é▌é▄é╖üB*/
  87.     memcpy(buffer, pbResource, ulResSize) ;
  88.     /* âèâ\ü[âXé≡ë≡ò·é╖éΘüB*/
  89.     DosFreeResource(pbResource) ;
  90.     /* ô╟é▌ì₧é±é╛âèâ\ü[âXé╠âTâCâYé≡èiö[é╖éΘüB*/
  91.     *pnSize = ulResSize ;
  92.     /* Åêù¥îïë╩é≡ò╘é╖üB*/
  93.     return rc ;
  94. }
  95.  
  96.  
  97. /*----------------------------------------------------------------------*/
  98. /* è╓Éöû╝üFint  save_file(szFileName, buffer, size) ;                   */
  99. /* ï@ö\ü@üFâtâ@âCâïé╔Åæé½Åoé╖üB                                         */
  100. /* ôⁿù═ü@üFchar  *szFileName ; âtâ@âCâïû╝                               */
  101. /* ü@ü@ü@üFchar  *buffer ; Åæé½Åoé╖âfü[â^                               */
  102. /* ü@ü@ü@üFULONG size ; âfü[â^é╠âTâCâY                                  */
  103. /* Åoù═ü@üFé╚é╡                                                         */
  104. /* ò£ïAÆlüFâGâëü[âRü[âh                                                 */
  105. /*----------------------------------------------------------------------*/
  106. /* ìXÉVùÜù≡                                                             */
  107. /* Ver.0.00 1997/10/11                                                  */
  108. /* üEÅëö┼ì∞ɼ                                                           */
  109. /*----------------------------------------------------------------------*/
  110. static int save_file(char *szFileName, char *buffer, ULONG size)
  111. {
  112.     int fd ;
  113.     fd = open(szFileName, O_WRONLY | O_CREAT | O_EXCL, S_IREAD | S_IWRITE) ;
  114.     if (fd == -1) return ERROR ;
  115.     if (write(fd, buffer, size) != size) {
  116.         close(fd) ;
  117.         return ERROR ;
  118.     }
  119.     close(fd) ;
  120.     return NO_ERROR ;
  121. }
  122.  
  123.  
  124. /*----------------------------------------------------------------------*/
  125. /* è╓Éöû╝üFint  make_obj(szPath, szObjName) ;                           */
  126. /* ï@ö\ü@üFécékékì∞ɼùpâIâuâWâFâNâgâtâ@âCâïé≡âèâ\ü[âXé⌐éτĵéΦÅoé╖üB     */
  127. /* ôⁿù═ü@üFchar *szPath ; âIâuâWâFâNâgâtâ@âCâïèiö[âpâX                  */
  128. /* ü@ü@ü@üFchar *szObjName ; âIâuâWâFâNâgâtâ@âCâïû╝èiö[ù╠êµ             */
  129. /* Åoù═ü@üFchar *szObjName ; âIâuâWâFâNâgâtâ@âCâïû╝                     */
  130. /* ò£ïAÆlüFâGâëü[âRü[âh                                                 */
  131. /*----------------------------------------------------------------------*/
  132. /* ìXÉVùÜù≡                                                             */
  133. /* Ver.0.00 1997/10/11                                                  */
  134. /* üEÅëö┼ì∞ɼ                                                           */
  135. /*----------------------------------------------------------------------*/
  136. static int make_obj(char *szPath, char *szObjName)
  137. {
  138.     int   rc ;
  139.     ULONG size ;
  140.     char  szDrive[_MAX_DRIVE] ;
  141.     char  szDir[_MAX_DIR] ;
  142.     char  szFName[_MAX_FNAME] ;
  143.     char  szExt[_MAX_EXT] ;
  144.     char  buffer[128] ;
  145.     /* âIâuâWâFâNâgé≡èiö[é╖éΘâpâXû╝é≡ĵô╛é╖éΘüB*/
  146.     _splitpath(szPath, szDrive, szDir, szFName, szExt) ;
  147.     /* âIâuâWâFâNâgâtâ@âCâïû╝é≡É╢ɼé╖éΘüB*/
  148.     _makepath(szObjName, szDrive, szDir, "MKRESBAS", ".OBJ") ;
  149.     /* âèâ\ü[âXé⌐éτâIâuâWâFâNâgâtâ@âCâïé≡ô╟é▌ì₧é▐üB*/
  150.     size = sizeof(buffer) ;
  151.     rc = load_resource(buffer, &size) ;
  152.     if (rc != NO_ERROR) return rc ;
  153.     /* ô╟é▌ì₧é±é╛âfü[â^é≡âtâ@âCâïé╔Åæé½ì₧é▐üB*/
  154.     return save_file(szObjName, buffer, size) ;
  155. }
  156.  
  157.  
  158. /*----------------------------------------------------------------------*/
  159. /* è╓Éöû╝üFvoid get_base_name(src, path, name) ;                        */
  160. /* ï@ö\ü@üFâtâ@âCâïé╠âxü[âXâtâ@âCâïû╝é≡ĵô╛é╖éΘüB                       */
  161. /* ôⁿù═ü@üFchar *src  ; âèâ\ü[âXÆΦï`âtâ@âCâïû╝                          */
  162. /* ü@ü@ü@üFchar *path ; âpâXû╝èiö[ù╠êµ                                  */
  163. /* ü@ü@ü@üFchar *name ; âéâWâàü[âïû╝èiö[ù╠êµ                            */
  164. /* Åoù═ü@üFchar *path ; âpâXû╝                                          */
  165. /* ü@ü@ü@üFchar *name ; âéâWâàü[âïû╝                                    */
  166. /* ò£ïAÆlüFé╚é╡                                                         */
  167. /*----------------------------------------------------------------------*/
  168. /* ìXÉVùÜù≡                                                             */
  169. /* Ver.0.00 1997/10/11                                                  */
  170. /* üEÅëö┼ì∞ɼ                                                           */
  171. /*----------------------------------------------------------------------*/
  172. static void get_base_name(char *src, char *path, char *name)
  173. {
  174.     char szDrive[_MAX_DRIVE] ;
  175.     char szDir[_MAX_DIR] ;
  176.     char szFName[_MAX_FNAME] ;
  177.     char szExt[_MAX_EXT] ;
  178.     /* âtâ@âCâïû╝é≡ò¬ë≡ */
  179.     _splitpath(src, szDrive, szDir, szFName, szExt) ;
  180.     /* âpâXû╝é≡èiö[é╖éΘüB*/
  181.     strcpy(path, szDrive) ;
  182.     strcat(path, szDir) ;
  183.     /* âéâWâàü[âïû╝é≡èiö[é╖éΘüB*/
  184.     strcpy(name, szFName) ;
  185. }
  186.  
  187.  
  188. /*----------------------------------------------------------------------*/
  189. /* è╓Éöû╝üFint  make_def_file(szDefFile, szModule) ;                    */
  190. /* ï@ö\ü@üF.DEF âtâ@âCâïé≡ì∞ɼé╖éΘüB                                    */
  191. /* ôⁿù═ü@üFchar *szDefFile; .DEF âtâ@âCâïû╝                             */
  192. /* ü@ü@ü@üFchar *szModule ; âéâWâàü[âïû╝                                */
  193. /* Åoù═ü@üFé╚é╡                                                         */
  194. /* ò£ïAÆlüFâGâëü[âRü[âh                                                 */
  195. /*----------------------------------------------------------------------*/
  196. /* ìXÉVùÜù≡                                                             */
  197. /* Ver.0.00 1997/10/11                                                  */
  198. /* üEÅëö┼ì∞ɼ                                                           */
  199. /*----------------------------------------------------------------------*/
  200. static int make_def_file(char *szDefFile, char *szModule)
  201. {
  202.     int fd ;
  203.     int len ;
  204.     char buffer[256] ;
  205.  
  206.     /* .DEF âtâ@âCâïé≡èJé¡ */
  207.     fd = open(szDefFile, O_WRONLY | O_CREAT | O_EXCL, S_IREAD | S_IWRITE) ;
  208.     if (fd == -1) return ERROR ;
  209.     len = sprintf(buffer, "LIBRARY %s\n", szModule) ;
  210.     if (write(fd, buffer, len) != len) {
  211.         close(fd) ;
  212.         return ERROR ;
  213.     }
  214.     len = sprintf(buffer, "PROTMODE\n") ;
  215.     if (write(fd, buffer, len) != len) {
  216.         close(fd) ;
  217.         return ERROR ;
  218.     }
  219.     close(fd) ;
  220.     return NO_ERROR ;
  221. }
  222.  
  223.  
  224. /*----------------------------------------------------------------------*/
  225. /* è╓Éöû╝üFint  link_obj(szObjName, szDefFile, szDllName) ;             */
  226. /* ï@ö\ü@üF.OBJ, .DEF âtâ@âCâïé≡âèâôâNé╡üA.DLL é≡É╢ɼé╖éΘüB             */
  227. /* ôⁿù═ü@üFchar *szObjName ; .OBJ âtâ@âCâïû╝                            */
  228. /* ü@ü@ü@üFchar *szDefFile ; .DEF âtâ@âCâïû╝                            */
  229. /* ü@ü@ü@üFchar *szDllName ; .DLL âtâ@âCâïû╝                            */
  230. /* Åoù═ü@üFé╚é╡                                                         */
  231. /* ò£ïAÆlüFâGâëü[âRü[âh                                                 */
  232. /*----------------------------------------------------------------------*/
  233. /* ìXÉVùÜù≡                                                             */
  234. /* Ver.0.00 1997/10/11                                                  */
  235. /* üEÅëö┼ì∞ɼ                                                           */
  236. /*----------------------------------------------------------------------*/
  237. static int link_obj(char *szObjName, char *szDefFile, char *szDllName)
  238. {
  239.     static char lkcmd[] = "link386" ;
  240.     char buffer[_MAX_PATH * 2] ;
  241.     sprintf(buffer, "%s,%s,nul,,%s", szObjName, szDllName, szDefFile) ;
  242.     return spawnlp(P_WAIT, lkcmd, lkcmd, buffer, NULL) ;
  243. }
  244.  
  245.  
  246. /*----------------------------------------------------------------------*/
  247. /* è╓Éöû╝üFint  make_dll(szRcName, szDllName) ;                         */
  248. /* ï@ö\ü@üF.RC, .DLL âtâ@âCâïé≡îïìçé╡üAâèâ\ü[âXòté½é╠.DLL é≡É╢ɼé╖éΘüB  */
  249. /* ôⁿù═ü@üFchar *szRcName  ; .RC  âtâ@âCâïû╝                            */
  250. /* ü@ü@ü@üFchar *szDllName ; .DLL âtâ@âCâïû╝                            */
  251. /* Åoù═ü@üFé╚é╡                                                         */
  252. /* ò£ïAÆlüFâGâëü[âRü[âh                                                 */
  253. /*----------------------------------------------------------------------*/
  254. /* ìXÉVùÜù≡                                                             */
  255. /* Ver.0.00 1997/10/11                                                  */
  256. /* üEÅëö┼ì∞ɼ                                                           */
  257. /*----------------------------------------------------------------------*/
  258. static int make_dll(char *szRcName, char *szDllName)
  259. {
  260.     static char rccmd[] = "rc" ;
  261.     return spawnlp(P_WAIT, rccmd, rccmd, szRcName, szDllName, NULL) ;
  262. }
  263.  
  264.  
  265. /*----------------------------------------------------------------------*/
  266. /* è╓Éöû╝üFint  make_dll_main(szObjName, szPath, szModule) ;            */
  267. /* ï@ö\ü@üFì∞ɼé╖éΘécékéké╠âxü[âXâtâ@âCâïû╝é≡ĵô╛é╖éΘüB                 */
  268. /* ôⁿù═ü@üFchar *szObjName ; écékékì∞ɼé╔Ägùpé╖éΘ.OBJâtâ@âCâïû╝         */
  269. /* ü@ü@ü@üFchar *szPath ; âtâ@âCâïé≡ì∞ɼé╖éΘâpâX                        */
  270. /* ü@ü@ü@üFchar *szModule ; âéâWâàü[âïû╝                                */
  271. /* Åoù═ü@üFé╚é╡                                                         */
  272. /* ò£ïAÆlüFâGâëü[âRü[âh                                                 */
  273. /*----------------------------------------------------------------------*/
  274. /* ìXÉVùÜù≡                                                             */
  275. /* Ver.0.00 1997/10/11                                                  */
  276. /* üEÅëö┼ì∞ɼ                                                           */
  277. /*----------------------------------------------------------------------*/
  278. static int make_dll_main(char *szObjName, char *szPath, char *szModule)
  279. {
  280.     int rc ;
  281.     char szTmpName[_MAX_PATH] ;
  282.     char szDllName[_MAX_PATH] ;
  283.     strcpy(szTmpName, szPath) ;
  284.     strcat(szTmpName, szModule) ;
  285.     strcpy(szDllName, szTmpName) ;
  286.     strcat(szTmpName, ".DEF") ;
  287.     strcat(szDllName, ".DLL") ;
  288.     /*--------------------------------------------------------------*/
  289.     /* .DEF âtâ@âCâïé≡ì∞ɼé╖éΘüB                                    */
  290.     /*--------------------------------------------------------------*/
  291.     rc = make_def_file(szTmpName, szModule) ;
  292.     if (rc != NO_ERROR) return rc ;
  293.     /*--------------------------------------------------------------*/
  294.     /* .OBJ + .DEF -> .DLL é≡ì∞ɼé╖éΘüB                             */
  295.     /*--------------------------------------------------------------*/
  296.     rc = link_obj(szObjName, szTmpName, szDllName) ;
  297.     remove(szTmpName) ;
  298.     if (rc != NO_ERROR) return rc ;
  299.     /*--------------------------------------------------------------*/
  300.     /* .DLL + .RC -> .DLL é≡ì∞ɼé╖éΘüB                              */
  301.     /*--------------------------------------------------------------*/
  302.     strcpy(szTmpName, szPath) ;
  303.     strcat(szTmpName, szModule) ;
  304.     rc = make_dll(szTmpName, szDllName) ;
  305.     strcat(szTmpName, ".RES") ;
  306.     remove(szTmpName) ;
  307.     /*--------------------------------------------------------------*/
  308.     /* îïë╩é≡ò╘é╖üB                                                 */
  309.     /*--------------------------------------------------------------*/
  310.     return rc ;
  311. }
  312.  
  313.  
  314. /*----------------------------------------------------------------------*/
  315. /* è╓Éöû╝üFint main(argc, argv) ;                                       */
  316. /* ï@ö\ü@üFSet Icon âüâCâô                                              */
  317. /* ôⁿù═ü@üFint  argc    ; âpâëâüü[â^Éö                                  */
  318. /* ü@ü@ü@üFchar *argv[] ; âpâëâüü[â^                                    */
  319. /* Åoù═ü@üFé╚é╡                                                         */
  320. /* ò£ïAÆlüFTRUE  ; É│ÅφÅIù╣                                             */
  321. /* ü@ü@ü@üFFALSE ; ê┘ÅφÅIù╣                                             */
  322. /*----------------------------------------------------------------------*/
  323. /* ìXÉVùÜù≡                                                             */
  324. /* Ver.0.00 1997/10/11                                                  */
  325. /* üEÅëö┼ì∞ɼ                                                           */
  326. /*----------------------------------------------------------------------*/
  327. int main(int argc, char *argv[])
  328. {
  329.     int rc ;
  330.     if (argc < 2) {
  331.         rc = Usage(argv[0]) ;
  332.     } else {
  333.         int rc ;
  334.         char szObjName[_MAX_PATH] ;
  335.         rc = make_obj(argv[0], szObjName) ;
  336.         if (rc != NO_ERROR) {
  337.             fprintf(stderr, "ERROR!:Can't make .obj file(%d)\n", rc) ;
  338.         }
  339.         else {
  340.             int i ;
  341.             for (i = 1 ; i < argc ; i++) {
  342.                 char szPath[_MAX_PATH] ;
  343.                 char szModule[_MAX_FNAME] ;
  344.                 /* ì∞ɼé╖éΘécékéké╠âxü[âXâtâ@âCâïû╝é≡ĵô╛é╖éΘüB*/
  345.                 get_base_name(argv[i], szPath, szModule) ;
  346.                 /* écékéké≡ì∞ɼé╖éΘüB*/
  347.                 rc = make_dll_main(szObjName, szPath, szModule) ;
  348.                 if (rc != NO_ERROR) {
  349.                     fprintf(stderr, "ERROR!:%s(%d)\n", argv[i], rc) ;
  350.                 }
  351.             }
  352.             /* écékékì∞ɼé╔Ägùpé╡é╜âIâuâWâFâNâgâtâ@âCâïé≡ìφÅ£é╖éΘüB*/
  353.             remove(szObjName) ;
  354.         }
  355.     }
  356.     return rc ;
  357. }
  358.