delphi调用C写的DLL有关问题
delphi调用C写的DLL问题
C的接口:unsigned char* GetData(unsigned char* ip)
我在DELPHI调用的代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function GetTankTemp(StrIP:PChar):PChar;stdcall;external 'GetTankTemp.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
ip,temp : pchar;
begin
ip := '10.120.1.10';
Temp:= GetTankTemp(ip);
showmessage(temp);
end;
end.
返回一直是空,应该是有值的,请大家帮忙是哪个地方写错了,谢谢...
------解决方案--------------------
可能是DLL中的参数不标准吧>>>
------解决方案--------------------
不知道DLL函数返回的是哪里的地址,如果不是返回参数本身或者动态分配的地址,是不能正确返回到应用程序中的
------解决方案--------------------
早就看出你的调用约定错了, 只是没说
另外返回哪里有这么返回的
static char *sdata;
sdata = &recv_msg[0];
return sdata;
recv_msg 退栈就没了。
------解决方案--------------------
跟踪下 Temp:= GetTankTemp(ip);
建议一个字节一个字节的看下,showmessage看到的为空不一定对应空间没数据吧。
------解决方案--------------------
我前面已经说了几次了,应用程序不能与DLL共享数据,GetTankTemp应定义为类似
GetTankTemp(StrIP: PChar; TankTemp: PChar)的形式,通过参数传递,TankTemp应是一个char类型数组的首地址,DLL中将数据拷贝到TankTemp即可。
------解决方案--------------------
你这样用是不行的,你需要注册的时候使用 regasm xxx.dll /tlb mydll.tlb 导出一个tlb文件,然后再工程里面引用这个tlb,就没有任何问题
C的接口:unsigned char* GetData(unsigned char* ip)
我在DELPHI调用的代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function GetTankTemp(StrIP:PChar):PChar;stdcall;external 'GetTankTemp.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
ip,temp : pchar;
begin
ip := '10.120.1.10';
Temp:= GetTankTemp(ip);
showmessage(temp);
end;
end.
返回一直是空,应该是有值的,请大家帮忙是哪个地方写错了,谢谢...
------解决方案--------------------
可能是DLL中的参数不标准吧>>>
------解决方案--------------------
不知道DLL函数返回的是哪里的地址,如果不是返回参数本身或者动态分配的地址,是不能正确返回到应用程序中的
------解决方案--------------------
早就看出你的调用约定错了, 只是没说
另外返回哪里有这么返回的
static char *sdata;
sdata = &recv_msg[0];
return sdata;
recv_msg 退栈就没了。
------解决方案--------------------
跟踪下 Temp:= GetTankTemp(ip);
建议一个字节一个字节的看下,showmessage看到的为空不一定对应空间没数据吧。
------解决方案--------------------
我前面已经说了几次了,应用程序不能与DLL共享数据,GetTankTemp应定义为类似
GetTankTemp(StrIP: PChar; TankTemp: PChar)的形式,通过参数传递,TankTemp应是一个char类型数组的首地址,DLL中将数据拷贝到TankTemp即可。
------解决方案--------------------
你这样用是不行的,你需要注册的时候使用 regasm xxx.dll /tlb mydll.tlb 导出一个tlb文件,然后再工程里面引用这个tlb,就没有任何问题