正如主题的描述/标题所说,这是一种可能性,因为我一直在谷歌和其他来源上搜索,没有任何运气我来这里问这个问题......
是否可以将DLL
作为资源嵌入到我的最终可执行文件中然后调用它/如果它是当前目录和/或系统目录中的外部文件?
我已经尝试了许多没有运气的事情,许多解决方案都没有那么好用,我似乎将DLL
嵌入了我的.rc
文件,但是我很震惊尝试调用它的问题,也许它需要保存到磁盘上的物理文件中,我不确定。
[编辑]
以下是我实施的代码,但仍未取得任何成功;我仍面对The program can't start because soandso.dll is missing from your computer.
以下代码, - /
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
HRSRC hRes = FindResource( hInstance, MAKEINTRESOURCE("#101"), "IDR_DLLRESOURCE_101" );
HGLOBAL hData = LoadResource( hInstance, hRes );
LPVOID lpFile = LockResource( hData );
DWORD dwSize = SizeofResource( hInstance, hRes );
HANDLE hFile = CreateFile("soandso.dll", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
HANDLE hFilemap = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, dwSize, 0);
LPVOID lpBaseAddr = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);
CopyMemory(lpBaseAddr, lpFile, dwSize);
UnmapViewOfFile(lpBaseAddr);
CloseHandle(hFilemap);
CloseHandle(hFile);
return 0;
}
提前感谢您提供的任何和所有帮助。
答案 0 :(得分:2)
它与Windows处理PE32文件格式的可执行代码的方式根本不兼容。 必须存在于文件中,Windows会创建一个内存映射文件以将其映射到内存中。尝试将资源从资源加载到内存中需要您接管Windows加载程序的所有职责。其中包括重新定位代码,如果它不能位于预期的基址,找到并加载所有相关的DLL并调用它们的DllMain()方法。
特别是DLL_THREAD_ATTACH和DETACH通知几乎不可能自己实现,因为您无法控制每个创建的线程。很难做对,没有一个winapi可以帮助你做到这一点。这是不值得的。只需将DLL的代码链接到您的EXE图像中,肯定没有竞争力。
答案 1 :(得分:1)
加载DLL的唯一受支持的方法是从文件。因此,当您需要加载此DLL时,请提取资源,将其保存到文件中(例如,在临时目录中),然后调用LoadLibrary
和GetProcAddress
链接到库。