当前位置:主页>仓库管理软件> 列表

DLL高手请进!小弟请教! 找设备管理软件破解版

财务软件版1楼: 环境:WINXP + DELPHI7.0 + SQL SERVER
在一个已经做好的程序中有一个DATA Module(DM),里面放着一些ADOTable,ADOQuery,DataSource和一个ADOConnection控件进行数据库操作!
这个单元主要写的是一些过程和函数!
目的:要把这些过程和函数写到DLL中,而Project中的DATA Module的过程和函数要调用DLL中的过程和函数,因为在Project中的其他窗体都是调用DM中的过程和函数~
问:在写DLL的时候需要注意写什么?要怎样做才能达到目的?

望各位高手给予小弟指点!最好发个例子过来!万分感谢!!

2楼: 在Dll中使用ADO需要加入下面的语句,其它的与普通的DLL没什么区别
initialization
CoInitialize(Nil);

finalization
CoUnInitialize; 如库存管理软件

3楼: 这个了解,查以前的帖子看到不少

但是我现在就是搞不懂:为了达到目的,DLL中应该怎样写?需要在DLL中加入DATA Module和它里面的ADO控件吗?

4楼: 和普通的exe一样,ADO相关控件可以放在 DataModule上

5楼: TO xiaoguo:
是否可以把EXE中DATAModule上的过程和函数直接搬到DLL中?
如果可以,需要注意些什么?
在EXE中的DATAModule上怎样调用DLL?

6楼: 我以前试过的,几个程序共用一个DLL的数据连接,以加快各个程序初始连接数据库速度慢的问题,不过效果不是很好!

财务软件版7楼: 可以。比方说在Exe中函数原形为
Function FTest
(
ASendBuffer1 : Integer;
Out ARecvBuffer1 : String
) : Integer;

在Dll中可以这样写
Function FTest
(
ASendBuffer1 : Integer;
ARecvBuffer1 : PChar //最好用PChar
) : Integer; StdCall; Exports FTest;

8楼: TO xiaoguo
如果:
Function FTest
(
ASendBuffer1 : Integer;
Out ARecvBuffer1 : String
) : Integer;
var
mysql:string;
begin
……
end;
在Dll中是否写成这样:
Function FTest
(
ASendBuffer1 : Integer;
ARecvBuffer1 : PChar //最好用PChar
) : Integer; StdCall;
var
mysql:PChar;
Exports FTest;

9楼: 在函数内部仍然可以用String类型,毕竟用String比较方便
只是在最后传出时通过StrPCopy转为PChar
StrPCopy(ARecvBuffer1, ''测试字符串'');

10楼: 那么在EXE中该怎样调用呢??

11楼: 1、声明
Const Dll_Name = ''Test.dll'';

Function FTest
(
ASendBuffer1 : Integer;
ARecvBuffer1 : PChar //最好用PChar
) : Integer; StdCall; External Dll_Name;

12楼: 2、调用
Function FFTest
(
ASendBuffer1 : Integer;
Out ARecvBuffer1 : String
) : Integer;
Var
RecvBuffer1 : Array[0..1024] of Char;
Begin
Result := FTest(ASendBuffer1, RecvBuffer1 );
ARecvBuffer1 := StrPas(RecvBuffer1);
End; 如速达软件报价

13楼: 问个很菜的问题:
StrPCopy是不是把String转换为PChar?

财务软件版14楼: 是的

15楼: TO xiaoguo:
我在DLL中的DataModule中放了ADO控件
在EXE中的DataModule中还需要再放ADO控件吗?

16楼: 我不清楚你的程序结构,
如果是采用插件方式的话,一般模式是:主程序(exe)负责连接数据库,并将ADOConnection传入DLL(DLL不需要单独建立数据库连接),DLL中放置ADOQuery之类的控件(ADOQuery.Connection := 传入的ADOConnection)进行读写数据

17楼: 那要怎样才能把EXE中的ADOConnection传入DLL中?

18楼: Function FTest
(
AADOConnection : TADOConnection; //传入TADOConnection
ASendBuffer1 : Integer;
ARecvBuffer1 : PChar //最好用PChar
) : Integer; StdCall; Exports FTest;

19楼: 具体应该怎么写啊?

偶不晓得!

20楼: //这是我的一个插件的Demo,里面没用到DataModule而是用了Form,原理差不多

//1、HT_Test.dpr
library HT_Test;

uses
SysUtils,
Classes,
Forms,
Test in ''Test.pas'' {frmTest},
PublicUnit in ''PublicUnit.pas'';

{$E hhr.}

begin

end.

//2、PublicUnit.pas
unit PublicUnit;

interface
Uses
Windows, Forms, Classes, ADODB;

Type
TrdParam = Record
AppMain : TApplication;
ADOConn : TADOConnection;
sStationID : String;
sHosCode : String;
sHosName : String;
sOpCode : String;
sOpName : String;
End;

Procedure InitPlug(prdParam : TrdParam); Export; StdCall; Exports InitPlug;



Procedure OpenMDIChild(TfrmMDIChild: TComponentClass; var frmMDIChild: TForm);

Var
rdParam : TrdParam;

implementation
uses
Test;

Procedure OpenMDIChild(TfrmMDIChild: TComponentClass; var frmMDIChild: TForm);
var
iLoop: integer;
begin
//-- 1. 查询子窗体是否已经存在
for iLoop:=Application.MainForm.MDIChildCount-1 downto 0 do
if Application.MainForm.MDIChildren[iLoop]=frmMDIChild then
begin
frmMDIChild.Show; // 已经存在, 推到前面
exit; // 退出
end;
//-- 2. 不存在则创建
Application.CreateForm(TfrmMDIChild, frmMDIChild);
frmMDIChild.Show;
end;

Procedure InitPlug(prdParam : TrdParam);
Begin
rdParam := prdParam;
Application := prdParam.AppMain;
//
OpenMDIChild(TComponentClass(TFrmTest), TForm(FrmTest));//需修改
End;

end.

//3、Test.pas (Test.dfm)
unit Test;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Db, ADODB, Grids, DBGrids, StdCtrls, PublicUnit;

type
TfrmTest = class(TForm)
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
ADOQuery2: TADOQuery;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmTest: TfrmTest;

implementation

{$R *.DFM}

procedure TfrmTest.Button1Click(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text := ''SELECT * FROM HosInfo'';
ADOQuery1.Open;
end;

procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
//FrmTest := nil;
end;

procedure TfrmTest.FormCreate(Sender: TObject);
begin
ADOQuery1.Connection := rdParam.ADOConn;
ADOQuery2.Connection := rdParam.ADOConn;
end;

procedure TfrmTest.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TfrmTest.DBGrid1CellClick(Column: TColumn);
begin
If DBGrid1.DataSource.DataSet.IsEmpty Then Exit;
Edit1.Text := DBGrid1.DataSource.DataSet.FieldByName(''HosName'').AsString;
end;

procedure TfrmTest.Button3Click(Sender: TObject);
begin
If (DBGrid1.DataSource.DataSet.IsEmpty) Or (Edit1.Text='''') Then Exit;
//
Try
With ADOQuery2 Do
Begin
Close;
SQL.Text := ''UPDATE HosInfo SET HosName = '''''' + Edit1.Text + '''''' '';
ExecSQL;
End;
Except
End;

end;

end.

财务软件版21楼: 用interface接口,可以方便的在EXE与DLL之间共享数据,无论是DataModule,还是更复杂的结构!
例子你可到www.2ccc.com上下载

22楼: 1、如二楼:xianguo, 时间:2006-1-14 12:16:35, ID:3328600
在Dll中使用ADO需要加入下面的语句,其它的与普通的DLL没什么区别
initialization
CoInitialize(Nil);
finalization
CoUnInitialize;
特别是在多线程下。
2、在单元Interface中第一个引用Sharemem(好像是这样拼)
否则在调试、测试的时候会很正常,儿发布后会出些奇怪的错误。至于原因详细看
Dll开头的注释(Delphi自动生成的)
3、根据你的系统访问数据的频度、和对效率(事实性)的要求
可以在主程序中创建固定的长连接;或在DLL中动态创建连接——每次调用创建,完成后释放(在我做的一套系统中一直在用,Windows2000可以连续2个月以上不用重启系统)。 如设备管理软件破解版