首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB中怎么调用DLL中的二级指针,下面有DELPHI的DEMO,有没有哪位能帮小弟我把红色部分改成VB6的,万分感谢

2012-01-09 
VB中如何调用DLL中的二级指针,下面有DELPHI的DEMO,有没有哪位大虾能帮我把红色部分改成VB6的,万分感谢!VB

VB中如何调用DLL中的二级指针,下面有DELPHI的DEMO,有没有哪位大虾能帮我把红色部分改成VB6的,万分感谢!
VB中如何调用DLL中的二级指针,下面有DELPHI的DEMO,有没有哪位大虾能帮我把红色部分改成VB6的,万分感谢!


库函数说明 
1.1 int __stdcall TestPort(unsigned char PortNo,unsigned long BaudRate) 

/****************************************************************************** 
参数入口: 
PortNo:所要测试的串口号,1代表COM1,2代表COM2,以此类推。 
BaudRate:通信所用的比特率,如9600,19200等,RFP-08型万能机为9600。 
返回值:测试成功为0,否则为一个非0的值。 
函数功能:测试通信端口是否能与试验机联机。 
*****************************************************************************/ 
 
1.2 void __stdcall SetRecDataProc(void ** Proc)

/******************************************************************************
参数入口:
Proc:指向数据接收函数的指针的指针(二级指针),其函数据参数列表如下所示:
void __stdcall (*RecItemProc)(double Force,double Displacement,double Extend);
Force指力值,Displacement指位移,Extend指变形。
返回值:无返回值。
函数功能:设置一个回调函数,当接收到试验机的数据时,调用此函数,传送力值、位移与变形给客户程序。 *****************************************************************************/ 
 
1.3 int __stdcall Connect(unsigned char PortNo,unsigned long BaudRate) 

/****************************************************************************** 
参数入口: 
PortNo:所要联机的串口号,1代表COM1,2代表COM2,以此类推。 
BaudRate:通信所用的比特率,如9600,19200等,RFP-08型万能机为9600。 
返回值:联机成功为0,否则为一个非0的值。 
函数功能:使试验机进入联机检测状态,试验机定时发送数,RFComm32接收到数据后转发给客户程序。 
 
*****************************************************************************/ 
 
1.4 int __stdcall Disconnect() 

/****************************************************************************** 
参数入口:无参数 
返回值:脱机成功为0,否则为一个非0的值。 
函数功能:使试验机进入脱机状态。 
*****************************************************************************/ 
 
 
 
1.5 int __stdcall SensorZero(int Style) 

/****************************************************************************** 
参数入口: 
Style:所要清零的传感器,0指力值传感器,1指变形传感器,2指位移传感器 
返回值:联机成功为0,否则为一个非0的值。 
函数功能:传感器清零。 
*****************************************************************************/ 
 
1.6 int __stdcall Inline() 

/****************************************************************************** 
参数入口: 
返回值:联机成功为0,否则为一个非0的值。 
函数功能:计算是否在线。15秒之内必需发送一次。建义每7秒发送一次。 
*****************************************************************************/ 


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
type
TRecItemProc = procedure(Force:Double;Displacement:Double;Extend:Double);stdcall;
PRecItemProc = ^TRecItemProc;
TTestPortProc = function(PortNo:Byte;Baud: DWORD):Integer;stdcall;
TSetRecDataProc = procedure(var Proc:PRecItemProc);stdcall;
TConnectProc = function(PortNo:Byte;Baud:DWORD):Integer;stdcall;
TDisconnectProc = function():Integer;stdcall;
TSensorZeroProc = function(Style:Integer):Integer;stdcall;
TInlineProc = function():Integer;stdcall;


type
  TForm1 = class(TForm)
  lbl1: TLabel;
  cbbPortNo: TComboBox;
  btn4: TButton;
  grp1: TGroupBox;
  edtForce: TEdit;
  btn1: TButton;
  grp2: TGroupBox;
  edtDisplacement: TEdit;
  btn2: TButton;
  grp3: TGroupBox;
  edtExtend: TEdit;
  btn3: TButton;
  btnStop: TButton;
  btnStart: TButton;
  Timer1: TTimer;
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure btn4Click(Sender: TObject);


  procedure btn1Click(Sender: TObject);
  procedure btn2Click(Sender: TObject);
  procedure btn3Click(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
  procedure btnStartClick(Sender: TObject);
  procedure btnStopClick(Sender: TObject);
  private
  { Private declarations }
  hInst: THandle;
  TestPortProc: TTestPortProc;
  SetRecDataProc: TSetRecDataProc;
  ConnectProc: TConnectProc;
  DisconnectProc: TDisconnectProc;
  SensorZeroProc: TSensorZeroProc;
  InlineProc: TInlineProc;
  public
  { Public declarations }
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure RecItemProc(Force:Double;Displacement:Double;
Extend:Double);stdcall;
begin
with Form1 do
begin
edtForce.Text := FloatToStrF(Force,ffFixed,8,3);
edtDisplacement.Text := FloatToStrF(Displacement,ffFixed,8,3);
edtExtend.Text := FloatToStrF(Extend,ffFixed,8,3);
end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  SensorZeroProc(0);
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
  SensorZeroProc(2);
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
  SensorZeroProc(1);
end;

procedure TForm1.btn4Click(Sender: TObject);
var PortNo:Byte;
begin
  PortNo := cbbPortNo.ItemIndex + 1; 
  if TestPortProc(PortNo,9600) = 0 then
  MessageBox(Handle,'串口测试成功!','信息',MB_OK)
  else
  MessageBox(Handle,'此串口不能使用!','信息',MB_OK);
end;

procedure TForm1.btnStartClick(Sender: TObject);
var PortNo:Integer;
begin
  PortNo := cbbPortNo.ItemIndex + 1;
if ConnectProc(PortNo,9600) = 0 then
  begin
  btnStop.Enabled := true;
btnStart.Enabled := false;
Timer1.Enabled := true;
btn1.Enabled := true;
btn2.Enabled := true;
btn3.Enabled := true;
  end;
end;

procedure TForm1.btnStopClick(Sender: TObject);
begin
  if (DisconnectProc() = 0) then
  begin
btnStop.Enabled := false;
btnStart.Enabled := true;
Timer1.Enabled := false;
btn1.Enabled := false;
btn2.Enabled := false;
btn3.Enabled := false;
end
end;

procedure TForm1.FormCreate(Sender: TObject);
var pFunProc:PRecItemProc;
begin
  hInst := LoadLibrary('RFComm32.dll');
  @TestPortProc := GetProcAddress(hInst,'TestPort');
  @SetRecDataProc := GetProcAddress(hInst,'SetRecDataProc');
  @ConnectProc := GetProcAddress(hInst,'Connect');
  @DisconnectProc := GetProcAddress(hInst,'Disconnect');
  @SensorZeroProc := GetProcAddress(hInst,'SensorZero');
  @InlineProc := GetProcAddress(hInst,'Inline');
  
  if Assigned(@SetRecDataProc) then
  begin
  pFunProc := @RecItemProc;
  SetRecDataProc(pFunProc);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeLibrary(hInst);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  InlineProc();
end;

end.

[解决办法]
看看这个行不行:
http://topic.csdn.net/u/20100404/21/44771915-0b4c-45ac-ab3d-e43a48ae5a79.html?32741
[解决办法]

VB code
Declare Sub SetRecDataProc Lib "unknown.dll" (Proc As Long)'必须在bas模块中声明Sub RecItemProc(ByVal Force As Double, ByVal Displacement As Double, ByVal Extend As Double)End SubFunction GetFuncPtr(ByVal Ptr As Long) As Long    GetFuncPtr = PtrEnd FunctionPrivate Sub Command1_Click()    SetRecDataProc GetFuncPtr(AddressOf RecItemProc)End Sub 


[解决办法]
帮顶一下.....

热点排行