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

請問各位前輩,如何把AdoQuery包在DLL中?

尚未結案
lulala
一般會員


發表:5
回覆:6
積分:2
註冊:2005-01-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-23 16:42:41 IP:219.84.xxx.xxx 未訂閱
日前有一想法,將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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-23 16:48:48 IP:210.202.xxx.xxx 未訂閱
參考這篇吧 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-23 18:08:17 IP:220.130.xxx.xxx 未訂閱
我想傳遞物件對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'; 請參考看看吧..
系統時間:2024-11-23 7:24:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!