c++ - 在可执行文件中使用嵌入的 .dll

标签 c++ visual-c++ dll fmod

好的。所以我知道有很多关于如何在 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.) 不可能,那么我如何至少修改代码以在检查文件存在之前写出该文件?

最佳答案

嗯,解决方案非常简单。我刚刚关注了DyP's suggestion关于延迟加载 dll。

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

就是这样!

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

关于c++ - 在可执行文件中使用嵌入的 .dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17774103/

相关文章:

c++ - 传入一个递增 boost::fusion:vector 元素的函数

c++ - 可以给g_time_out add一个类的成员函数吗?

c++ - 这会导致内存泄漏,从函数返回数组吗?

c++ - 使自定义 Directshow 过滤器接受参数

c++ - 将 svg 转换为图像的库?

visual-c++ - 在 Visual C++ 中,内联静态变量是否跨模块唯一?

c++ - 为什么允许内联函数操作私有(private)成员变量?

c++ - 如何避免在 std::modf 中使用临时变量?

c++ - 将 TLB 文件提交到存储库

python-3.x - 如何使用 Python 以编程方式包装 C++ dll