[英]The LoadLibraryA method returns error code 1114 (ERROR_DLL_INIT_FAILED) after more than 1000 cycles of loading/unloading
[英]dll loading error using LoadLibraryA
我們正在嘗試使用LoadLibraryA函數從64位dll內部加載dll庫。 它返回126錯誤-找不到mod。 我們確定賦予該函數的dll文件路徑正確。
我們已經嘗試了一個虛擬dll進行測試,並且該dll可以正常工作,並且已加載。
我們還嘗試將dll(這是我們要加載的第一個dll的依賴項)添加到虛擬dll。 它也起作用。 因此,問題似乎與依賴項dll無關,而與我們首先要加載的原始dll有關。
我們還嘗試將dl轉換為64位,並嘗試這樣做,仍然沒有好處。
我們還使用Dependency Walker檢查了依賴性。 一切都好。
我們使用的操作系統是Windows 8、64位。 如果有什么不同。.有人對這個問題有任何想法嗎?
編輯:我們也嘗試了此代碼:
hModule = LoadLibraryW(L"C:\\temp\\dllToLoad.dll");
並收到以下錯誤代碼:
"First-chance exception at 0x00000000 in C_Test_TSMPPKCS11.exe: 0xC0000005: Access violation at location 0x0000000000000000."
編輯2:我們首先使用的代碼是:
hModule = LoadLibraryA((char*)aDLLFile);
編輯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。
我們還嘗試將dl轉換為64位,並嘗試這樣做,仍然沒有好處。
您無法將32位dll作為可執行代碼加載到64位進程中(並且由於要使用LoadLibraryA(),因此您可以嘗試這樣做)。
假設您要加載的dll與要加載的進程是同一類型,那么您是將完整路徑傳遞給LoadLibraryA()還是相對路徑,或者僅傳遞dll名稱? 如果您沒有使用完整的路徑,那么請考慮使用LoadLibraryEx(),因為這樣可以使您對使用的搜索路徑有更多的控制。 如果您使用的是完整路徑,如果無法加載dll,請嘗試使用常規文件操作打開文件,這行得通嗎? 如果可行,請嘗試使用帶有LOAD_LIBRARY_AS_DATAFILE的LoadLibraryEX(),看看是否會將dll作為簡單數據文件加載(證明它正在查找文件)。
運行Sysinternal的ProcMon並觀看代碼打開DLL,這可能會顯示相關的DLL加載失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.