0

トピックの説明/タイトルが示すように、Google やその他の情報源を検索していて、運が悪くて質問をするためにここに来たので、これは可能性があります...

をリソースとして最終的な実行可能ファイルに埋め込みDLL、現在のディレクトリやシステム ディレクトリ内の外部ファイルであるかのように呼び出すことはできますか?

運が悪かったので、多くのことを試しましたが、多くの解決策がうまく機能していません。ファイルに埋め込んだように見え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;
}

提供されたすべてのヘルプに事前に感謝します。

4

2 に答える 2

3

これは、Windows が PE32 ファイル形式で実行可能コードを処理する方法とは根本的に互換性がありません。ファイルに存在する必要があります。Windows は、メモリにマップするためにメモリ マップト ファイルを作成します。リソースからメモリにロードするようなことを試みるには、Windows ローダーのすべての作業を引き継ぐ必要があります。これには、予想されるベース アドレスに配置できない場合のコードの再配置、すべての依存 DLL の検索とロード、およびそれらの DllMain() メソッドの呼び出しが含まれます。

Particularly the DLL_THREAD_ATTACH and DETACH notifications are next to impossible to implement yourself since you can't control every thread that gets created. Very hard to do right and there's not a single winapi that will help you doing this. It is not worth it. And most certainly not competitive with just linking the DLL's code into your EXE image.

于 2012-05-12T19:58:34.710 に答える
2

DLL をロードする唯一のサポートされている方法は、ファイルからです。したがって、この DLL をロードする必要がある場合は、リソースを抽出し、それをファイルに保存して (一時ディレクトリなどに)、 and を呼び出しLoadLibraryGetProcAddressライブラリにリンクします。

于 2012-05-12T19:40:38.557 に答える