2012-03-21 3 views
2

외부 CLI/C++ DLL을 임베디드 리소스 또는 이와 비슷한 것으로 MFC EXE에 임베드 할 수 있습니까? 내 응용 프로그램은 현재 DLL 바로 옆에 앉아 데이터베이스에 연결, DB 등에서 정보를 가져 오는 것과 같은 몇 가지 기본 기능을 가지고 있습니다.MFC C++ EXE에 DLL을 포함 시키시겠습니까?

DLL 함수를 사용하려면 LoadLibrary를 사용합니다. 그렇다면 나는 themida로 내 EXE를 보호하고 EXE와 DLL을 함께 포장한다. 문제는 DLL과 EXE를 압축하는 것입니다. 매우 강력한 기능인 themida에서 파일 패치를 비활성화해야합니다. EXE 파일을 압축 할 때 파일을 약간 수정해야하기 때문에 themida는 파일에 금이 갔거나 응용 프로그램이 작동하지 않는다고 생각하기 때문에 파일을 비활성화해야합니다.

그래서이 DLL을 내 EXE에 삽입하는 방법이 있습니까? DLL은 슬프게도 themida와 호환되지 않기 때문에 별도의 파일입니다.

답변

4

1) 실행 파일 프로젝트에 리소스 스크립트 파일을 추가하십시오. 리소스 컴파일러를 사용하여 RES 파일에

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

2) 컴파일 RC 파일 : Visual Studio를 사용하는 경우

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

, 그것은 RES 파일을 작성하고 또한 실행에 바인딩됩니다.

3) 찾기 및 실행에서 리소스를로드 : 나는 위의 코드를 실행 한 후에 포인트를 lpAddress 메모리 공간에 기록 원본 DLL을 일단

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를 사용합니까 나는 필요하다? 내 app-dev 헤드에 도움이 필요하다. – rtischer8277

1

Enigma Virtual Box을 사용해보세요. DLL을 EXE에 넣으므로 LoadLibrary이 "그냥 작동합니다". 물론, C++/CLI DLL이라면 여전히 .NET Framework가 설치되어 있어야합니다.

관련 문제