2012-05-12 25 views
0

正如該主題的描述/標題所說,這是一種可能性,因爲我一直在谷歌和其他來源尋找,沒有任何運氣我來這裏問這個問題...在VC++ 2008中嵌入/加載DLL作爲資源?

它是在所有可能的將DLL作爲一個資源嵌入到我的最終可執行文件中,然後調用它/ as-如果它是當前目錄和/或系統目錄中的外部文件?

我已經嘗試過很多東西沒有運氣,一些解決方案的效果並不好,我似乎已經將DLL與我的.rc文件一起嵌入了,但是我遇到了試圖調用的問題它,也許它需要被保存到磁盤上的物理文件中,我不確定。

[編輯]

下面是我目前已經實現的代碼,仍然沒有任何成功;我還面臨着以下The program can't start because soandso.dll is missing from your computer.

代碼, -/

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    HRSRC hRes = FindResource(hInstance, MAKEINTRESOURCE("#101"), "IDR_DLLRESOURCE_101"); 
    HGLOBAL hData = LoadResource(hInstance, hRes); 
    LPVOID lpFile = LockResource(hData); 
    DWORD dwSize = SizeofResource(hInstance, hRes); 

    HANDLE hFile = CreateFile("soandso.dll", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
    HANDLE hFilemap = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, dwSize, 0); 
    LPVOID lpBaseAddr = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0); 

    CopyMemory(lpBaseAddr, lpFile, dwSize); 
    UnmapViewOfFile(lpBaseAddr); 
    CloseHandle(hFilemap); 
    CloseHandle(hFile); 
    return 0; 
} 

預先感謝您的任何和所有幫助提供。

+0

谷歌的「反射DLL注入」,你會發現你的問題的答案。 –

回答

1

加載DLL的唯一受支持方式來自文件。因此,當您需要加載此DLL時,請提取資源並將其保存到文件中(例如在臨時目錄中),然後撥打LoadLibraryGetProcAddress以鏈接到庫。

+0

唯一「官方支持」的方式就是這麼說。然而,還有其他方法可以做到這一點。例如:反射式DLL注入。 –

2

它基本上與Windows對待PE32文件格式的可執行代碼的方式不兼容。它必須必須存在於一個文件中,Windows創建一個內存映射文件將其映射到內存中。嘗試將資源從資源加載到內存中需要您接管Windows加載程序的所有職責。其中包括重定位代碼,如果它不能位於預期的基地址,找到並加載所有依賴的DLL並調用它們的DllMain()方法。

特別是DLL_THREAD_ATTACH和DETACH通知幾乎不可能實現,因爲您無法控制每個創建的線程。很難做到這一點,並沒有一個winapi可以幫助你做到這一點。這是不值得的。當然,將DLL的代碼鏈接到EXE映像中並不具有競爭性。