网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 网络学院 >> 程序设计 >> Delphi编程 >> 文章正文
  VC调用DELPHI编写的DLL            【字体:
VC调用DELPHI编写的DLL
作者:佚名    文章来源:不详    点击数:    更新时间:2007-9-12    

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


 




本文来源:http://blog.csdn.net/peirenlei/archive/2007/08/27/1761066.aspx
站内文章搜索 高级搜索
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
     在delphi中使用xml文档有…
     初探delphi 7 中的插件编…
     delphi 2006(dexter) & …
     获得windows的版本信息。
     “序列号输入助手”源代…
     rs232串口通讯模块
     ado方式下判断数据表是否…
  • Ant入门-配置和使用     选…

  • 浅析Spring框架下PropertyPl…

  • 在spring MVC中配置多个视图

  • 基于对称延拓的小波变换算法…

  • OpenCV在VC.net,VC6.0等中的…

  • VC++消息映射

  • MVP——Model-Viewer-Presen…

  • C++ Object Model

  • 共合网被评为2006-2007最受V…

  • 安装 VC++ 重启

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    网络学院©2007 www.23book.net
    为您提供web编程,vb编程,vc编程,服务器架设管理,数据库设计等方面的知识 站长:David