home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
mkresdll.zip
/
SOURCES.ZIP
/
MKRESDLL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-10-11
|
17KB
|
358 lines
/*----------------------------------------------------------------------*/
/* Copyright(C) 1997, Tomoki Yoshioka. All rights reserved. */
/* Åêù¥èTùvüFâèâ\ü[âXé╠é▌é╠écékéké≡ì∞ɼé╖éΘüB */
/* è╓ÉöêΩùùüFstatic int Usage(char *) */
/* ü@ü@ü@ü@üFstatic int load_resource(char *) */
/* ü@ü@ü@ü@üFstatic int save_file(char *, char *, ULONG) */
/* ü@ü@ü@ü@üFstatic int make_obj(char *, char *) */
/* ü@ü@ü@ü@üFstatic void get_base_name(char *, char *, char *) */
/* ü@ü@ü@ü@üFstatic int make_def_file(char *, char *) */
/* ü@ü@ü@ü@üFstatic int link_obj(char *, char *, char *) */
/* ü@ü@ü@ü@üFstatic int make_dll(char *, char *) */
/* ü@ü@ü@ü@üFstatic int make_dll_main(char *, char *, char *) */
/* ü@ü@ü@ü@üFextern int main(int, char *[]) */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>
#include <io.h>
#include <fcntl.h>
#define INCL_DOS
#include <os2.h>
#include "mkresdll.h"
#define NO_ERROR (0)
#define ERROR (-1)
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint Usage(szPrgName) ; */
/* ï@ö\ü@üFÄgéóò√é≡ò\Īé╖éΘüB */
/* ôⁿù═ü@üFchar *szPrgName ; âvâìâOâëâÇû╝ */
/* Åoù═ü@üFé╚é╡ */
/* ò£ïAÆlüF0 é≡ò╘é╡é▄é╖üB */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
int Usage(char *szPrgName)
{
char szDrive[_MAX_DRIVE] ;
char szDir[_MAX_DIR] ;
char szFName[_MAX_FNAME] ;
char szExt[_MAX_EXT] ;
_splitpath(szPrgName, szDrive, szDir, szFName, szExt) ;
printf("Usage : %s RCFileName\n", szFName) ;
return NO_ERROR ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint load_resource(buffer) ; */
/* ï@ö\ü@üFécékékì∞ɼùpâIâuâWâFâNâgâtâ@âCâïé≡âèâ\ü[âXé⌐éτĵéΦÅoé╖üB */
/* ôⁿù═ü@üFchar *buffer ; âèâ\ü[âXô╟é▌ì₧é▌ùpâoâbâtâ@é╠âAâhâîâX */
/* ü@ü@ü@üFULONG *pnSize ; âoâbâtâ@é╠âTâCâY */
/* Åoù═ü@üFchar *buffer ; âèâ\ü[âXé⌐éτô╟é▌ì₧é±é╛ .OBJ âtâ@âCâïé╠âfü[â^ */
/* ü@ü@ü@üFULONG *pnSize ; âèâ\ü[âXé⌐éτô╟é▌ì₧é±é╛ .OBJ âtâ@âCâïé╠âTâCâY */
/* ò£ïAÆlüFâGâëü[âRü[âh */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static int load_resource(char *buffer, ULONG *pnSize)
{
int rc ;
ULONG ulResSize ;
PBYTE pbResource = NULL ;
rc = (int)DosQueryResourceSize(
NULLHANDLE, RT_MAKEDLL, IDR_MAKEDLL, &ulResSize) ;
if (rc != NO_ERROR) return rc ;
if (ulResSize > *pnSize) return ERROR ;
/* âèâ\ü[âXé╓é╠â|âCâôâ^é≡ĵô╛é╡é▄é╖üB*/
rc = (int)DosGetResource(
NULL, RT_MAKEDLL, IDR_MAKEDLL, (PPVOID)&pbResource) ;
if (rc != NO_ERROR) return rc ;
/* âèâ\ü[âXé≡âüâéâèé╔ô╟é▌ì₧é▌é▄é╖üB*/
memcpy(buffer, pbResource, ulResSize) ;
/* âèâ\ü[âXé≡ë≡ò·é╖éΘüB*/
DosFreeResource(pbResource) ;
/* ô╟é▌ì₧é±é╛âèâ\ü[âXé╠âTâCâYé≡èiö[é╖éΘüB*/
*pnSize = ulResSize ;
/* Åêù¥îïë╩é≡ò╘é╖üB*/
return rc ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint save_file(szFileName, buffer, size) ; */
/* ï@ö\ü@üFâtâ@âCâïé╔Åæé½Åoé╖üB */
/* ôⁿù═ü@üFchar *szFileName ; âtâ@âCâïû╝ */
/* ü@ü@ü@üFchar *buffer ; Åæé½Åoé╖âfü[â^ */
/* ü@ü@ü@üFULONG size ; âfü[â^é╠âTâCâY */
/* Åoù═ü@üFé╚é╡ */
/* ò£ïAÆlüFâGâëü[âRü[âh */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static int save_file(char *szFileName, char *buffer, ULONG size)
{
int fd ;
fd = open(szFileName, O_WRONLY | O_CREAT | O_EXCL, S_IREAD | S_IWRITE) ;
if (fd == -1) return ERROR ;
if (write(fd, buffer, size) != size) {
close(fd) ;
return ERROR ;
}
close(fd) ;
return NO_ERROR ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint make_obj(szPath, szObjName) ; */
/* ï@ö\ü@üFécékékì∞ɼùpâIâuâWâFâNâgâtâ@âCâïé≡âèâ\ü[âXé⌐éτĵéΦÅoé╖üB */
/* ôⁿù═ü@üFchar *szPath ; âIâuâWâFâNâgâtâ@âCâïèiö[âpâX */
/* ü@ü@ü@üFchar *szObjName ; âIâuâWâFâNâgâtâ@âCâïû╝èiö[ù╠êµ */
/* Åoù═ü@üFchar *szObjName ; âIâuâWâFâNâgâtâ@âCâïû╝ */
/* ò£ïAÆlüFâGâëü[âRü[âh */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static int make_obj(char *szPath, char *szObjName)
{
int rc ;
ULONG size ;
char szDrive[_MAX_DRIVE] ;
char szDir[_MAX_DIR] ;
char szFName[_MAX_FNAME] ;
char szExt[_MAX_EXT] ;
char buffer[128] ;
/* âIâuâWâFâNâgé≡èiö[é╖éΘâpâXû╝é≡ĵô╛é╖éΘüB*/
_splitpath(szPath, szDrive, szDir, szFName, szExt) ;
/* âIâuâWâFâNâgâtâ@âCâïû╝é≡É╢ɼé╖éΘüB*/
_makepath(szObjName, szDrive, szDir, "MKRESBAS", ".OBJ") ;
/* âèâ\ü[âXé⌐éτâIâuâWâFâNâgâtâ@âCâïé≡ô╟é▌ì₧é▐üB*/
size = sizeof(buffer) ;
rc = load_resource(buffer, &size) ;
if (rc != NO_ERROR) return rc ;
/* ô╟é▌ì₧é±é╛âfü[â^é≡âtâ@âCâïé╔Åæé½ì₧é▐üB*/
return save_file(szObjName, buffer, size) ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFvoid get_base_name(src, path, name) ; */
/* ï@ö\ü@üFâtâ@âCâïé╠âxü[âXâtâ@âCâïû╝é≡ĵô╛é╖éΘüB */
/* ôⁿù═ü@üFchar *src ; âèâ\ü[âXÆΦï`âtâ@âCâïû╝ */
/* ü@ü@ü@üFchar *path ; âpâXû╝èiö[ù╠êµ */
/* ü@ü@ü@üFchar *name ; âéâWâàü[âïû╝èiö[ù╠êµ */
/* Åoù═ü@üFchar *path ; âpâXû╝ */
/* ü@ü@ü@üFchar *name ; âéâWâàü[âïû╝ */
/* ò£ïAÆlüFé╚é╡ */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static void get_base_name(char *src, char *path, char *name)
{
char szDrive[_MAX_DRIVE] ;
char szDir[_MAX_DIR] ;
char szFName[_MAX_FNAME] ;
char szExt[_MAX_EXT] ;
/* âtâ@âCâïû╝é≡ò¬ë≡ */
_splitpath(src, szDrive, szDir, szFName, szExt) ;
/* âpâXû╝é≡èiö[é╖éΘüB*/
strcpy(path, szDrive) ;
strcat(path, szDir) ;
/* âéâWâàü[âïû╝é≡èiö[é╖éΘüB*/
strcpy(name, szFName) ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint make_def_file(szDefFile, szModule) ; */
/* ï@ö\ü@üF.DEF âtâ@âCâïé≡ì∞ɼé╖éΘüB */
/* ôⁿù═ü@üFchar *szDefFile; .DEF âtâ@âCâïû╝ */
/* ü@ü@ü@üFchar *szModule ; âéâWâàü[âïû╝ */
/* Åoù═ü@üFé╚é╡ */
/* ò£ïAÆlüFâGâëü[âRü[âh */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static int make_def_file(char *szDefFile, char *szModule)
{
int fd ;
int len ;
char buffer[256] ;
/* .DEF âtâ@âCâïé≡èJé¡ */
fd = open(szDefFile, O_WRONLY | O_CREAT | O_EXCL, S_IREAD | S_IWRITE) ;
if (fd == -1) return ERROR ;
len = sprintf(buffer, "LIBRARY %s\n", szModule) ;
if (write(fd, buffer, len) != len) {
close(fd) ;
return ERROR ;
}
len = sprintf(buffer, "PROTMODE\n") ;
if (write(fd, buffer, len) != len) {
close(fd) ;
return ERROR ;
}
close(fd) ;
return NO_ERROR ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint link_obj(szObjName, szDefFile, szDllName) ; */
/* ï@ö\ü@üF.OBJ, .DEF âtâ@âCâïé≡âèâôâNé╡üA.DLL é≡É╢ɼé╖éΘüB */
/* ôⁿù═ü@üFchar *szObjName ; .OBJ âtâ@âCâïû╝ */
/* ü@ü@ü@üFchar *szDefFile ; .DEF âtâ@âCâïû╝ */
/* ü@ü@ü@üFchar *szDllName ; .DLL âtâ@âCâïû╝ */
/* Åoù═ü@üFé╚é╡ */
/* ò£ïAÆlüFâGâëü[âRü[âh */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static int link_obj(char *szObjName, char *szDefFile, char *szDllName)
{
static char lkcmd[] = "link386" ;
char buffer[_MAX_PATH * 2] ;
sprintf(buffer, "%s,%s,nul,,%s", szObjName, szDllName, szDefFile) ;
return spawnlp(P_WAIT, lkcmd, lkcmd, buffer, NULL) ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint make_dll(szRcName, szDllName) ; */
/* ï@ö\ü@üF.RC, .DLL âtâ@âCâïé≡îïìçé╡üAâèâ\ü[âXòté½é╠.DLL é≡É╢ɼé╖éΘüB */
/* ôⁿù═ü@üFchar *szRcName ; .RC âtâ@âCâïû╝ */
/* ü@ü@ü@üFchar *szDllName ; .DLL âtâ@âCâïû╝ */
/* Åoù═ü@üFé╚é╡ */
/* ò£ïAÆlüFâGâëü[âRü[âh */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static int make_dll(char *szRcName, char *szDllName)
{
static char rccmd[] = "rc" ;
return spawnlp(P_WAIT, rccmd, rccmd, szRcName, szDllName, NULL) ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint make_dll_main(szObjName, szPath, szModule) ; */
/* ï@ö\ü@üFì∞ɼé╖éΘécékéké╠âxü[âXâtâ@âCâïû╝é≡ĵô╛é╖éΘüB */
/* ôⁿù═ü@üFchar *szObjName ; écékékì∞ɼé╔Ägùpé╖éΘ.OBJâtâ@âCâïû╝ */
/* ü@ü@ü@üFchar *szPath ; âtâ@âCâïé≡ì∞ɼé╖éΘâpâX */
/* ü@ü@ü@üFchar *szModule ; âéâWâàü[âïû╝ */
/* Åoù═ü@üFé╚é╡ */
/* ò£ïAÆlüFâGâëü[âRü[âh */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
static int make_dll_main(char *szObjName, char *szPath, char *szModule)
{
int rc ;
char szTmpName[_MAX_PATH] ;
char szDllName[_MAX_PATH] ;
strcpy(szTmpName, szPath) ;
strcat(szTmpName, szModule) ;
strcpy(szDllName, szTmpName) ;
strcat(szTmpName, ".DEF") ;
strcat(szDllName, ".DLL") ;
/*--------------------------------------------------------------*/
/* .DEF âtâ@âCâïé≡ì∞ɼé╖éΘüB */
/*--------------------------------------------------------------*/
rc = make_def_file(szTmpName, szModule) ;
if (rc != NO_ERROR) return rc ;
/*--------------------------------------------------------------*/
/* .OBJ + .DEF -> .DLL é≡ì∞ɼé╖éΘüB */
/*--------------------------------------------------------------*/
rc = link_obj(szObjName, szTmpName, szDllName) ;
remove(szTmpName) ;
if (rc != NO_ERROR) return rc ;
/*--------------------------------------------------------------*/
/* .DLL + .RC -> .DLL é≡ì∞ɼé╖éΘüB */
/*--------------------------------------------------------------*/
strcpy(szTmpName, szPath) ;
strcat(szTmpName, szModule) ;
rc = make_dll(szTmpName, szDllName) ;
strcat(szTmpName, ".RES") ;
remove(szTmpName) ;
/*--------------------------------------------------------------*/
/* îïë╩é≡ò╘é╖üB */
/*--------------------------------------------------------------*/
return rc ;
}
/*----------------------------------------------------------------------*/
/* è╓Éöû╝üFint main(argc, argv) ; */
/* ï@ö\ü@üFSet Icon âüâCâô */
/* ôⁿù═ü@üFint argc ; âpâëâüü[â^Éö */
/* ü@ü@ü@üFchar *argv[] ; âpâëâüü[â^ */
/* Åoù═ü@üFé╚é╡ */
/* ò£ïAÆlüFTRUE ; É│ÅφÅIù╣ */
/* ü@ü@ü@üFFALSE ; ê┘ÅφÅIù╣ */
/*----------------------------------------------------------------------*/
/* ìXÉVùÜù≡ */
/* Ver.0.00 1997/10/11 */
/* üEÅëö┼ì∞ɼ */
/*----------------------------------------------------------------------*/
int main(int argc, char *argv[])
{
int rc ;
if (argc < 2) {
rc = Usage(argv[0]) ;
} else {
int rc ;
char szObjName[_MAX_PATH] ;
rc = make_obj(argv[0], szObjName) ;
if (rc != NO_ERROR) {
fprintf(stderr, "ERROR!:Can't make .obj file(%d)\n", rc) ;
}
else {
int i ;
for (i = 1 ; i < argc ; i++) {
char szPath[_MAX_PATH] ;
char szModule[_MAX_FNAME] ;
/* ì∞ɼé╖éΘécékéké╠âxü[âXâtâ@âCâïû╝é≡ĵô╛é╖éΘüB*/
get_base_name(argv[i], szPath, szModule) ;
/* écékéké≡ì∞ɼé╖éΘüB*/
rc = make_dll_main(szObjName, szPath, szModule) ;
if (rc != NO_ERROR) {
fprintf(stderr, "ERROR!:%s(%d)\n", argv[i], rc) ;
}
}
/* écékékì∞ɼé╔Ägùpé╡é╜âIâuâWâFâNâgâtâ@âCâïé≡ìφÅ£é╖éΘüB*/
remove(szObjName) ;
}
}
return rc ;
}