loadlibrary 找不到指定的程序(loadlibrary failed with error 126-找不到指定模塊)

發(fā)布時間:2023-08-11
本文為大家介紹loadlibrary 找不到指定的程序(loadlibrary failed with error 126:找不到指定模塊),下面和小編一起看看詳細內(nèi)容吧。
部分用戶在編寫和調(diào)用dll文件時出錯,收到提示loadlibrary failed witherror126: the specified module could not be found。這是怎么回事?為什么會這樣?讓我們來看看詳細的分析和解決方案。
一、loadlibrary失敗的原因
通常,loadlibrary 失敗的原因是代碼編寫不規(guī)范。寫一個dll文件一般不難,關(guān)鍵是寫dll的時候代碼不規(guī)范,所以調(diào)用的時候可能會出現(xiàn)這種問題,loadlibrary失敗。難怪,為了確保您使用正確的調(diào)用約定,告訴編譯器使用stdcall 約定和/或使用windows.h(和相關(guān)文件)中定義的常量,例如winapi 等。通常dll 的代碼是如下:
01 word winapi vbshiftright(word nvalue,word nbits)
03 返回(nvalue nbits);
復(fù)制代碼
word winapi vbshiftright(word nvalue, word nbits) { return (nvalue nbits);}
下一步與您在microsoft 文檔中閱讀的內(nèi)容相反。您需要創(chuàng)建一個def 文件。這是唯一可以防止輸出不帶亂碼的函數(shù)名(如_vbshiftright@1)的方法。 def文件的格式如下:
01出口
02vb右移
復(fù)制代碼
導(dǎo)出vbshiftright
下一步是在vb 中調(diào)用此函數(shù),使用以下聲明:
01 聲明函數(shù)vbshiftright lib mydll.dll (byval nvalue as integer,
02 byval nbits 作為整數(shù))
03 作為整數(shù)
04 子測試()
05 將我調(diào)暗為整數(shù)
06 我=vbshiftright(4, 2)
07調(diào)試。斷言i=1
08 結(jié)束子
復(fù)制代碼
聲明函數(shù)vbshiftright lib mydll.dll (byval nvalue as integer, byvalnbits as integer) as integer sub test() dim i as integer i=vbshiftright(4,2) debug.assert i=1 end sub
如果您還希望更簡單的方法從vb 調(diào)用,您可以創(chuàng)建一個類型庫。為此,您需要創(chuàng)建和編譯odl(對象描述語言)文件。該文件應(yīng)包含以下內(nèi)容:
01 模塊mymodule {
03 helpstring(將整數(shù)的位右移。),
04條目(vbshiftright)
06 short _stdcall vbshiftright([in] short nvalue, [in] short nbits);
07};
復(fù)制代碼
module mymodule { [ helpstring( 將整數(shù)的位向右移動。 ),entry( vbshiftright ) ] short _stdcall vbshiftright([in] short nvalue, [in] short nbits); };
當vb 加載dll 的類型庫時,函數(shù)名和參數(shù)將出現(xiàn)在vb 的對象瀏覽器中。此外,如果用戶沒有輸入正確的參數(shù)類型,vb 可能會產(chǎn)生loadlibrary 失敗錯誤。
另外,你最好使用正確的方法調(diào)用dll,下面是我通常調(diào)用dll的函數(shù):
01 typedef void __declspec(dllimport) startqueryform(tdispatchconnection,tapplication);
02 startqueryform*查詢;
03 字符緩沖區(qū)[256];
04 如果(!getsystemdirectory(buf,256)){
05application- messagebox(讀取系統(tǒng)目錄錯誤,error, mb_ok+mb_iconerror);
06 返回;
08 ansistring scmd=ansistring(buf)+ \\queryenh.dll 文件
復(fù)制代碼
typedefvoid __declspec(dllimport)startqueryform(tdispatchconnection,tapplication); startqueryform* 查詢;char buf[256]; if (!getsystemdirectory(buf,256)) {application- messagebox(讀取系統(tǒng)目錄錯誤,error, mb_ok+mb_iconerror);返回; }ansistring scmd=ansistring(buf)+ \\queryenh.dll
01 hinstance 包=loadlibrary(scmd.c_str());
02 如果(包)
04 試試{
05 查詢=(startqueryform *)getprocaddress((hinstance)package, _startqueryform
06 如果(查詢){
07 tdispatchconnection* conn=(mainform-connectionway==1 ?
08(tdispatchconnection*)mainform-dcomconnect:
09(tdispatchconnection*)mainform-sockconnect);
10查詢(連接,應(yīng)用程序);
12 其他{
13 ansistring str=函數(shù)加載失敗,失敗原因:\r
14str+=syserrormessage(getlasterror());
15application- messagebox(str.c_str(), error ,mb_ok+mb_iconerror);
18 __終于{
19freelibrary(包);
22其他
24 ansistring str=加載庫失敗,失敗原因:\r
25str+=syserrormessage(getlasterror());
26application-messagebox(str.c_str(),mb_ok+mb_iconerror);
復(fù)制代碼
hinstance package=loadlibrary(scmd.c_str()); if (package) { try { query=(startqueryform)getprocaddress((hinstance)package, _startqueryform if(query) { tdispatchconnection conn=(mainform- connectionway==1 ?(tdispatchconnection)mainform- dcomconnect:(tdispatchconnection)mainform- sockconnect); query(conn,application); } else{ ansistring str=加載函數(shù)失敗,失敗原因:\r str+=syserrormessage(getlasterror());application-messagebox(str.c_str(), error,mb_ok+mb_iconerror); } } __finally {freelibrary(package); } } else { ansistring str=加載庫失敗,失敗原因:\r str+=syserrormessage(getlasterror());application- messagebox(str.c_str(),mb_ok+mb_iconerror);
2、loadlibrary失敗的解決方法
方法一:使用loadlibraryex
如果dll與調(diào)用者不在同一個目錄下,可以用loadlibrary(l dll絕對路徑)加載。但是,如果被調(diào)用的dll在內(nèi)部又調(diào)用了另一個dll,此時調(diào)用仍然會失敗。
解決方案是使用loadlibraryex:
loadlibraryex( dll 絕對路徑, null, load_with_altered_search_path);
通過指定load_with_altered_search_path,系統(tǒng)dll搜索順序從dll所在目錄開始。
方法2:使用setcurrentdir
要跨目錄調(diào)用dll,你應(yīng)該這樣做
1. 使用getcurrentdir 保存當前工作目錄。
2、使用setcurrentdir將當前工作目錄設(shè)置為你的dll所在的路徑,需要使用絕對路徑。
3. 為您的dll 使用loadlibrary。
4. 使用setcurrentdir 恢復(fù)到原來的工作路徑。
好了,loadlibrary 找不到指定的程序(loadlibrary failed with error 126:找不到指定模塊)的介紹到這里就結(jié)束了,想知道更多相關(guān)資料可以收藏我們的網(wǎng)站。
上一個:香石竹栽培技巧 如何讓香石竹多開花?
下一個:苗木病蟲害的春季防治

聯(lián)想 a860e怎么樣,誰用過聯(lián)想a860e 手機的質(zhì)量怎么樣 信號好嗎
三星2013繪圖鎖屏怎么解,三星的圖案鎖屏如何去除
指南針電腦版下載安裝,衛(wèi)星定位指南針下載安裝
鉆孔過程中卡管處理措施有哪些?
車載u盤排行榜前十,車載U盤哪個牌子的好
種植跳舞草管理很簡單
手機學(xué)校丟了怎么辦啊,學(xué)校里手機掉了怎樣了能找回
藤三七無公害種植技術(shù)
魔獸爭霸3正式版下載(魔獸爭霸3官方下載地址)
小米2s怎么刷7,小米怎么卡刷
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos