2013-11-15 3 views
0

Мы пытаемся загрузить DLL-библиотеку из 64-разрядной библиотеки DLL с использованием функции LoadLibraryA. Он возвращает 126 error - mod не найден. Мы уверены, что путь к файлу dll, заданный функции, верен.Ошибка загрузки DLL с использованием LoadLibraryA

Мы попробовали dummy dll для тестирования, и он сработал, он загружен.

Мы также попытались добавить dll (которая является зависимостью первой DLL, которую мы хотим загрузить) в dummy dll. Он также работал. Таким образом, проблема не связана с DLL зависимостей, а с исходной dll, которую мы хотим загрузить в первую очередь.

Мы также попытались преобразовать dl в 64-разрядный, и попробовали это, все еще ничего хорошего.

Мы также проверили зависимости с помощью Walker Dependency. Все в порядке.

Операционная система, которую мы используем, - Windows 8, 64 бит. Если это имеет значение .. Есть ли у кого-нибудь идеи об этом поблеме?

EDIT: Мы также попробовали этот код:

hModule = LoadLibraryW(L"C:\\temp\\dllToLoad.dll"); 

и получил этот код ошибки:

"First-chance exception at 0x00000000 in C_Test_TSMPPKCS11.exe: 0xC0000005: Access violation at location 0x0000000000000000." 

EDIT 2: код, который мы использовали в первую очередь это:

hModule = LoadLibraryA((char*)aDLLFile); 

EDIT 3: Мы используем полный путь для загрузки dll. Для того чтобы проверить это, мы пытались этот код:

FILE *fp; 
    int size = 0; 
    fp=fopen("C:\\temp\\dllToLoad.dll", "r"); 
    size = fgetc(fp); 
    printf("size:%d\n",size); 
    fclose(fp); 

Там не было никаких проблем, мы получили размер файла, который 77.

+2

Если вы не получили здесь рабочего ответа, найдите «загрузочные снимки», которые являются механизмом для отладки этой проблемы. – RichieHindle

+2

(Незначительная точка: 'fgetc' получает байт из файла, он не получает размер. Не то, что это что-то меняет.) – RichieHindle

ответ

5

Мы также пытались преобразования дл до 64-бит, и попытался что, до сих пор ничего хорошего.

Невозможно загрузить 32-разрядную DLL как исполняемый код в 64-разрядный процесс (и поскольку вы используете LoadLibraryA(), это все, что вы можете пытаться сделать).

Предположим, что DLL, которую вы пытаетесь загрузить, и процесс, в который вы загружаете ее, являются одним и тем же типом, то передаете ли вы полный путь к LoadLibraryA() или относительный путь или просто имя dll? Если вы не используете полный путь, рассмотрите возможность использования LoadLibraryEx(), если это возможно, поскольку это дает вам больший контроль над используемым путем поиска. Если вы используете полный путь, попробуйте открыть файл, используя обычные файловые операции, если вы не загрузите dll, это работает? Если это работает, попробуйте LoadLibraryEX() с LOAD_LIBRARY_AS_DATAFILE и посмотрите, будет ли это загружать DLL как простой файл данных (что доказывает, что он находит файл).

Запустите Sysinternal's ProcMon и просмотрите код, открывая DLL, что может показать вам зависание сбоев DLL.

+0

Привет, мы используем полный путь для загрузки DLL-файла. Проверьте Edit 3. – lamostreta

+1

, а DLL - x64? –

+0

Это просто неправильное утверждение (первое предложение), учитывая формулировку. Вы можете * загрузить 32-битную DLL в 64-битный процесс и наоборот. Как вы справедливо указываете, что LOAD_LIBRARY_AS_DATAFILE может загружать DLL, чтобы использовать свои ресурсы или анализировать его или как вам нравится. – 0xC0000022L

Смежные вопросы