встроить DLL в MFC C ++ EXE? - PullRequest
3 голосов
/ 21 марта 2012

Можно ли встроить внешнюю DLL CLI / C ++ в MFC EXE как встроенный ресурс или что-то в этом роде?В настоящее время мое приложение подключается к библиотеке DLL, которая находится рядом с ней, и имеет некоторые основные функции, такие как подключение к базе данных, получение информации из базы данных и т. Д.

Я использую LoadLibrary для использования функций DLL.Затем я защищаю свой EXE с помощью имиды и упаковываю вместе EXE и DLL.Однако проблема заключается в том, чтобы упаковать DLL и EXE, я должен отключить исправление файлов в них, что является очень сильной функцией.Я должен отключить его, потому что когда я упаковываю свой EXE, ему нужно немного изменить файл, а затем они считают, что он был взломан или что-то в этом роде, и не позволяют приложению работать.

Так что есть способвстроить эту DLL в мой EXE?К сожалению, DLL не совместима с ними, поэтому это отдельный файл.

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

1) Добавьте файл сценария ресурса в исполняемый проект.

IDR_DLL_BIN        BINARY  MOVEABLE PURE   “..\\debug\\myextern.dll”

2) Скомпилируйте RC-файл в RES-файл, используя Resource Compiler:

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;

 }
1 голос
/ 21 марта 2012

Вы можете попробовать использовать Enigma Virtual Box . Это упакует DLL в EXE, так что LoadLibrary «просто работает». Конечно, если это C ++ / CLI DLL, то вам все равно понадобится .NET Framework.

...