delphi DLL 代码:
library InspectWSDll;
uses
SysUtils;
{$R *.res}
exports
Validate,
retrieveDevicePage,
retrieveDevicePage1,
retrieveInspectionPersonPage,
retrieveInspectionPersonPage1;
以下为实现文件:
unit Unt_UserLogin;
interface
uses DBAccessService,GlobeUtils,Dialogs,SysUtils,CnDebug;
type
PTUser = ^TUser_;
TUser_ = record
id: Int64;
name: WideString;
pass: WideString;
region: WideString;
username: WideString;
usertype: Int64;
end;
function Validate(UserName,Password:PChar;P:PTUser):Integer;stdcall;
function TUser_ToTUser(obj:TUser_):TUser;
function TUserToTUser_(Tobj:TUser):TUser_;
implementation
function Validate(UserName,Password:PChar;P:PTUser):Integer;
var
A:PTUser;
fUser:TUser;
begin
Validate := -1;
fUser := TUser.Create;
try
fUser := FService.validate(UserName,Password);
A:=PTUser(P);
with A^ do
begin
id :=fUser.id;
name :=fUser.name;
pass :=fUser.pass;
region :=fUser.region;
username :=fUser.username;
usertype :=fUser.usertype;
end;
Validate:=0;
except
Validate := ExceptionCode;
end;
end;
function TUserToTUser_(Tobj:TUser):TUser_;
var
R:TUser_;
begin
with R do
begin
id:=Tobj.id;
name:=Tobj.name;
pass:=Tobj.pass;
region:=Tobj.region;
username:=Tobj.name;
usertype:=Tobj.usertype;
end;
TUserToTUser_:=R;
end;
function TUser_ToTUser(obj:TUser_):TUser;
var
R:TUser;
begin
R:=TUser.Create;
with R do
begin
id:=obj.id;
name:=obj.name;
pass:=obj.pass;
region:=obj.region;
username:=obj.name;
usertype:=obj.usertype;
end;
TUser_ToTUser:=R;
end;
end.
=============================================================
VC调用代码:
struct TUser
{
__int64 id;
BSTR name;
BSTR pass;
BSTR region;
BSTR username;
__int64 usertype;
};
typedef int (CALLBACK* Validate)(char* Username,char* password,TUser *tu);
Validate validate;
hDLL = LoadLibrary("G://workspace//Delphi_WorkSpace//InspectWSDll//Bin//InspectWSDll.dll");
if ( hDLL!=NULL ) {
validate = (Validate)GetProcAddress(hDLL, "Validate");
struct TUser user;
ZeroMemory(&user,sizeof(TUser));
int a=validate((LPSTR)(LPCTSTR)"test",(LPSTR)(LPCTSTR)"860821",&user);
if(a!=0)
{
AfxMessageBox("Failed!");
}
else
{
AfxMessageBox("OK!");
}
}
==================================================
注意如何向DLL里传指针的话,必须要在主程序里分配内存,不能在DLL里分配。
附上Unt_TDevice的代码:
unit Unt_TDevice;
interface
uses
Dialogs,DBAccessService ,XSBuiltIns ,CnDebug ,SysUtils,Activex ,Classes,GlobeUtils;
type
PTTDevice = ^TTDevice;
TTDevice = record
company:WideString;
flag:Int64;
id:Int64;
region:WideString;
seriesnumber:WideString;
stamp:WideString;
end;
PTDevicePage = ^TDevicePage;
TDevicePage = record
Flist:Pointer; //这是一个指向TTDevice 的指针
FpageAmount: Integer;
FpageNum: Integer;
end;
function RetrieveDevicePage1(const PageIndex: Integer; const PageSize: Integer;ParamStr_:PChar;DateStr:PChar; P:Pointer): Integer; stdcall;
function RetrieveDevicePage(const PageIndex: Integer; const PageSize: Integer; ParamStr_:PChar;P:Pointer): Integer; stdcall;
function TDeviceToTTDevice(obj:TDevice):TTDevice;
function TTDeviceToTDevice(Tobj:TTDevice):TDevice;
implementation
function TDeviceToTTDevice(Obj:TDevice):TTDevice;
var
R:TTDevice;
begin
with R do
begin
company := Obj.company;
flag := Obj.flag;
id := Obj.id;
region := Obj.region;
seriesnumber := Obj.seriesnumber;
try
stamp := DateTimeToStr(Obj.stamp.AsDateTime);
except
stamp := DateTimeToStr( now );
end;
end;
TDeviceToTTDevice:=R;
end;
function TTDeviceToTDevice(Tobj:TTDevice):TDevice;
var
w:TDevice;
dtm:TXSDateTime;
begin
w:=TDevice.Create;
with w do
begin
company := Tobj.company;
flag := Tobj.flag;
id := Tobj.id;
region := Tobj.region;
seriesnumber := Tobj.seriesnumber;
try
dtm := DateTimeToXSDateTime( StrToDateTime( Tobj.stamp ) );
except
dtm := DateTimeToXSDateTime( now );
end;
stamp := dtm;
end;
TTDeviceToTDevice:=w;
end;
function RetrieveDevicePage(const PageIndex: Integer; const PageSize: Integer; ParamStr_:PChar;P:Pointer): Integer;
var
LstIndex:Integer;
A:PTDevicePage;
RstPage:DevicePage;
PtTDevice_:PTTDevice;
begin
RetrieveDevicePage:=-1;
try
RstPage:=DevicePage.Create;
RstPage := FService.retrieveDevicePage(PageIndex,PageSize,ParamStr_);
A:=PTDevicePage(P);
A^.FpageAmount:=RstPage.pageAmount ;
A^.FpageNum:=RstPage.pageNum;
PtTDevice_:=A.Flist;
for LstIndex:=Low(RstPage.list) to High(RstPage.list) do
begin
PtTDevice_^.company := Trim_(RstPage.list[LstIndex].company);
PtTDevice_^.flag := RstPage.list[LstIndex].flag;
PtTDevice_^.id := RstPage.list[LstIndex].id;
PtTDevice_^.region := Trim_(RstPage.list[LstIndex].region);
PtTDevice_^.seriesnumber := Trim_(RstPage.list[LstIndex].seriesnumber);
PtTDevice_^.stamp := DateTimeToStr_(RstPage.list[LstIndex].stamp);
Inc(PtTDevice_);
end;
RetrieveDevicePage:=High(RstPage.list)+1;
except
RetrieveDevicePage := -100 ;
end;
end;
function RetrieveDevicePage1(const PageIndex: Integer; const PageSize: Integer; ParamStr_:PChar;DateStr:PChar;P:Pointer): Integer;
var
LstIndex:Integer;
A:PTDevicePage;
RstPage:DevicePage;
PtTDevice_:PTTDevice;
dt:TDateTime;
begin
RetrieveDevicePage1:=-1;
RstPage:=DevicePage.Create;
try
dt := StrToDateTime(DateStr);
dt := dt-FTimeZone/24;
RstPage := FService.retrieveDevicePage1(PageIndex,PageSize,ParamStr_,DateTimeToXSDateTime( dt ));
except
RstPage := nil;
RetrieveDevicePage1 := -100;
Exit;
end;
try
A:=PTDevicePage(P);
A^.FpageAmount:=RstPage.pageAmount ;
A^.FpageNum:=RstPage.pageNum;
PtTDevice_:=A.Flist; //此处包括了多个TDevice
for LstIndex:=Low(RstPage.list) to High(RstPage.list) do
begin
PtTDevice_^.company := Trim_(RstPage.list[LstIndex].company);
PtTDevice_^.flag := RstPage.list[LstIndex].flag;
PtTDevice_^.id := RstPage.list[LstIndex].id;
PtTDevice_^.region := Trim_(RstPage.list[LstIndex].region);
PtTDevice_^.seriesnumber := Trim_(RstPage.list[LstIndex].seriesnumber);
PtTDevice_^.stamp := DateTimeToStr_(RstPage.list[LstIndex].stamp);
Inc(PtTDevice_); 指针向前移动
end;
RetrieveDevicePage1:=High(RstPage.list)+1;
except
RetrieveDevicePage1 := -100 ;
end;
end;
initialization
finalization
end.
VC内定义:
struct TDevice
{
BSTR company;
__int64 flag;
__int64 id;
BSTR region;
BSTR seriesnumber;
BSTR stamp;
};
struct DevicePage
{
TDevice *list;
int pageAmount;
int pageNum;
};