VB 的 DLL檔無法執行? |
缺席
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 我用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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 若將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 發送簡訊給我 |
|
poemkevin
初階會員 發表:26 回覆:77 積分:30 註冊:2002-10-19 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言: 這支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 發送簡訊給我 |
印像中 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 發送簡訊給我 |
引言: 印像中 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 發送簡訊給我 |
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 發送簡訊給我 |
引言:
-------------------------------------------------------------------- 我查結果只找到 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |