embed DLL in MFC C++ EXE?

Landin Martens picture Landin Martens · Mar 21, 2012 · Viewed 8.3k times · Source

Is it possible to embed an external CLI/C++ DLL into a MFC EXE as a embedded resource or something like that? My application currently connects to DLL sitting right beside it that has some basic functions like connect to database, pull information from DB, etc..

I use LoadLibrary to use the DLL functions. Then I secure my EXE with themida and pack the EXE and DLL together. The problem is though to pack the DLL and EXE I have to disable file patching in themida which is a very strong feature. I have to disable it because when I pack my EXE it needs to modify the file a bit, and then themida thinks it has been cracked or something and does not allow the application to work.

So is there a way to embed this DLL into my EXE? The DLL is not compatible with themida sadly which is why it is a separate file.

Answer

Flot2011 picture Flot2011 · Mar 21, 2012

1) Add a Resource Script file in the executable project.

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

2) Compile RC file to RES file using the Resource Compiler:

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

If you are using Visual Studio, it will build the RES file and will also bind it with executable.

3) Find and load the resource from the executable:

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;

 }