線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1232
推到 Plurk!
推到 Facebook!

不同作業系統Dll調用結果卻不同

尚未結案
清心綠茶
一般會員


發表:4
回覆:4
積分:1
註冊:2004-11-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-17 17:38:40 IP:61.222.xxx.xxx 未訂閱
請問一下 我在Account.dll中有一個function名叫ExecuteInitial 其中Account.dpr部分 (前略) {$R *.res} exports ExecuteInitial(connLocal:TADOConnection) name 'ExecuteInitial_2'; begin end. 而在Account.pas部分 宣告段為 function ExecuteInitial(connLocal:TADOConnection):Integer;StdCall;overload; 程式碼段為 function ExecuteInitial(connLocal:TADOConnection):Integer;StdCall;overload; begin (省略,因為不是重點) end; 重點來了 另一個呼叫Account.dll的程式在WindowsXP中可以正常調用這個Account.dll 但在Windows 98中卻出現無法呼叫函數的錯誤訊息 請問是為什麼?是作業系統的關係嗎? 呼叫的程式碼部分為 function ObjectInitial(connLocal:TADOConnection):integer;stdcall;overload; var errCode : integer; oFileName:String; LibHandle:Thandle; ExecuteInitial:Function(connLocal:TADOConnection):Integer;StdCall; begin oFileName:='Account.dll'; errCode := 0; if FileExists(oFileName) then begin LibHandle:=LoadLibrary(Pchar(oFileName)); @ExecuteInitial:=GetProcAddress(LibHandle,'ExecuteInitial_2'); if @ExecuteInitial = nil then begin MessageDlg(oFileName '無法呼叫函數', mtError, [mbOK], 0); end else begin errCode:=ExecuteInitial(connLocal); end; end; (後面省略...) end; 發表人 - 清心綠茶 於 2005/03/17 18:38:25 發表人 - 清心綠茶 於 2005/03/17 22:29:30
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-17 19:54:14 IP:211.76.xxx.xxx 未訂閱
請問你的訊息是"無法調用"還是你自訂的"無法呼叫"? 建議試試看下面的做法 1.重新build dll 及exe 2.將dll放到與exe同一層目錄 3.再執行 試試看 另外發現一件事~為什麼你要用overload呢?
------
熊的學習 http://huwk.blogspot.com
清心綠茶
一般會員


發表:4
回覆:4
積分:1
註冊:2004-11-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-17 22:01:31 IP:59.104.xxx.xxx 未訂閱
引言: 請問你的訊息是"無法調用"還是你自訂的"無法呼叫"? 建議試試看下面的做法 1.重新build dll 及exe 2.將dll放到與exe同一層目錄 3.再執行 試試看 另外發現一件事~為什麼你要用overload呢?
錯誤訊息是我自訂的無法呼叫函數(不好意思誤打成無法調用,已更正原文) ^_^ 回答你提供的解決方式與問題 1.已經重新compile好幾次了 > 發表人 - 清心綠茶 於
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-18 01:02:17 IP:211.76.xxx.xxx 未訂閱
您可以在LibHandle:=LoadLibrary(Pchar(oFileName));後先測試一下嗎? if libhandle = 0 then showmessage('LOAD ERR'); 如果連loadlibrary都沒有成功~那建議把ofilename變成全路徑~    再不行~那98看要不要更新mdac~ 因為你有用到ado..
------
熊的學習 http://huwk.blogspot.com
清心綠茶
一般會員


發表:4
回覆:4
積分:1
註冊:2004-11-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-18 09:35:29 IP:61.222.xxx.xxx 未訂閱
引言: 您可以在LibHandle:=LoadLibrary(Pchar(oFileName));後先測試一下嗎? if libhandle = 0 then showmessage('LOAD ERR'); 如果連loadlibrary都沒有成功~那建議把ofilename變成全路徑~ 再不行~那98看要不要更新mdac~ 因為你有用到ado.. < face="Verdana, Arial, Helvetica"> 大大謝謝你的回答 我已經加了if (LibHandle = 0) then ShowMessage('無法載入Account.dll')的判斷 果然是連LoadLibrary都沒有成功 所以我又將oFileName變成完整路徑 為了確定路徑是正確的我還用ShowMessage把完整路徑show出來 結果路徑是正確的(見下面註) 但一樣在Win98出現錯誤 現在該怎麼辦? 註 完整路徑是相同的 除了大小寫不同(但在 >
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-18 12:58:22 IP:61.222.xxx.xxx 未訂閱
你連load都失敗了~那應是不用管mdac~ 再請問 1.你有使用BORLNDMM嗎? 若沒有請加入~ 如果再不行~那 2.如果讓程式在短檔名路徑下可以呼叫成功嗎?
------
熊的學習 http://huwk.blogspot.com
singend
一般會員


發表:3
回覆:8
積分:2
註冊:2003-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-22 18:38:56 IP:59.120.xxx.xxx 未訂閱
我也是有遇過相同的問題 但是跟你不同的是 我是在同樣的作業系統,不同台pc上所遇上的 有些pc呼叫的到,有些確是呼叫不到 huwk大大所建議的方法也試過了 就是不行,怪的是, 若在不行的機器上將method重新改名後 原本不行的就可以了 .... 原本是以為Method的名稱與系統內建某些函式有衝突才會如此 可是,你的method的名稱似乎不太可能有衝突 如果不是名稱的問題..那是什麼問題呢 我也跟你有同樣的疑問????
系統時間:2024-07-01 5:56:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!