Использование встроенного DLL в исполняемом файле

Хорошо. Поэтому я знаю много вопросов о том, как встраивать dll внутри exes, но моя проблема совсем другая. (В частности, я использую библиотеку fmod для воспроизведения звуков в моей программе, и я внедряю fmod.dll, но это не относится к делу).

Я использую Visual C++ 2010 Ultimate. Я успешно вложил.dll внутри.exe. Файл my 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?

Итак, мои вопросы:

  1. Можно ли использовать.dll непосредственно из.exe, не распаковывая его как файл? (Мой предпочтительный метод)

  2. Если 1.) невозможно, то как я могу хотя бы изменить свой код для записи файла до его проверки?

1 ответ

Ну, решение было на удивление легко. Я просто последовал за предложением DyP по задержке загрузки DLL.

Я просто добавил одну вещь в свои свойства проекта, например:

и это все!

Мне это нравится, когда проблемы с программированием имеют простые решения. :)

licensed under cc by-sa 3.0 with attribution.