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

Хорошо. Так что я знаю, что есть много вопросов о том, как встроить dll в exe, но моя проблема довольно другая. (В частности, я использую библиотеку 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?

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

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

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

1

Решение

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

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

и это было все!

Мне нравится, когда у задач программирования есть простые решения. 🙂

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]