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

自行設計的DLL檔, 只能取得第一個參數

答題得分者是:jow
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-03 17:18:17 IP:61.218.xxx.xxx 訂閱
這是DLL檔內的宣告
procedure DepartFile(SelectFile :PChar ;adoc :TADOConnection);
begin
//do something...
end;
exports DepartFile;

在主程式的引用
Procedure DepartFile(SelectFile :PChar ;adoc :TADOConnection); stdcall; External 'C:\mydll.dll'

結果只有第一個參數'SelectFile'有值,第二個一直是nil

請問有哪裡宣告錯嗎?

感謝回覆 :)
編輯記錄
anumis 重新編輯於 2007-10-03 17:18:39, 註解 無‧
anumis 重新編輯於 2007-10-03 17:19:02, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-03 21:15:01 IP:123.193.xxx.xxx 訂閱
請問你是在呼叫端產生TADOConnection物件,還是在DLL中再產生?
使用後, 在何處將產生的TADOConnection物件釋放?

第二個參數會是不是nil, 應該是programmer可以控制的,
另外注意你DLL內函數的calling convention.

個人意見僅供參考.
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-04 09:35:30 IP:61.218.xxx.xxx 訂閱

TADOConnection是由呼叫端傳入,釋放也是在呼叫端

有試過改用PChar傳入Connectstring,接收後一樣為空值

後來又改成參數前後對調 "SelectFile" <-> "Connectstring"

結果Connectstring 成功傳入, SelectFile 變成空值 -_-|||

只有一個參數可以接收,第二個完全無用

===================引 用 jow 文 章===================
請問你是在呼叫端產生TADOConnection物件,還是在DLL中再產生?
使用後, 在何處將產生的TADOConnection物件釋放?

第二個參數會是不是nil, 應該是programmer可以控制的,
另外注意你DLL內涵數的calling convention.

個人意見僅供參考.
編輯記錄
anumis 重新編輯於 2007-10-04 09:36:57, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-04 10:13:47 IP:210.66.xxx.xxx 訂閱
我測試了一下, 執行正常.

[code delphi]
library Test005dll;

uses
ShareMem, ADODB;

procedure DepartFile(SelectFile: WideString; adoc: TADOConnection;
var Result: WideString); stdcall;
begin
Result := SelectFile '- > adoc: ';
if Assigned(adoc) then
Result := Result '(' adoc.Name ') Assigned.'
else
Result := Result '(' 'NULL' ') NOT Assigned.'
end;

exports
DepartFile;

{$R *.res}

begin
end.

[/code]


[code delphi]
unit fMain;

interface

uses
Windows, Forms, ADODB, ActiveX, Controls, StdCtrls, Classes;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
public
end;

procedure DepartFile(SelectFile: WideString ; adoc: TADOConnection;
var Result: WideString); stdcall; external 'Test005dll.dll'

var
Form1: TForm1;

implementation

uses SysUtils;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
Result: WideString;
adoc: TADOConnection;
begin
adoc := TADOConnection.Create(Self);
try
adoc.Name := 'ABCDE';
DepartFile('TEST.FILE', adoc, Result);
Label1.Caption := Result;
finally
FreeAndNil(adoc);
end;
end;

initialization

CoInitialize(nil);

finalization

CoUninitialize();

end.
[/code]
anumis
一般會員


發表:25
回覆:27
積分:15
註冊:2006-07-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-04 10:45:15 IP:61.218.xxx.xxx 訂閱
  1. procedure DepartFile(SelectFile: WideString; adoc: TADOConnection;
  2. var Result: WideString); stdcall;
找到原因了,因為忘了加 stdcall -_- |||

感謝歐 :)
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-04 11:21:38 IP:210.66.xxx.xxx 訂閱
加油^^
===================引 用 jow 文 章===================
請問你是在呼叫端產生TADOConnection物件,還是在DLL中再產生?
使用後, 在何處將產生的TADOConnection物件釋放?

第二個參數會是不是nil, 應該是programmer可以控制的,
另外注意你DLL內涵數的calling convention.

個人意見僅供參考.
系統時間:2024-05-04 10:46:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!