其他分享
首页 > 其他分享> > c – 在可执行文件中使用嵌入的.dll

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

作者:互联网

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

解决方法:

嗯,解决方案非常简单.我只是在延迟加载dll时遵循DyP’s suggestion.

我刚在项目属性中添加了一个东西,如下所示:

就是这样!

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

标签:c,visual-c,dll,fmod
来源: https://codeday.me/bug/20191001/1839873.html