高手请指教:在dll中能返回一个dataset吗?(100分)

R

redw

Unregistered / Unconfirmed
GUEST, unregistred user!
在dll中能返回一个dataset吗?如果能请给个例子好吗,谢谢!
 
不能返回。
 
就这么绝对啊,难道没有其它的办法吗?
 
library Project1;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
sharemem,//一定要引用
SysUtils,
Classes,
adodb;

{$R *.RES}
Function getADOQuery (Connect :TADOConnection):TADOquery stdcall;
var
Query :TADOQuery
begin
Query :=TAdOQuery.create(nil)
Query.Connection:= Connect;
Query.Close
Query.SQL.Clear
Query.SQL.Add('select * from pro_wul');
Query.Open
rESULT :=Query;
end;
EXPORTS getADOQuery;
BEGIN
END.
/////////////////////////////////////
program Project2;

uses
sharemem, //一定要引用
Forms,
Unit2 in 'Unit2.pas' {Form1};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, ADODB, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
ss:TADOQuery
tt :Function (Connect :TADOConnection):TADOquery;stdcall;

dd:Hwnd
begin
dd:= loadLibrary('Project1.dll');
tt := GetProcAddress(dd,'getADOQuery');
ss:=tt(ADOConnection1);
self.DataSource1.DataSet:= ss;
end;

end.
 
我qq 84411693
 
试试先,谢谢!
 
你qq多少
 
但uses sharemem之后,软件的发布是不是要带上BORLNDMM.DLL?
 
楼主说,你想做什么?我前一段时间也有过这个问题。
 
我使用bcb,可以通过dll传dateset,datesource,,但delphi,我想用引用也能吧??
 
用ADO的话可以传回DataSet,至于dataSource在程序里加一个不就结了。
服务端:
bool TScaCOMDataSetImp::ExecuteQuery(BSTR CmdStr, _Recordset** DataSet)
{
try
{
DMComDS->adsOptData->Active = false;
DMComDS->adsOptData->CommandText = CmdStr;
DMComDS->adsOptData->Active = true;
_Recordset *t = DMComDS->adsOptData->Recordset
// adsOptData : TAdoDataset
*DataSet = t;
}
catch(Exception &e)
{
*DataSet = NULL;
return false;
}
return true;
};

客户端:
//---------------------------------------------------------------------------
void __fastcall TForm1::btnConnectClick(TObject *Sender)
{
if( !Server )
{
Server = CoScaCOMDataSet::Create();
Server->Create();
}

adsData->Active = false;

AnsiString sql = "select * from Infos";
BSTR str = WideString(sql).Detach();
_Recordset *ds = Server->ExecuteQuery( str )
// 取ADO的原生接口
_di__Recordset dr = ds

adsData->Recordset = dr
// adsData: TAdoDataSet
}
我的例子是用COM封装的。
 
问题: 如何调DLL中传来的标准ADO数据集

传原生接口。
1.让DLL的函数(如ExecuteQuery)返回ADO的原生接口_Recordset;
2.将_Recordset传给一个TAdoDataset的RecordSet属性即可。
var
ds:_Recordset;
ads:TAdoDataSet
{可以是放在窗体上的控件}
begin
ds := ExecuteQuery( str )
ads := TAdoDataSet.Create;
adsData.Recordset = dr;
....
 
接受答案了.
 
顶部