DlgResToDlgTemplate 的代码,提取EXE中的资源,然后转化成C的字符串数组
代码来源:https://www.codeproject.com/Articles/13330/Using-Dialog-Templates-to-create-an-InputBox-in-C
#include <windows.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("DlgResToDlgTemplate v1.0 (c) <lallousx86@yahoo.com>\n\n");
if (argc < 4)
{
printf("usage: %s MODULE_FILE DLG_ID FILE.H\n", argv[0]);
return -1;
}
int dlgID = atoi(argv[2]);
HMODULE hModule;
hModule = ::LoadLibraryEx(argv[1], 0, LOAD_LIBRARY_AS_DATAFILE);
if (hModule == NULL)
{
printf("Could not load module '%s'\n", argv[1]);
return -1;
}
HRSRC hrsrc = ::FindResource(hModule, (LPCTSTR) dlgID, RT_DIALOG);
if (hrsrc == NULL)
{
printf("Cannot find dialog resource with id '%d'\n", dlgID);
return -2;
}
HGLOBAL hglobalRsrc = ::LoadResource(hModule, hrsrc);
if (hglobalRsrc == NULL)
{
printf("Cannot load resource!\n");
return -3;
}
char *buf = (char *)::LockResource(hglobalRsrc);
if (buf == NULL)
{
printf("Cannot lock resource!\n");
return -4;
}
DWORD sz = ::SizeofResource(hModule, hrsrc);
FILE *fp = fopen(argv[3], "wb");
if (fp == NULL)
{
printf("Could not open '%s' for writing\n", argv[3]);
return -5;
}
char temp[100];
sprintf(temp, "static unsigned char dlg_%d[] = \n{\n\t", dlgID);
fwrite(temp, 1, strlen(temp), fp);
sz--;
for (DWORD i=0;i<=sz;i++)
{
sprintf(temp, "0x%02x", (unsigned char)(buf[i] & 0xFF));
fwrite(temp, 1, strlen(temp), fp);
// don't append a comma if it was last byte
if (i != sz)
{
fwrite(", ", 1, 1, fp);
}
if (i && (i % 16 == 0))
fwrite("\n\t", 1, 2, fp);
}
strcpy(temp, "\n};\n");
fwrite(temp, 1, strlen(temp), fp);
fclose(fp);
::FreeLibrary(hModule);
printf("generated %s (%d bytes) successfully!\n", argv[3], sz);
return 0;
}