udpserver,udpclient 用delphi7 7封装在dll 里,udpserver 接受一个设备的udp数据,udpclient 发送数据到设备,
用xe 调用dll 接收数据正常,发送数据报av 00409D85 的内存错误,用delphi 7 调用这个dll 收发数据都正常,这是怎么回事,希望高手能解答下!
用xe 调用dll 接收数据正常,发送数据报av 00409D85 的内存错误,用delphi 7 调用这个dll 收发数据都正常,这是怎么回事,希望高手能解答下!
library ZHPRReadCard;uses
SysUtils,
IdBaseComponent,
IdComponent,
IdUDPBase,
IdUDPServer,
IdUDPClient,
System,
IdSocketHandle,
Dialogs,
Windows,
Messages,
Classes; type
TClientClass = class public
IDUDPS: TIdUDPServer;
sIDUDPS: TIdUDPClient;
procedure IDUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
procedure openudp;
procedure closeudp;
procedure StartReadCard;
procedure Openontjdq;
constructor Create;
destructor Destroy; override; end;
var
fhand:hwnd;
fipaddress:string;
fport:Integer;
FClient:TClientClass;
// myudp:TIdUDPServer;
const WM_YOURMSG=WM_USER+200;
{$R *.res}
function StrToHex(AStr: String):String;
var
i: Integer;
begin
result := '';
for i := 1 to Length(AStr) do
result := result + IntToHex(ord(AStr[i]), 2);
end;function readinit(hand:hwnd;ipaddress:string;port:Integer):Boolean;stdcall;
begin
fhand:=hand;
fipaddress:=ipaddress;
fport:=port;
if FClient = nil then
begin
FClient := TClientClass.Create;
Result := True;
end
else
begin
Result := False;
end;end;function OpenRead:Boolean;stdcall;
begin
if FClient<>nil then
begin
FClient.openudp;
Result:=True;
end
else Result:=False;
end;function CloseRead:Boolean;stdcall;
begin
if FClient<>nil then
begin
FClient.closeudp;
Result:=True;
end
else Result:=False;
end;function StareReadcard:Boolean;stdcall;
begin
if FClient<>nil then
begin
FClient.StartReadCard;
Result:=True;
end
else Result:=False;
end;function Openontjdq:Boolean;stdcall;
begin
if FClient<>nil then
begin
FClient.Openontjdq;
Result:=True;
end
else Result:=False;
end;
exports
OpenRead,
closeread,
StareReadcard,
Openontjdq,
readinit;
{ TClientClass }constructor TClientClass.Create;
begin
inherited;
IdUDPS := TIdUDPServer.Create(nil);
sIdUDPS := TIdUDPClient.Create(nil);
IDUDPS.DefaultPort:=fport;
IDUDPS.ThreadedEvent:=True;
IDUDPS.BufferSize:=8192;
IdUDPS.OnUDPRead := IDUDPRead;
//IdUDPS.Active := True;
end;destructor TClientClass.Destroy;
begin
FClient.Free;
inherited;
end;procedure TClientClass.Openontjdq;
var
ssh:array[0..5] of Byte;
begin
ssh[0]:=$05;
ssh[1]:=$00;
ssh[2]:=$3C;
ssh[3]:=$01;
ssh[4]:=$FD;
ssh[5]:=$63;
sIDUDPS.SendBuffer(fipaddress,fport,ssh,Length(ssh));
end;procedure TClientClass.StartReadCard; // 开始读卡
var
ssh:array[0..4] of Byte;begin
ssh[0]:=$04;
ssh[1]:=$00;
ssh[2]:=$01;
ssh[3]:=$DB;
ssh[4]:=$4B; sIDUDPS.SendBuffer(fipaddress,fport,ssh,Length(ssh));end;procedure TClientClass.openudp;
begin
IDUDPS.Active:=True;
end;procedure TClientClass.closeudp;
begin
IDUDPS.Active:=False;
end;procedure TClientClass.IDUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
fRecvUDPstring:string;
DataStringStream:tstringstream;
cDataParam: TCopyDataStruct;
msg: AnsiString;
begin
DataStringStream:=tstringstream.Create('');
TRY
DataStringStream.CopyFrom(adata,adata.Size);
fRecvUDPstring:=DataStringStream.DataString;
// RemostIP:= ABinding.PeerIP;
finally
DataStringStream.Free;
end;
msg:=StrToHex(fRecvUDPstring);
if fhand<>0 then
begin
cDataParam.dwData := WM_YOURMSG;
cDataParam.cbData := length(msg)* sizeof(char)+1;
cDataParam.lpData := @msg[1];
SendMessage(fhand, WM_COPYDATA,0, LPARAM(@cDataParam));
end;
end;
beginend.
这是代码帮忙看看?谢谢
不知道你调用的程序是用什么写的,如果不是delphi估计就不要用string了
如果是delphi,那最好引用sharemm之类的东西,并用相同的delphi编译dll和exe吧或许是别的问题也不一定