2012-03-21 122 views
2

是否可以將外部CLI/C++ DLL作爲嵌入式資源嵌入到MFC EXE中?我的應用程序當前連接到DLL坐在他身旁,它具有像連接到數據庫,從數據庫中提取信息等一些基本功能..在MFC C++ EXE中嵌入DLL?

我使用LoadLibrary來使用DLL功能。然後我用themida保護我的EXE,並將EXE和DLL打包在一起。問題是雖然打包DLL和EXE我必須禁用文件修補themida這是一個非常強大的功能。我必須禁用它,因爲當我打包我的EXE時,它需要稍微修改一下這個文件,然後themida認爲它已經被破解了或者不能讓應用程序工作。

那麼,有沒有一種方法來嵌入這個DLL到我的EXE?這個DLL與themida不兼容,這就是爲什麼它是一個單獨的文件。

回答

4

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; 

} 
+0

一旦我得到寫入作爲運行上面的代碼後,lpAddress指向的內存空間中的源DLL,如何使用lpAddress調用該方法我需要?我的app-dev頭在這裏需要一些幫助。 – rtischer8277 2016-02-24 22:30:47

1

你可以嘗試使用Enigma Virtual Box。這會將DLL打包成EXE,以便LoadLibrary「正常工作」。當然,如果它是一個C++/CLI DLL,那麼你仍然需要安裝.NET框架。