わかった。したがって、exe 内に dll を埋め込む方法について多くの質問があることは知っていますが、私の問題はかなり異なります。(具体的には、プログラムでサウンドを再生するために fmod ライブラリを使用しており、fmod.dll を埋め込んでいますが、それは重要ではありません。)
Visual C++ 2010 Ultimate を使用しています。.dll を .exe 内に埋め込むことに成功しました。私の resources.h ファイルには含まれています
#define IDR_DLL1 144
私の.rcファイルには
IDR_DLL1 DLL MOVEABLE PURE "data\\fmod.dll"
コードに次の関数があります(別のstackoverflowの質問から完全に盗みました):
bool extractResource(const HINSTANCE hInstance, WORD resourceID, LPCTSTR szFilename)
{
bool bSuccess = false;
try
{
// Find and load the resource
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resourceID), L"DLL");
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);
bSuccess = true;
}
catch(...)
{
// Whatever
}
return bSuccess;
}
次に、WinMain 関数で最初に次のコードを呼び出します。
int WINAPI WinMain(HINSTANCE h1, HINSTANCE h2, LPSTR l, int a)
{
extractResource(h1, IDR_DLL1, L"fmod.dll");
/* etc */
}
できます。埋め込まれた fmod.dll の内容を正常に抽出し、同じディレクトリにファイルとして保存します...事前に fmod.dll が既に存在する場合のみ...。fmod.dll がまだそこにない場合は、次のようなポップアップ メッセージが表示されます。
The program can't start because fmod.dll is missing from your computer. Try reinstalling the program to fix this problem.
…つまり、既にある fmod.dll しか上書きできません。たとえば、代わりにコードを次のように変更した場合
extractResource(h1, IDR_DLL1, L"fmod2.dll");
fmod2.dll というタイトルの、まったく同じ内容のまったく同じファイルが書き出されます。その時点で、元の fmod.dll を取り除き、新しく作成した fmod2.dll の名前を fmod.dll に変更すると、機能します。
明らかに、問題は、プログラムのエントリポイントに到達する前に、fmod.dll の存在を探すことです。fmod を実際に使用する必要がある前に、私のプログラムはコードを実行することさえできません。これは... 非常に不公平です。それでは、dllを埋め込むことができるということのポイントは何ですか?
それでは、私の質問は
ファイルとして解凍せずに、.exe 内から直接 .dll を使用することは可能ですか? (私のおすすめの方法)
1.) が不可能な場合、ファイルの存在を確認する前にファイルを書き出すようにコードを変更するにはどうすればよいでしょうか?