2012-03-21 2 views
2

Est-il possible d'incorporer une DLL CLI/C++ externe dans un fichier EXE MFC en tant que ressource incorporée ou quelque chose comme ça? Mon application se connecte actuellement à DLL assis juste à côté qui a quelques fonctions de base comme se connecter à la base de données, tirer des informations de DB, etc.embed DLL dans MFC C++ EXE?

J'utilise LoadLibrary pour utiliser les fonctions DLL. Ensuite, je sécuriser mon EXE avec themida et emballer le fichier EXE et DLL ensemble. Le problème est cependant d'emballer la DLL et EXE, je dois désactiver le patch de fichiers dans themida qui est une fonctionnalité très forte. Je dois le désactiver parce que quand je compile mon EXE il doit modifier le fichier un peu, et themida pense qu'il a été craqué ou quelque chose et ne permet pas à l'application de fonctionner.

Y a-t-il un moyen d'intégrer cette DLL dans mon EXE? La DLL n'est malheureusement pas compatible avec themida, c'est pourquoi c'est un fichier séparé.

Répondre

4

1) Ajouter un fichier de script de ressources dans le projet exécutable.

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

2) Compiler fichier RC dans le fichier RES en utilisant le compilateur de ressources:

rc.exe /fo ”Release/mydll.res” “.\mydll.rc” 

Si vous utilisez Visual Studio, il construira le fichier RES et aussi avec lier exécutable.

3) Trouvez et charger la ressource de l'exécutable:

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

Une fois que je reçois la DLL source écrite dans l'espace mémoire qui lpAddress points après l'exécution du code ci-dessus, comment ne pas utiliser lpAddress pour appeler la méthode J'ai besoin? Ma tête d'app-dev a besoin d'aide ici. – rtischer8277

1

Vous pouvez essayer d'utiliser Enigma Virtual Box. Cela va emballer les DLL dans un EXE de sorte que LoadLibrary "fonctionne". Bien sûr, s'il s'agit d'une DLL C++/CLI, le framework .NET doit toujours être installé.