好的。所以我知道有很多关于如何在exe文件中嵌入dll的问题,但我的问题却大不相同。 (具体来说,我正在使用fmod库在程序中播放声音,并且正在嵌入fmod.dll,但这并不重要。)
我正在使用Visual C++ 2010 Ultimate。我已成功将.dll嵌入.exe中。我的resources.h文件包含
#define IDR_DLL1 144
而我的.rc文件包含
IDR_DLL1 DLL MOVEABLE PURE "data\\fmod.dll"
我的代码中有以下功能(完全从另一个stackoverflow问题中偷走了):
bool extractResource(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szFilename)
{
bool bSuccess = false;
try
{
// Find and load the resource
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resourceID), L"DLL");
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);
bSuccess = true;
}
catch(...)
{
// Whatever
}
return bSuccess;
}
然后,在WinMain函数中首先调用以下代码:
int WINAPI WinMain(HINSTANCE h1, HINSTANCE h2, LPSTR l, int a)
{
extractResource(h1, IDR_DLL1, L"fmod.dll");
/* etc */
}
有用。它成功地提取出嵌入式fmod.dll的内容,并将其另存为文件在同一目录中……仅……当事先已经有fmod.dll时。如果还没有fmod.dll,我会收到一条弹出消息,内容为
The program can't start because fmod.dll is missing from your computer. Try reinstalling the program to fix this problem.
...换句话说,我只能覆盖已经存在的fmod.dll。例如,如果我改为将代码更改为
extractResource(h1, IDR_DLL1, L"fmod2.dll");
它将写出完全相同的文件,其内容完全相同,名为fmod2.dll。到那时,我可以摆脱原始的fmod.dll,并将新创建的fmod2.dll重命名为fmod.dll,它将起作用。
显然,问题在于它寻找fmod.dll的存在,甚至没有达到程序的入口点。在实际使用任何fmod东西之前,我的程序甚至无法执行任何代码。这似乎……非常不公平。那么什至可以嵌入dll有什么意义呢?
那我的问题是
最佳答案
好吧,该解决方案非常简单。我只是按照DyP's suggestion延迟加载dll。
我只是在项目属性中添加了一件事,就像这样:
就是这样!
当编程问题有简单的解决方案时,我会喜欢它。 :)
关于c++ - 在可执行文件中使用嵌入式.dll,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17774103/