{
单元文件列表:
接口单元:IuserInfo,其中定义一个接口 IuserInfoLib;
业务逻辑单元:UserInfoLib,其中定义业务逻辑类:TUserInfoLib,该类实现了接口IuserInfoLib
}
现在我的一个业务逻辑类封装到了Dll中,
接口单元IuserInfo的代码:unit IuserInfo;
interface
type
IuserInfoLib=interface
function GetUserInfo(AuserName:pchar):olevariant;overload; //获取指定用户名的信息
function GetUserInfo:olevariant;overload; //获取全部的用户信息
end;
implementation
end.
业务逻辑单元UserInfoLib
unit UserInfoLib;interface
uses
Windows,Messages, SysUtils, Variants, Classes,
Graphics,ImgList,ComCtrls,
sysDM, //引用数据模块单元
IUserInfo; //引用接口单元
type
TUserInfoLib=class(TInterfacedObject,IuserInfoLib)
private
UserDM:TDataModule1; //数据模块
public
constructor create;
destructor Destroy;override; //下面这两个方法来自接口 IuserInfoLib
function GetUserInfo(AuserName:pchar):olevariant;overload; //获取指定用户名那个的用户信息
function GetUserInfo:olevariant;overload; //获取全部的用户信息
end;implementation
//构造方法
constructor TuserInfoLib.create;
begin
userDM:=Tdatamodule1.Create(nil);
end;
//析构方法
Destructor TuserInfoLib.Destroy;
begin
freeAndNil(UserDM);
Inherited;
end;
//获取指定用户名的用户信息
function TuserInfoLib.GetUserInfo(AuserName:pchar):olevariant;
begin
if not userDM.Adoconnection1.connected
then userDM.ADOconnection1.connected:=true; with UserDM.AdoqUserInfo do
begin
close;
sql.clear;
sql.Add('select * from tb1 where userName=:tmpUserInfo');
parameters.ParamByName('tmpUserInfo').Value:=string(AuserName);
open;
end;
result:=UserDM.DspUserInfo.Data; //返回根据用户名的查询结果的数据集
end;//获取全部的用户信息
function TuserInfoLib.GetUserInfo:olevariant;
begin
if not userDM.Adoconnection1.connected
then userDM.ADOconnection1.connected:=true; with UserDM.AdoqUserInfo do
begin
close;
sql.clear;
sql.Add('select * from tb1');
open;
end;
result:=UserDM.DspUserInfo.Data; //返回根据用户名的查询结果的数据集
end;
DLL工程单元
library UserInfoDLL;uses
SysUtils,
Classes,
sysDM in 'sysDM.pas' {DataModule1: TDataModule},
IuserInfo in 'IuserInfo.pas',
UserInfoLib in 'UserInfoLib.pas';{$R *.res}function CreateUserInfoLib:IuserInfoLib; //返回接口
begin
TUserInfoLib.create; //创建类的实例
end;exports
CreateUserInfoLib; //导出函数----------------------------在主程序中调用dll。unit mainform;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBClient,
IuserInfo, StdCtrls;type
TmyFunction=function:IuserInfoLib; //声明一个函数类型 TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject);
private
UserLib:TmyFunction; //函数类型
myHandle:Thandle; //dll句柄
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}//窗体载入
procedure TForm1.FormCreate(Sender: TObject);
begin
myHandle:=LoadLibrary('UserInfoDLL.dll'); //载入DLL
@UserLib:=GetProcAddress(myHandle,'GetUserInfo'); //获取到DLL中的函数
end;//窗体销毁
procedure TForm1.FormDestroy(Sender: TObject);
begin
UserLib:=nil;
freeLibrary(myHandle); //释放
end;
//点击获取全部用户信息
procedure TForm1.Button1Click(Sender: TObject);
begin
if UserLib<>nil then
clientDataset1.Data:=UserLib.GetUserInfo; //系统报告AV错误这里!!!
end;上面代码只是测试 演示下,没有考虑吧其他的异常等情况。
clientDataset1.Data:=UserLib.GetUserInfo; 请大家看看问题出在什么地方??
谢谢
单元文件列表:
接口单元:IuserInfo,其中定义一个接口 IuserInfoLib;
业务逻辑单元:UserInfoLib,其中定义业务逻辑类:TUserInfoLib,该类实现了接口IuserInfoLib
}
现在我的一个业务逻辑类封装到了Dll中,
接口单元IuserInfo的代码:unit IuserInfo;
interface
type
IuserInfoLib=interface
function GetUserInfo(AuserName:pchar):olevariant;overload; //获取指定用户名的信息
function GetUserInfo:olevariant;overload; //获取全部的用户信息
end;
implementation
end.
业务逻辑单元UserInfoLib
unit UserInfoLib;interface
uses
Windows,Messages, SysUtils, Variants, Classes,
Graphics,ImgList,ComCtrls,
sysDM, //引用数据模块单元
IUserInfo; //引用接口单元
type
TUserInfoLib=class(TInterfacedObject,IuserInfoLib)
private
UserDM:TDataModule1; //数据模块
public
constructor create;
destructor Destroy;override; //下面这两个方法来自接口 IuserInfoLib
function GetUserInfo(AuserName:pchar):olevariant;overload; //获取指定用户名那个的用户信息
function GetUserInfo:olevariant;overload; //获取全部的用户信息
end;implementation
//构造方法
constructor TuserInfoLib.create;
begin
userDM:=Tdatamodule1.Create(nil);
end;
//析构方法
Destructor TuserInfoLib.Destroy;
begin
freeAndNil(UserDM);
Inherited;
end;
//获取指定用户名的用户信息
function TuserInfoLib.GetUserInfo(AuserName:pchar):olevariant;
begin
if not userDM.Adoconnection1.connected
then userDM.ADOconnection1.connected:=true; with UserDM.AdoqUserInfo do
begin
close;
sql.clear;
sql.Add('select * from tb1 where userName=:tmpUserInfo');
parameters.ParamByName('tmpUserInfo').Value:=string(AuserName);
open;
end;
result:=UserDM.DspUserInfo.Data; //返回根据用户名的查询结果的数据集
end;//获取全部的用户信息
function TuserInfoLib.GetUserInfo:olevariant;
begin
if not userDM.Adoconnection1.connected
then userDM.ADOconnection1.connected:=true; with UserDM.AdoqUserInfo do
begin
close;
sql.clear;
sql.Add('select * from tb1');
open;
end;
result:=UserDM.DspUserInfo.Data; //返回根据用户名的查询结果的数据集
end;
DLL工程单元
library UserInfoDLL;uses
SysUtils,
Classes,
sysDM in 'sysDM.pas' {DataModule1: TDataModule},
IuserInfo in 'IuserInfo.pas',
UserInfoLib in 'UserInfoLib.pas';{$R *.res}function CreateUserInfoLib:IuserInfoLib; //返回接口
begin
TUserInfoLib.create; //创建类的实例
end;exports
CreateUserInfoLib; //导出函数----------------------------在主程序中调用dll。unit mainform;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, DBClient,
IuserInfo, StdCtrls;type
TmyFunction=function:IuserInfoLib; //声明一个函数类型 TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject);
private
UserLib:TmyFunction; //函数类型
myHandle:Thandle; //dll句柄
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}//窗体载入
procedure TForm1.FormCreate(Sender: TObject);
begin
myHandle:=LoadLibrary('UserInfoDLL.dll'); //载入DLL
@UserLib:=GetProcAddress(myHandle,'GetUserInfo'); //获取到DLL中的函数
end;//窗体销毁
procedure TForm1.FormDestroy(Sender: TObject);
begin
UserLib:=nil;
freeLibrary(myHandle); //释放
end;
//点击获取全部用户信息
procedure TForm1.Button1Click(Sender: TObject);
begin
if UserLib<>nil then
clientDataset1.Data:=UserLib.GetUserInfo; //系统报告AV错误这里!!!
end;上面代码只是测试 演示下,没有考虑吧其他的异常等情况。
clientDataset1.Data:=UserLib.GetUserInfo; 请大家看看问题出在什么地方??
谢谢
解决方案 »
- 谁能给哥pascal语言进行socket通信的例子呢 多谢
- 结构体的问题。。。
- 从客户端如何获取数据库服务器的硬件信息
- 关于释放,最后20分,希望各位帮一帮,谢谢
- 现在能用delphi5下载地址?? 100元给你
- 求透明的delphi基本控件,可以自动使用背景图的
- 一个排列组合的算法问题,答出就给分
- 为什么打ADO的补丁,打了1后,再打2,却提示要我先打1,然后一看,ADO控件全没有了。
- 在TREEVIEW中怎么给每一项加上一个CHECK框?
- 我做了一个ActiveForm组件,在浏览器中执行,现在想用它来读取服务器段的一个文本文件数据,怎么做阿?
- 求DynamicSkinForm skin包
- 获取delphi文件版本信息的疑问
begin
TUserInfoLib.create; //创建类的实例
end;
这里没有返回.
begin
TUserInfoLib.create; //创建类的实例
end;沒有返回
改了
result:=TUserInfoLib.create;还是一样。这里我确实是忘记写了,但还是AV错误
这个是忘记了,刚才加上了result:=。。还是有错误工程代码在这里:http://download.csdn.net/source/1157618僵哥和starluck 有时间帮看看,小弟感激不尽。
刚学Delphi 的OOP
Datasetprovider在DM中相关联的是adoquery1,也就是代码中AdoqUserInfoadoquUserInfo执行查询后将数据集通过DspUserInfo传递到前端的clientDataset
begin
myHandle:=LoadLibrary('UserInfoDLL.dll'); //载入DLL
//@UserLib:=GetProcAddress(myHandle,'GetUserInfo');//获取到DLL中的函数 @UserLib:=GetProcAddress(myHandle,'CreateUserInfoLib');//改掉
end;procedure TForm1.Button1Click(Sender: TObject);
begin
//if UserLib<>nil then
if Assigned(UserLib) then//改掉
clientDataset1.Data:=UserLib.GetUserInfo; //获取全部的用户信息
end;
function CreateUserInfoLib:IuserInfoLib; //返回接口
begin
//TUserInfoLib.create; //创建类的实例
Result := TUserInfoLib.create; //改掉
end;
2.DLL导出的函数名是'CreateUserInfoLib',而调用程序当中用的是'GetUserInfo',要改掉
3.判断函数不能直接x<>Nil,而使用Assigned(X),改掉做完上面的就OK了。
嘿嘿。
疏忽了,已经改正,Okay自己懵了,谢谢僵哥和starLuck!!