现在的位置: 首页 > 综合 > 正文

VC调用DELPHI编写的DLL

2013年01月04日 ⁄ 综合 ⁄ 共 5925字 ⁄ 字号 评论关闭

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;
};

 

抱歉!评论已关闭.