【问题标题】:embed DLL in MFC C++ EXE?在 MFC C++ EXE 中嵌入 DLL?
【发布时间】:2012-03-21 16:09:10
【问题描述】:

是否可以将外部 CLI/C++ DLL 作为嵌入式资源或类似的东西嵌入到 MFC EXE 中?我的应用程序当前连接到它旁边的 DLL,它具有一些基本功能,例如连接到数据库、从数据库中提取信息等。

我使用 LoadLibrary 来使用 DLL 函数。然后我用themida保护我的EXE并将EXE和DLL打包在一起。问题是虽然要打包 DLL 和 EXE,但我必须在 themida 中禁用文件修补,这是一个非常强大的功能。我必须禁用它,因为当我打包我的EXE时,它需要稍微修改文件,然后themida认为它已被破解或其他东西并且不允许应用程序工作。

那么有没有办法将此 DLL 嵌入到我的 EXE 中?遗憾的是,DLL 与 themida 不兼容,这就是为什么它是一个单独的文件。

【问题讨论】:

    标签: c++ mfc external command-line-interface loadlibrary


    【解决方案1】:

    1) 在可执行项目中添加资源脚本文件。

    IDR_DLL_BIN        BINARY  MOVEABLE PURE   "..\\debug\\myextern.dll"
    

    2) 使用资源编译器将 RC 文件编译为 RES 文件:

    rc.exe /fo "Release/mydll.res" ".\mydll.rc"
    

    如果您使用的是 Visual Studio,它将构建 RES 文件并将其与可执行文件绑定。

    3) 从可执行文件中查找并加载资源:

    bool ExtractResource(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szFilename)
    {
      bool bSuccess = false; 
      try
      {
          // Find and load the resource
          HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resourceID), _T(“BINARY”));
          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);
       }
       catch(…)
       {
            // Whatever
       } 
       return bSuccess;
    
     }
    

    【讨论】:

    • 运行上述代码后,将源DLL写入lpAddress指向的内存空间后,如何使用lpAddress调用我需要的方法?我的应用开发主管在这里需要一些帮助。
    • @rti 二进制资源不会被复制到lpAddress 的内存中。自从应用程序开始执行之前,它就已经映射到那里了。代码所做的是将资源写入磁盘。之后要访问该功能,您需要调用LoadLibraryGetProcAddress。这通常称为“运行时动态链接”,以及well documented
    【解决方案2】:

    您可以尝试使用Enigma Virtual Box。这会将 DLL 打包到一个 EXE 中,以便 LoadLibrary“正常工作”。当然,如果它是 C++/CLI DLL,那么您仍然需要安装 .NET 框架。

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多