請問各位前輩,如何把AdoQuery包在DLL中? |
尚未結案
|
lulala
一般會員 發表:5 回覆:6 積分:2 註冊:2005-01-23 發送簡訊給我 |
日前有一想法,將ADOQuery包在DLL中,用到時再呼叫他,並把傳回的dataset倒入FROM中的元件,如stringgird中。於是我嘗試以下的CODE。
Project1主程式,Lib.dll-DLL
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB; type TForm1 = class(TForm) ADOConnection1: TADOConnection; DataSource1: TDataSource; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Function ConnectDB(myconn:TADOConnection; mysqlstr:string):boolean;stdcall;external 'Lib.dll'; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin connectDB(adoconnection1,'select * from tb1'); end; end. library Lib; uses SysUtils, Classes, ADODB, DB, Forms, Dialogs; {$R *.res} Function ConnectDB(myconn:TADOConnection; mysqlstr:string):boolean;stdcall; var DMODULE:TDATAModule; myquery:TADOQuery; begin try DMODULE := TDATAMODULE.Create(Application); myquery := TADOQuery.Create(DMODULE); myQuery.Connection:=myconn; myQuery.SQL.Text:= mysqlstr; myQuery.Close; myQuery.Open; except showmessage('Error'); end; end; exports ConnectDB; end.成是執行沒問題,但一結束時,就會發生 project1.exe raised exception class EAccess Violation with message' Access violation at address 00000000. Read of address 00000000' 請問一下,問題事出在哪裡?這樣的設計,會不會有問題?因為看前文發現,設計DLL時不要把元件PASS給DLL,請問一下是不是有更好的設計方法? 另外,如果可以將元件PASS給DLL,那FORM1要如何接收呢?請大家給我個方向,謝謝。 發表人 - lulala 於 2005/02/23 16:45:55 |
rexchiu
中階會員 發表:14 回覆:88 積分:70 註冊:2002-03-17 發送簡訊給我 |
參考這篇吧
http://delphi.ktop.com.tw/topic.php?topic_id=50915 Best Regards,
Rex Chiu
------
Best Regards, Rex Chiu |
yorkland
高階會員 發表:2 回覆:138 積分:108 註冊:2004-12-17 發送簡訊給我 |
我想傳遞物件對dll與呼叫端並沒有什麼特殊的限制。
Dll一旦Load進來後就是執行序的一部份。
在你的sample code中看不出來myquery create後是給誰使用, 一般我的做法, 會讓底層提供service的procedure不執行create的動作, 因為它不知道何時才能release object。
我的作法會將該準備好的物件都由上層提供, 然後以傳址的方式傳入下層procedure or dll's export function. // 所以大概會像以下的宣告方式..
Function ConnectDB(var query: TADOQuery; const myconn:TADOConnection; const mysqlstr:string):boolean;stdcall;external 'Lib.dll'; 請參考看看吧..
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |