********DELPHI 中生成DLL代码如下************* library Project3;
{ Important note about DLL memory management: ShareMem .. }
uses
SysUtils,windows,
Classes;
{$R *.res} function f_abc(InStr:PCHAR;var OutStr:PCHAR ):Integer;stdcall;
var
str:String;
begin
Str := 'abc123' + String(InStr);
OutStr := PCHAR(str) ;
result := 0;
end;
exports
f_abc;
end.
****************************************************PB中在Global External Function 声明如下*********** FUNCTION int f_abc( ref string s1 , ref string s2 ) Library "..\barprint\Project3.DLL"
******在PB中某按钮的 clicked 事件中代码如下******
string s_b1,s_b2
s_b1 = 'def123'
f_abc(s_b1,s_b2)
messagebox('结果:',s_b2)
*******************************************************
但运行后点击按钮后出现的 messagebox 里内容(s_b2) 的结果是乱码,
而不是预计结果 "abc123def123"
{ Important note about DLL memory management: ShareMem .. }
uses
SysUtils,windows,
Classes;
{$R *.res} function f_abc(InStr:PCHAR;var OutStr:PCHAR ):Integer;stdcall;
var
str:String;
begin
Str := 'abc123' + String(InStr);
OutStr := PCHAR(str) ;
result := 0;
end;
exports
f_abc;
end.
****************************************************PB中在Global External Function 声明如下*********** FUNCTION int f_abc( ref string s1 , ref string s2 ) Library "..\barprint\Project3.DLL"
******在PB中某按钮的 clicked 事件中代码如下******
string s_b1,s_b2
s_b1 = 'def123'
f_abc(s_b1,s_b2)
messagebox('结果:',s_b2)
*******************************************************
但运行后点击按钮后出现的 messagebox 里内容(s_b2) 的结果是乱码,
而不是预计结果 "abc123def123"
var
str:String;
begin
Str := 'abc123' + String(InStr);
//OutStr := PCHAR(str) ;
StrCopy(OutStr,Pchar(str));
result := 0;
end;
exports
f_abc;
end.
以前我也遇到过这个问题,而确提了问题,后来在大家的帮助下解决了问题,但是现在在我的问题列表里找不到了你看搜索看看。
1.dll的定义
function f_abc(InStr:PCHAR;var OutStr:PCHAR ):Integer;stdcall;
var
str:String;
begin
Str := 'abc123' + String(InStr);
// OutStr := PCHAR(str) ; 你将outstr重新义到了栈上,程序退出时,str被释放了
StrCopy(OutStr,pchar(str)); // outstr在调用程序中分配空间
result := 0;
end;
2.调用,我不知PB有无类型pchar的类型,怎样申请内存或分配空间,如果是delphi,可用
var
s_b1,s_b2:pchar;
...
s_b1:='123456';
getmem(s_b2,20); //要>13
f_abc(s_b1,s_b2);
...
freemem(s_b2); //要释放内存
或简单地将s_b2定义成
s_b2:array[0..20] of char;
function f_abc(const InStr:PCHAR;const OutStr:PCHAR ):Integer;stdcall;