用delphi做了一个dll,pb调用过程中总会非法操作!(请见问题的内容);(200分)

  • 主题发起人 主题发起人 zhoule
  • 开始时间 开始时间
Z

zhoule

Unregistered / Unconfirmed
GUEST, unregistred user!
dll中的函数如下:

function pass_str(var a,b:string):string;
begin
pass_str :=a + b;
end

delphi生成的dll,给power builder使用。
试过各种 变量类型(),pb调用过程中均会非法操作。
 
修改一下:

implemetation

function pass_str(var a,b:string):string; external dllname index 1;
{dll 为单元名,如 'unit1'}
begin
pass_str :=a + b;
end

注: 如果编写dll,dll必须单独编译,不会自动被编译。

 
你应当用shortstring传递参数。
function pass_str(var a,b:shortstring):shortstring;
 
传递参数用PChar,不要用string.

function pass_str(var a,b:PChar):PChar;stdcall;

这里还牵涉到一个内存分配的问题,解决办法可以看:
http://202.120.85.61/delphibbs/DispQ.asp?LID=207101
 
agree with dreamtiger
 
最好连返回的 pchar 指向的buffer都由调用者提供
 
最好用PwideChar
 
PwideChar 就没必要了吧,用起来太麻烦了,
而且也不知道在pb怎么对应
 
還是pchar比較好哦
 
pchar,stdcall最好,其它程序可以调用
另外,看M$的Help,不论什么时候,它在传指针的时候都不会
忘记加一个长度的整型变量,以指定指针的内容大小,所以你最好
也加一个指示指针内容大小的整型变量。要不然,指针操作错误,
说不好会整死谁,可能主调函数,也可能是那瘟... ... 不好说!
 
请修改!谢谢。

library my_dll;

uses
SysUtils,
Classes ,
dll_test in 'dll_test.pas' {Form1};


exports
my_test;
begin
end.
//------------------------------------------
unit dll_test
interface

uses
Windows, Messages, SysUtils, Classes,Controls,Dialogs,StdCtrls;

type
private
{ Private declarations }
public
{ Public declarations }
end;

var

function my_test(var a:String):string;export;
implementation

{$R *.DFM}
function my_test(var a,b:string):string;
//试过各种 变量类型(string,pchar,lptstr),
begin
my_test := a + b ;
//如果用 my_test :='sssss',mytest 定义为lptstr
//可以有返回值。

end;

end.

delphi生成的dll,给power builder使用。

试过各种 变量类型(string,pchar,lptstr),
pb调用过程中均会非法操作。

希望可以帮忙,并详细解释!
 
>>function my_test(var a:String):string;export;
function my_test(a, b: PChar): PChar; stdcall; export;
implementation

{$R *.DFM}
>>function my_test(var a,b:string):string;
function my_test(a, b: PChar): PChar;
begin
>> my_test := a + b ;
Result := PChar(StrPas(a) + StrPas(b));
end;
 
我也遇到此问题,我按 another_eyes 方法不行,
敬请各位高手解答!
 
兄弟们,不要返回string的值,带个pchar的返回吧,而且好象还个boolean的返回时也不行。
我都写了个dll来在pb中用了。一点问题都没有啊!!!!
我自己copy了段代码作成dll供pb用的。
library HostInfo;

uses
SysUtils, Classes, winsock, windows, ping;
var
wVersionRequested: WORD;
wsaData: TWSAData;
pinghost: tping;
{$R *.RES}

function HostIp: pchar; stdcall;
var
p: PHostEnt;
s: array[0..128] of char;
p2: pchar;
begin
{获得计算机名}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
GetHostName(@s, 128);
p := GetHostByName(@s);
{获得本机的ip地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
result := p2;
WSACleanup;
end;

function HostName: pchar; stdcall;
var
p: PHostEnt;
s: array[0..128] of char;
begin
{获得计算机名}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
GetHostName(@s, 128);
p := GetHostByName(@s);
{获得本机的ip地址}
result := p^.h_Name;
WSACleanup;
end;

function PingHostIp(ip: string): PChar; stdcall;
var
errstr: string;
begin
pinghost := tping.Create(pinghost);
Pinghost.Address := ip;
pinghost.Ping;
errstr := pinghost.errorstring;
if errstr <> 'No error' then
Result := 'False'
else
Result := 'True';
end;

exports
HostIp, HostName,PingHostIp;
begin
end.

pb中的声明
function string PingHostIp(string ip) LIBRARY "HostInfo.dll" ALIAS FOR "PingHostIp"
function string HostIp() LIBRARY "HostInfo.dll" ALIAS FOR "HostIp"
 
我发现string不能用在Dll中当参数,其实只要将String改成widestring就可以了
 
pb这破软件,支持的数据类型比c少多了,好象类型的根本想不到在pb中找到可以代替的类型的。
 
多人接受答案了。
 
后退
顶部