在Dll中代码如下:
procedure s_Msg(pc_Info: PChar);
begin
 Application.MessageBox(pc_Info,'提示',mb_OK);
end;
exports
 s_Msg;
在主程序中调用如下:
procedure s_Msg(pc_Info: PChar); stdcall;external 'Test.dll'procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  s_Msg(PChar('张三和李四'));
end;
但在弹出对话框中显示出来的是乱码。谢谢!

解决方案 »

  1.   

    你在DLL中的函数声明是stdcall方式传递参数的吗?
      

  2.   

    试一下
    Application.MessageBox(string(pc_Info),'提示',mb_OK);
      

  3.   

    procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
      s_Msg(PChar('张三和李四'));
    end;>>>这样才行:var
      p : pchar;
    begin 
      p := stralloc(11);
      fillchar(p^,11,0);
      p := '张三和李四';
      s_msg( p );
    end;
      

  4.   

    PCHAR是个指针 楼上正解 要初始化一下
      

  5.   

    主程序中写了调用约定是stdcall,但dll中确没写调用约定,默认是register,当然出错这里用的是常量,当然不需要分配堆内存dll中怎么会不可以传PChar?这可是唯一通行的字符串传递标准.楼主本身的做法也值得商榷直接调API MessageBox不好?为了一个Application,多引用了不必要的单元,让dll的体积大了很多.其实这个dll可以只有几K大.
      

  6.   

    用String?CSDN每年倒是都有很多初学者发帖问,调用DLL如何用String做参数的问题.
      

  7.   

    ehom 说的非常正确就是在dll的代码中漏了一个stdcall声明,加上就行了,其他什么都不用改。在Test.Dll中代码如下:
    procedure s_Msg(pc_Info: PChar); stdcall;
    begin
     Application.MessageBox(pc_Info,'提示',mb_OK);
    end;
    exports
     s_Msg;
    在主程序中调用如下:
    procedure s_Msg(pc_Info: PChar); stdcall;external 'Test.dll'procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
      s_Msg(PChar('张三和李四'));
    end;
      

  8.   

    这个MessageBox还是直接用API的好,函数很简单,所以没必要为了省这么点事儿把VCL弄进来。
      

  9.   

    //procedure s_Msg(pc_Info: PChar);
    procedure s_Msg(pc_Info: PChar);stdcall;//此处加stdcall
    begin
     Application.MessageBox(pc_Info,'提示',mb_OK);
    end;
    exports
     s_Msg;
      

  10.   

    是这样的,如果是外面传入的参数的话不要用STRING ,要用PCHAR 
    如果是DLL 内部用的话是可以用STRING 的.你试一下吧.
      

  11.   

    接口必须是PChar
    内部处理就可以是String的http://lysoft.7u7.net