library TestDll;uses
  SysUtils,Variants,
  Classes;{$R *.res}function Test(ID:Integer;var v:Variant):Boolean;stdcall;
var c:PChar;
begin
  Result :=false;
  Case ID Of
    0:v :=100;
    1:v :=12.3456;
  Else
    v :=VarArrayCreate([0,0],varVariant);
    v[0] :='abcdefg';
  End;
end;exports
  Test;
begin
end.
procedure TForm1.Button1Click(Sender: TObject);
var h:Cardinal;v:Variant;MyFun:function(ID:Integer;var v:Variant):Boolean;stdcall;
    s :String;
begin
  h :=LoadLibrary('TestDll.dll');
  try
    if h<>0 then
    begin
      MyFun :=GetProcAddress(h,'Test');
      if @MyFun<>nil then
      try
        if MyFun(self.SpinEdit1.Value,v) then
          s :='true '
        else s :='false ';
if not VarIsArray(v) then
        s :=s+VarToStr(v)
else
s :=s+v[0];
        Memo1.Lines.Add(s);
      except
        Memo1.Lines.Add('Err');
      end;
    end;
  finally
     FreeLibrary(h);
  end;
end;

解决方案 »

  1.   

    Delphi写的dll供Delphi写的程序调用不用考虑string与pchar的问题
      

  2.   

    创意、自由、灵活,超强的报表功能,
    独特的双数据源连接,全功能的表格组件!http://www.anylib.com
      

  3.   

    那C#调用Delphi的DLL时  对方用了string[255]  我只能在C#里对应 该如何做啊?
      

  4.   

    增加一个Dll就行了,忘了是什么了.是宝蓝的.
      

  5.   

    呵呵,这有什么,如果调用者也是由delphi开发的,基本上所以的delphi的对像全部可以传进传出!努力学习 oracle ebs 中
      

  6.   

    使用STRING作为参数,需要USES DELPHIMM
      

  7.   

    原来用变数做参数~
    还不如用PChar更方便
      

  8.   

    好像是加个sharememory单元就可以了吧
      

  9.   

    是不是有点多余?
    如果调用者是Delphi开发的,直接用String就可以
    如果调用者是C/C++,一样识别不了Variant类型
    还是老老实实用PChar吧
      

  10.   

    c#好象有string的
    str=new string[255];
      

  11.   

    错!!!
    用DELPHIMM增加发布时候的size。
    用PChar只能一个参数。
    用v,可以传递任意多个参数。
    参数个数不能确定的时候,我这招很管用。