目的:(1)使用exe自己资源文件来创建支撑的dll文件或者配置文件,这样可以在开发绿色软件的时候只需要拷贝一个exe可执行文件就可以独立运行。
(2)防止误删配套文件导致exe应用无法执行。
(3)生成预置配置文件方便使用。
思路:把库文件导入到资源文件,在程序运行时检查是否存在,否则生成,做到一个exe文件就可以独立运行。
第一步:建立一个MFC Dialog based 静态链接库(静态库不依赖其他库)MFC应用
第二步:导入资源文件
第三步:编写代码,在构造函数加入代码
CRc2fileApp::CRc2fileApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
HINSTANCE hInst = (HINSTANCE)GetModuleHandle(0);
HRSRC hResource = FindResource(hInst, MAKEINTRESOURCE(IDR_DLL1), _T("DLL"));
if (hResource == NULL) {
MessageBox(NULL, _T("Cannot find resource"), _T("Error"), MB_OK | MB_ICONERROR);
return;
}
DWORD dwSize = SizeofResource(hInst, hResource);
HGLOBAL hGlobal = LoadResource(hInst, hResource);
if (hGlobal == NULL) {
MessageBox(NULL, _T("Cannot load resource"), _T("Error"), MB_OK | MB_ICONERROR);
return;
}
LPSTR lpDllBin = (LPSTR)LockResource(hGlobal);
if (lpDllBin == NULL) {
MessageBox(NULL, _T("Cannot lock resource"), _T("Error"), MB_OK | MB_ICONERROR);
return;
}
// 可以将数据写入文件
FILE *fp = fopen("sqlite3.dll", "wb");
if (fp == NULL) {
MessageBox(NULL, _T("Cannot open file"), _T("Error"), MB_OK | MB_ICONERROR);
return;
}
fwrite(lpDllBin, dwSize, 1, fp);
fclose(fp);
FreeResource(hGlobal);
return;
}
结果:
完整代码上传到资源,欢迎下载。