********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"

解决方案 »

  1.   

    function f_abc(InStr:PCHAR;var OutStr:PCHAR ):Integer;stdcall;
    var
     str:String;
    begin
      Str := 'abc123' + String(InStr);
      //OutStr := PCHAR(str) ;
                        StrCopy(OutStr,Pchar(str));                    
      result := 0;
    end;
    exports
      f_abc;
    end.
      

  2.   

    内存异常问题,你返回的是str(局部变量) 的指针,当程序执行完成后系统自动销毁了。你再去访问他的地址会发生异常的。
      以前我也遇到过这个问题,而确提了问题,后来在大家的帮助下解决了问题,但是现在在我的问题列表里找不到了你看搜索看看。
      

  3.   

    谢谢 coreblood(IunKnow),好像还是不行,还报了内存错误,对了,我用的是PB6.5
      

  4.   

    请  coreblood(IunKnow)  再帮我看看,谢谢了
      

  5.   

    在调用函数前请给指针分配足够的空间http://community.csdn.net/Expert/topic/4406/4406690.xml?temp=.9058191
      

  6.   

    PB我没用过,但无论是你的dll定义,或调用都有问题
    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;
      

  7.   

    http://topic.csdn.net/TopicFiles/2005/04/09/10/3921825.xml
      

  8.   

    function f_abc(InStr:PCHAR;var OutStr:PCHAR ):Integer;stdcall;改成
    function f_abc(const InStr:PCHAR;const OutStr:PCHAR ):Integer;stdcall;