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

VB 的 DLL檔無法執行?

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-04 13:33:42 IP:61.71.xxx.xxx 未訂閱
請問各位!    我用Delphi5去call一支 VB寫出來的DLL檔, 但出現以下錯誤, 不知道是我的呼叫上有錯, 還是VB DLL中有特殊的寫法才能給DELPHI用? 註:VB DLL檔在VB執行程式中是可以正常作業的 以下這是我的呼叫方式 function Standby(my_EQ_Type: Integer): Integer; cdecl; external 'nMOT_MEXA_DLL.dll' name 'prg_Standby'; 而對方的DLL的傳入參數 my_EQ_Type 是以public 定義的, 大小寫也都遵循對方的規定作業, 不知各位有沒有這方面的經驗? 謝謝!
poemkevin
初階會員


發表:26
回覆:77
積分:30
註冊:2002-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-04 14:15:22 IP:210.202.xxx.xxx 未訂閱
若將function 改為procedure試試呢?     Procedure Standby(my_EQ_Type: Integer):Integer;cdecl; external 'nMOT_MEXA_DLL.dll' name 'prg_Standby'; 或者在implementation下面, function Standby(my_EQ_Type: Integer):Integer;far; external 'nMOT_MEXA_DLL.dll';
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-04 15:17:11 IP:61.71.xxx.xxx 未訂閱
引言: 若將function 改為procedure試試呢? Procedure Standby(my_EQ_Type: Integer):Integer;cdecl; external 'nMOT_MEXA_DLL.dll' name 'prg_Standby'; 或者在implementation下面, function Standby(my_EQ_Type: Integer):Integer;far; external 'nMOT_MEXA_DLL.dll';
1.必須有回傳值, 所以 procedure 不通! 2.置於 implementation 一樣情況, 應與這個沒有關係, 我猜想是 vb給delphi必須有特殊的宣告, 但我不是很熟悉這一段! 謝謝!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-04 15:36:19 IP:147.8.xxx.xxx 未訂閱
Just wondering... isn't dll created by VB are ActiveX?? Need to check later 
poemkevin
初階會員


發表:26
回覆:77
積分:30
註冊:2002-10-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-04 17:35:48 IP:210.202.xxx.xxx 未訂閱
會不會是函數傳遞方法的問題 它一共有四種方式: cdecl, stdcall, pascal, fastcall. 其中cdecl, 通常是c/c 用的參數傳遞方式, 它的傳遞方式是由右至左. 而win api 幾乎都是採用stdcall的傳遞方式. 所以若您將cdecl, 改成stdcall看看呢
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-04 22:06:28 IP:61.71.xxx.xxx 未訂閱
引言: 會不會是函數傳遞方法的問題 它一共有四種方式: cdecl, stdcall, pascal, fastcall. 其中cdecl, 通常是c/c 用的參數傳遞方式, 它的傳遞方式是由右至左. 而win api 幾乎都是採用stdcall的傳遞方式. 所以若您將cdecl, 改成stdcall看看呢
抱歉, 我忘了提一點, 各種方式我都有試過, 情況一樣!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-04 22:10:38 IP:61.71.xxx.xxx 未訂閱
引言: Just wondering... isn't dll created by VB are ActiveX?? Need to check later < face="Verdana, Arial, Helvetica"> 這支dll程式程式確實有call到 ocx 元件, 但它是不是屬 ActiveX, 我並不清楚 我曾要求該程式的原作者是否可以釋放一些程式碼讓我求援, 但結果是 no, 所 以我要確定的事情是 "問題出在我這, 還是他那裡?"...
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-05 09:21:50 IP:147.8.xxx.xxx 未訂閱
引言: 這支dll程式程式確實有call到 ocx 元件, 但它是不是屬 ActiveX, 我並不清楚 我曾要求該程式的原作者是否可以釋放一些程式碼讓我求援, 但結果是 no, 所 以我要確定的事情是 "問題出在我這, 還是他那裡?"...
Perhaps you could try to register it using regsvr32... if success then it is ActiveX and the proper way is to import it as ActiveX?
alphakao
一般會員


發表:0
回覆:18
積分:8
註冊:2002-07-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-05 11:37:23 IP:61.30.xxx.xxx 未訂閱
印像中 VB 好像只能作 ActiveX DLL 你用 TDump 看 DLL 裡是不是有 DllCanUnloadnow DllGetClassObject DllRegisterServer DllUnRegisterver 這4 個Function export 出來 如果有 ,那就是了, 要用的時候記得 用 DllRegisterServer註冊, 當然如果你要用 Regsvr32 來註冊也可以 Coding 時用 olevariant 接 或者 import typelib 直接 Code 都可 發表人 - alphakao 於 2004/08/05 13:27:59
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-05 15:46:41 IP:61.71.xxx.xxx 未訂閱
引言: 印像中 VB 好像只能作 ActiveX DLL 你用 TDump 看 DLL 裡是不是有 DllCanUnloadnow DllGetClassObject DllRegisterServer DllUnRegisterver 這4 個Function export 出來 如果有 ,那就是了, 要用的時候記得 用 DllRegisterServer註冊, 當然如果你要用 Regsvr32 來註冊也可以 Coding 時用 olevariant 接 或者 import typelib 直接 Code 都可
我查結果只找到 DllCanUnloadnow
Section:             Exports                                      
  Flags:             00000000                                     
  Time Stamp:        40BEC356 : Thu Jun 03 14:21:10 2004          
  Major Version:     0000                                         
  Minor Version:     0000                                         
                                                                  
Exports from nMOT_MEXA_DLL.dll                                    
  4 exported name(s), 4 export addresse(s).  Ordinal base is 1.   
  Sorted by Name:                                                 
    RVA      Ord. Hint Name                                       
    -------- ---- ---- ----                                       
    00009B16    1 0000 DllCanUnloadNow => Xh░                     
這段我十分陌生, 要如何用 用 DllRegisterServer註冊, Coding 時用 olevariant 接 或者 import typelib 直接 Code 都可 可否再賜教一二, 謝謝!
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-05 18:38:07 IP:61.221.xxx.xxx 未訂閱
P.D. 版主 你好: 若是不先宣告,而是在使用實在引用: var hDll:HModule; Standby : Function(my_EQ_Type: Integer): Integer;stdcall; procedure TStart.FormCreate(Sender: TObject); begin try hDll := LoadLibrary('MOT_MEXA_DLL'); except ShowMessage('無法載入驅動模組'); Exit; end; end; procedure TStart.Button1Click(Sender: TObject); begin if hDll<> 0 then begin @Standby := GetprocAddress(hDll,PCHAR('prg_Standby')); end; end;
------
======================
昏睡~
不昏睡~
不由昏睡~
alphakao
一般會員


發表:0
回覆:18
積分:8
註冊:2002-07-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-06 12:48:00 IP:210.202.xxx.xxx 未訂閱
引言: -------------------------------------------------------------------- 我查結果只找到 DllCanUnloadnow Section: Exports Flags: 00000000 Time Stamp: 40BEC356 : Thu Jun 03 14:21:10 2004 Major Version: 0000 Minor Version: 0000 Exports from nMOT_MEXA_DLL.dll 4 exported name(s), 4 export addresse(s). Ordinal base is 1. Sorted by Name: RVA Ord. Hint Name -------- ---- ---- ---- 00009B16 1 0000 DllCanUnloadNow => Xh░ --------------------------------------------- 這段我十分陌生, 要如何用 用 DllRegisterServer註冊, Coding 時用 olevariant 接 或者 import typelib 直接 Code 都可 可否再賜教一二, 謝謝! 你的 export table 中說 4 exported name(s), 4 export addresse(s). Ordinal base is 1. 也就是應該有 4 個 function 被 export 出來了, 卻只有看到一個 unload 的 function 如果是 沒有 DLLRegisterServer 那應該沒辦法註冊 但同時這裡也沒有你要 Call 的那個 Standby 所以你也不可能 Call 成功 但你又說 VB 能正常的 Call Satanby 能 把你的 DLL upload 上來嗎? 偶粉好奇..
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-06 17:48:35 IP:61.71.xxx.xxx 未訂閱
1.TDump 的用法我是第一次使用, 不知要下那些參數才可以列出全部的資訊, 我 只是用 TDump nMot_Mexa_Dll.dll > test.txt 的方式來列出其內涵! 2.如果我能給各位的話, 我一定給, 不過這支不是我的版權, 原設計者也未表達 同意過(第一次發言已提過), 只是我真正的目的就是要確定到底是我程式呼叫 方式不對, 還是他的釋出方式不對, 因為我們之間有爭議! 目前我的程式並沒有透過這支dll來運作, 而是對方重新包裝成一支exe檔, 然後 我們雙方透過各自的exe檔來傳達訊息, 我們也曾試過用dde的方式, 但我利用 dde(我這邊是dde client)來設計時雖然都可以呼叫不會有錯, 可是透過他的程式(dde server)卻無法使搭配這支 nMot_Mexa..的儀器驅動 , 對方熟VB(自動控制), 但完全不懂Delphi, 我剛好相反, 所以造成兩邊都無法 整合起來, 才不得已用兩支exe(VB Delphi)來控制!
alphakao
一般會員


發表:0
回覆:18
積分:8
註冊:2002-07-04

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-08-09 16:48:47 IP:61.30.xxx.xxx 未訂閱
引言: 1.TDump 的用法我是第一次使用, 不知要下那些參數才可以列出全部的資訊, 我 只是用 TDump nMot_Mexa_Dll.dll > test.txt 的方式來列出其內涵! 2.如果我能給各位的話, 我一定給, 不過這支不是我的版權, 原設計者也未表達 同意過(第一次發言已提過), 只是我真正的目的就是要確定到底是我程式呼叫 方式不對, 還是他的釋出方式不對, 因為我們之間有爭議! 目前我的程式並沒有透過這支dll來運作, 而是對方重新包裝成一支exe檔, 然後 我們雙方透過各自的exe檔來傳達訊息, 我們也曾試過用dde的方式, 但我利用 dde(我這邊是dde client)來設計時雖然都可以呼叫不會有錯, 可是透過他的程式(dde server)卻無法使搭配這支 nMot_Mexa..的儀器驅動 , 對方熟VB(自動控制), 但完全不懂Delphi, 我剛好相反, 所以造成兩邊都無法 整合起來, 才不得已用兩支exe(VB Delphi)來控制!
 
function MyStandby(ET:Integer):Integer;
Type   TDLLRegFunc= Procedure;Stdcall;
Var
  DLLPath:String;
  FuncAddr:Pointer;
  DLLHandle:THandle;
  MyRec:TSearchRec;
  DLLReg:TDLLRegFunc;
  DLLOBJ:olevariant;
Begin
  DLLPath:=ExTractFilePath(Application.ExeName);
  if DLLPath[Length(DLLPath)] <> '\' then DLLPath:=DLLPath '\';
  DLLHandle:=LoadLibrary(Pchar(DLLPATH 'nMot_Mexa_DLL.dll'));
  // 以上表示 假設你的 DLL 跟主程式擺在一起,程式要到自己的目錄 Load Library
  FuncAddr:=GetProcAddress(DLLHandle,Pchar('DllRegisterServer'));
  if FuncAddr = nil then Begin
    // 如果 FuncAddr 是 nil 表示 你的 DLL 不是 ActiveX DLL,那偶就投降了.
    Result:=-1;
  end else Begin
    @DLLREG:=FuncAddr;
    DLLReg;
    // 以上跟 regsvr32 意思一樣,就是註冊你的 DLL
    DLLOBJ:=CreateOleObject('nMot_Mexa_DLL.Class1');
    // 以上是開啟你的 CoClass 一個 CoClass 是一組 Function 或 Porperty 的組合 須要 use 到 ComObj
    // 因為我不知道你的 TypeLibrary 所以隨便打一個
    // 如果前面有註冊成功那麼,這時後 你 電腦的 Regiestry 應該會有 nMot_Mexa.?????? 這樣的記錄
    // 用 RegEdit 找 HKEY_CLASSES_ROOT 下面那一個像是你要的 CoClass
    // 把那個名字填回 CreateOleObject 裡面取代 nMot_Mexa_DLL.Class1
    // 這樣就可以直接 Call 了,
    // 其實如果真的到這邊,也可以用 Project/import TypeLibrary 取得 typeLibrary 
    // 用 add 後 CreateUnit 就好了 Delphi 會自動把 Type Library 加到 Imports 裡面
    Result:=DLLOBJ.Standby(1);
  end;
end;
 
那麼你 debug 上面的 Code 看看, 一般如果不是要求 Performance 的 Code 我都是這樣處理 ActiveX 你試看看. 發表人 - alphakao 於 2004/08/09 16:56:59
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-08-10 17:50:05 IP:61.71.xxx.xxx 未訂閱
感謝各位的幫忙! 目前這個案子是結案, 手上另有一個要結, 暫時沒有辦法繼續在這個議題上 追蹤, alphakao兄提供的這個方式等我結案後再測試, 有進一歩消息再報告! 謝謝!
系統時間:2024-05-17 19:05:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!