c++ - 在 VC++ 2008 中嵌入/加载 DLL 作为资源?

标签 c++ visual-c++ embedded-resource

正如主题的描述/标题所说,这是否有可能,因为我一直在谷歌和其他来源上搜索,但没有任何运气,我来这里问这个问题......

是否可以将 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;
}

提前感谢您提供的所有帮助。

最佳答案

它与 Windows 处理 PE32 文件格式的可执行代码的方式根本不兼容。它必须存在于一个文件中,Windows 会创建一个内存映射文件以将其映射到内存中。尝试将其从资源加载到内存中,需要您接管 Windows 加载程序的所有职责。其中包括如果代码无法位于预期的基地址,则重新定位代码、查找并加载所有依赖的 DLL 并调用它们的 DllMain() 方法。

特别是 DLL_THREAD_ATTACH 和 DETACH 通知几乎不可能自己实现,因为您无法控制创建的每个线程。很难做对,而且没有一个 winapi 可以帮助您做到这一点。这是不值得的。与仅将 DLL 代码链接到您的 EXE 镜像相比,肯定没有竞争力。

关于c++ - 在 VC++ 2008 中嵌入/加载 DLL 作为资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10566417/

相关文章:

java - 如何使用 GridLayout 将 JPanel 数组添加到 JPanel?

windows - Vista 如何为与我的应用程序关联的文档生成图标?

C++:如何并排打印两张ASCII图片?

不同编译器中的 C++ 标准库实现

c++ - 如何调试我的 C++ BMI 计算器程序?

java - 在 Netbeans 外部运行 jar 文件时无法访问图像文件

c++ - 如何将多个源文件转换为一个 .a 文件

c++ - 我的与 COM 相关的代码有什么问题?

visual-c++ - 遵循教程的 Opengl 访问冲突

windows - #defining WIN32_LEAN_AND_MEAN 到底排除了什么?