在MFC C++EXE中嵌入DLL

embed DLL in MFC C++ EXE?

本文关键字:DLL MFC C++EXE      更新时间:2023-10-16

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

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

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

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;
 }

您可以尝试使用Enigma虚拟盒子。这将把DLL打包到EXE中,以便LoadLibrary"正常工作"。当然,如果它是C++/CLI DLL,那么您仍然需要安装.NET框架。