dll是用vc写的。其接口函数如下:
int _stdacll ReceiveSMEX(bool *IsReprot,Char* Source, Int *iLen,Char* MsgCon,Char* MsgID,int *Stat,Char *Dest)delphi调用的过程如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TRecvSm=function (IsReport:boolean;Src:pchar;iLen:integer;
SmCon,MsgID:pchar;State:Integer;Dest:pchar):integer;stdcall;
TForm1 = class(TForm)
btn_Login: TButton;
Edit1: TEdit;
Memo1: TMemo;
RecvTimer: TTimer;
procedure btn_LoginClick(Sender: TObject);
procedure RecvTimerTimer(Sender: TObject);
private
{ Private declarations }
SrvIP:array[0..31] of char;
UserName:array[0..15] of char;
Pwd:array[0..31] of char;
Handle:THandle;
RecvSm:TRecvSm;
public
{ Public declarations }
procedure AddMsgToMemo(str:string);
end;var
Form1: TForm1;
function Login(Const SvcIP:pchar;Port:integer;Const UserName,Pwd:pchar):integer;stdcall;external 'Client.dll';
implementation
{$R *.dfm}procedure TForm1.AddMsgToMemo(str: string);
begin
Memo1.Lines.Add(str+#10#13);
end;procedure TForm1.btn_LoginClick(Sender: TObject);
begin
SrvIp :='192.168.16.12';
UserName :='cl';
Pwd :='cl888';
Edit1.Text := IntToStr(Login(SrvIp,47271,UserName,Pwd));
Handle := LoadLibrary('Client.dll');
if Handle<>0 then
begin
@RecvSm := GetProcAddress(Handle,'ReceiveSMEx');
if @RecvSM<>nil then
begin
AddMsgToMemo('载入接收动态链接库成功');
RecvTimer.Enabled := True;
end
else
begin
FreeLibrary(Handle);
AddMsgToMemo('载入接收动态链接库失败');
end;
end;
end;procedure TForm1.RecvTimerTimer(Sender: TObject);
var
IsReport:Boolean;
Src:array [0..20] of char;
Dest: array[0..20] of char;
iLen,Stat,GateID,iRecv:integer;
MsgCon: array [0..256] of char;
MsgID: array[0..8] of char;
begin
RecvTimer.Enabled := False; ZeroMemory(@Src,sizeof(SrcPhone));
ZeroMemory(@Dest,sizeof(DestPhone));
ZeroMemory(@MsgCon,sizeof(MsgCon));
ZeroMemory(@MsgID,sizeof(MsgID));
{iRecv := RecvSm(IsReport,Src,iLen,MsgCon,MsgID,Stat,Dest);
case iRecv of
0: begin
AddMsgToMemo('数据接受成功'); end;
1: begin
end;
2: AddMsgToMemo('用户尚未登陆');
3: AddMsgToMemo('接收参数错误');
4: AddMsgToMemo('网络连接失败');
end; }
RecvTimer.Enabled := True;end;end.问题如下:当接收数据完成之后,程序就报出地址错误。
各位大虾请帮忙看看上述调用的问题
int _stdacll ReceiveSMEX(bool *IsReprot,Char* Source, Int *iLen,Char* MsgCon,Char* MsgID,int *Stat,Char *Dest)delphi调用的过程如下:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TRecvSm=function (IsReport:boolean;Src:pchar;iLen:integer;
SmCon,MsgID:pchar;State:Integer;Dest:pchar):integer;stdcall;
TForm1 = class(TForm)
btn_Login: TButton;
Edit1: TEdit;
Memo1: TMemo;
RecvTimer: TTimer;
procedure btn_LoginClick(Sender: TObject);
procedure RecvTimerTimer(Sender: TObject);
private
{ Private declarations }
SrvIP:array[0..31] of char;
UserName:array[0..15] of char;
Pwd:array[0..31] of char;
Handle:THandle;
RecvSm:TRecvSm;
public
{ Public declarations }
procedure AddMsgToMemo(str:string);
end;var
Form1: TForm1;
function Login(Const SvcIP:pchar;Port:integer;Const UserName,Pwd:pchar):integer;stdcall;external 'Client.dll';
implementation
{$R *.dfm}procedure TForm1.AddMsgToMemo(str: string);
begin
Memo1.Lines.Add(str+#10#13);
end;procedure TForm1.btn_LoginClick(Sender: TObject);
begin
SrvIp :='192.168.16.12';
UserName :='cl';
Pwd :='cl888';
Edit1.Text := IntToStr(Login(SrvIp,47271,UserName,Pwd));
Handle := LoadLibrary('Client.dll');
if Handle<>0 then
begin
@RecvSm := GetProcAddress(Handle,'ReceiveSMEx');
if @RecvSM<>nil then
begin
AddMsgToMemo('载入接收动态链接库成功');
RecvTimer.Enabled := True;
end
else
begin
FreeLibrary(Handle);
AddMsgToMemo('载入接收动态链接库失败');
end;
end;
end;procedure TForm1.RecvTimerTimer(Sender: TObject);
var
IsReport:Boolean;
Src:array [0..20] of char;
Dest: array[0..20] of char;
iLen,Stat,GateID,iRecv:integer;
MsgCon: array [0..256] of char;
MsgID: array[0..8] of char;
begin
RecvTimer.Enabled := False; ZeroMemory(@Src,sizeof(SrcPhone));
ZeroMemory(@Dest,sizeof(DestPhone));
ZeroMemory(@MsgCon,sizeof(MsgCon));
ZeroMemory(@MsgID,sizeof(MsgID));
{iRecv := RecvSm(IsReport,Src,iLen,MsgCon,MsgID,Stat,Dest);
case iRecv of
0: begin
AddMsgToMemo('数据接受成功'); end;
1: begin
end;
2: AddMsgToMemo('用户尚未登陆');
3: AddMsgToMemo('接收参数错误');
4: AddMsgToMemo('网络连接失败');
end; }
RecvTimer.Enabled := True;end;end.问题如下:当接收数据完成之后,程序就报出地址错误。
各位大虾请帮忙看看上述调用的问题
TRecvSm = function (IsReport:PBoolean;Src:pchar;iLen:Pinteger;
SmCon,MsgID:pchar;State:PInteger;Dest:pchar):integer;stdcall;procedure TForm1.RecvTimerTimer(Sender: TObject);
var
IsReport:PBoolean;
Src:array [0..20] of char;
Dest: array[0..20] of char;
iLen,Stat,GateID,iRecv:Pinteger;
MsgCon: array [0..256] of char;
MsgID: array[0..8] of char;
begin
getMem(IsReport, sizeof(boolean));
getMem(iLen, sizeof(integer));
getMem(Stat, sizeof(integer));
getMem(GateID, sizeof(integer));
getMem(iRecv, sizeof(integer));
RecvTimer.Enabled := False; ZeroMemory(IsReport,sizeof(boolean));
ZeroMemory(iLen,sizeof(integer));
ZeroMemory(Stat,sizeof(integer));
ZeroMemory(GateID,sizeof(integer));
ZeroMemory(iRecv,sizeof(integer));
{iRecv := RecvSm(IsReport,Src,iLen,MsgCon,MsgID,Stat,Dest);
case iRecv of
0: begin
AddMsgToMemo('数据接受成功' + intToStr(MsgID^)); end;
1: begin
end;
2: AddMsgToMemo('用户尚未登陆');
3: AddMsgToMemo('接收参数错误');
4: AddMsgToMemo('网络连接失败');
end; }
RecvTimer.Enabled := True;end;
调用约定使用stdcall