1. 程式人生 > >LoadLibrary(Ex)失敗,GetLastError返回127 (找不到指定的程式)

LoadLibrary(Ex)失敗,GetLastError返回127 (找不到指定的程式)

    除錯程式時遇到一個很怪對問題:一個很簡單的win32 dll,就一個DllMain,裡面就幾行程式碼在Process Attach時呼叫API函式獲取登錄檔的指定鍵值 ,很簡單。但偏偏出了問題。問題還很怪異:另外一個程式LoadLibrary載入這個dll時返回NULL,GetLastError返回127(“ 找不到指定的程式”)。呵呵,這個錯誤就是怪異之處,非常難理解(其實我到現在也沒有理解什麼叫“指定到程式”)。去掉DllMain裡面到那幾行程式碼,只留下空函式,再編譯就OK,加上那幾行API就無法LoadLibrary。
 
    按理說,就算API呼叫失敗,也不應該影響dll本身的載入吧??dll載入失敗一般發生再DllMain返回FALSE,或dll本身結構出現錯誤。這兩點在我的這個程式裡面應該都不存在:我的DllMain明明返回了TRUE(其實dll根本就沒有載入,DllMain也沒有執行),這個dll是VS2005剛剛編譯出來的,其結構不大可能被破壞。

    後來使用來排除法確定是呼叫了RegGetValue到緣故。

    仔細檢視MSDN,這個函式“Requires Windows Vista or Windows XP Professional x64 Edition”而我用的是32位版本的Windows XP Pro,是個問題。不過很難理解。就算我呼叫了一個不被支援的API函式,頂多在這個函式被執行是給我throw一下(或返回FALSE之類的),可我遇到的情況是在這個函式被執行之前就出了問題,好像由於使用了這個函式,導致編譯器在編譯dll時做了什麼事情似的!!實在無法理解了。還有LoadLibrary失敗後的LastError資訊更是誤導!