好的。所以我知道有很多关于如何在 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 有什么意义呢?
那么,我的问题是
是否可以直接从 .exe 内部使用 .dll,而不将其解压为文件? (我首选的方法)
如果 1.) 不可能,那么我如何至少修改代码以在检查文件存在之前写出该文件?
最佳答案
关于c++ - 在可执行文件中使用嵌入的 .dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17774103/