2

好的。所以我知道有很多关于如何在 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有什么意义呢?

那么,我的问题是

  1. 是否可以直接从 .exe 内部使用 .dll,而无需将其解压缩为文件?(我的首选方法)

  2. 如果 1.) 是不可能的,那么我如何至少修改我的代码以在检查文件存在之前写出文件?

4

1 回答 1

5

好吧,解决方案非常简单。我只是遵循DyP关于延迟加载 dll 的建议。

我只是在我的项目属性中添加了一件事,如下所示:

就是这样!

当编程问题有简单的解决方案时,我喜欢它。:)

于 2013-07-21T21:03:20.060 回答