是否可以将外部的CLIC++ DLL作为嵌入式资源或类似的东西嵌入到MFC EXE中?我的应用程序目前连接到坐在它旁边的DLL,它有一些基本的功能,如连接到数据库,从DB中提取信息等。
我使用LoadLibrary来使用DLL功能。然后我用themida保护我的EXE,并将EXE和DLL打包在一起。但问题是,为了打包DLL和EXE,我必须在themida中禁用文件补丁,这是一个非常强大的功能。我之所以要禁用它,是因为当我打包EXE时,它需要修改一下文件,然后themida认为它已经被破解了什么的,不允许应用程序工作。
那么有没有办法把这个DLL嵌入到我的EXE中呢?很遗憾,这个DLL与themida不兼容,这也是为什么它是一个单独的文件。
1) 在可执行项目中添加一个资源脚本文件。
IDR_DLL_BIN BINARY MOVEABLE PURE "..\\debug\\myextern.dll"
2)使用资源编译器将RC文件编译成RES文件。
rc.exe /fo "Release/mydll.res" ".\mydll.rc"
如果你使用的是Visual Studio,它将建立RES文件,并将其与可执行文件绑定。
3) 从可执行文件中查找并加载资源。
bool ExtractResource(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szFilename)
{
bool bSuccess = false;
try
{
// Find and load the resource
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resourceID), _T(“BINARY”));
HGLOBAL hFileResource = LoadResource(hInstance, hResource);
// Open and map this to a disk file
LPVOID lpFile = LockResource(hFileResource);
DWORD dwSize = SizeofResource(hInstance, hResource);
// Open the file and filemap
HANDLE hFile = CreateFile(szFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);
LPVOID lpAddress = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);
// Write the file
CopyMemory(lpAddress, lpFile, dwSize);
// Un-map the file and close the handles
UnmapViewOfFile(lpAddress);
CloseHandle(hFileMap);
CloseHandle(hFile);
}
catch(…)
{
// Whatever
}
return bSuccess;
}
你可以尝试使用 Enigma虚拟盒. 这将把DLLs打包到一个EXE中,这样就可以让 LoadLibrary
"就能用"。当然,如果是C++CLI DLL,那么你还是需要安装.NET框架。