因为知道在dll中不能直接返回string型所以我已把二维数组转为pchar型了,但取出来的二维数组值含有乱码,请问怎样解决?

解决方案 »

  1.   

    如果调用方是delphi程序,返回string型也没什么大不了。
      

  2.   

    就是做出来不一定在DELPHI上使用的,请问有什么办法?
      

  3.   

    在delphi中能返回string!vb中不行!
      

  4.   

    不一定要返回string,其它类型然后换转都行啊,请问有什么办法?
      

  5.   

    你在DLL函数中用传引用的方法不行吗?
      

  6.   

    把数组定为pchar类型,返回来的是乱码
      

  7.   

    你可以看看Windows API多数是从参数中返回函数的返回值的。。
    所以你应该借鉴这种方法这样定义:
    function Test(Value: PChar; Size: integer): boolean;使用的时候,先分配内存
    var
      a:array[0..100] of char;
    begin
      Test(Pchar(a), 100);
    end;
      

  8.   

    zwjchina(蒲石)你好能祥细说一下具体的使用方法吗?那一部份在DLL中?
      

  9.   

    function Test(Value: PChar; Size: integer): boolean;
    这个函数以及实现是在DLL中,该函数不负责分配Value的空间
    在你的程序中使用时要分配Value的空间:下面就是使用时候的例子
    var
      a:array[0..100] of char;
    begin
      Test(Pchar(a), 100);
    end;
      

  10.   

    dll中能返回string,在vc中可以用uchar *来接收,在vb中也照样能接收
    返回乱码可能是返回的是16进制,或者其他原因,你可以把代码贴出来看看
      

  11.   

    你好:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      a:array[0..100] of char;
    begin
      Test(pchar(a),100);
    end;dll:
    function Test(Value: PChar; Size: integer): boolean;
    begin
    value[0]:=char(pchar('aaa'));
    result:=true;
    end;没有运行通过在这里:Test(Pchar(a), 100);
      

  12.   

    "所以我已把二维数组转为pchar型了"
    你是怎么转的!贴出来看看!
      

  13.   

    DLL代码:
    type
    arr2=array[0..100,0..21] of pchar;function getwhilearymany(conn:TADOConnection;sqlstr:pchar;get1:pchar;get2:pchar;get3:pchar;get4:pchar;get5:pchar;get6:pchar;get7:pchar;get8:pchar;get9:pchar;get0:pchar):arr2;stdcall;
    var
    ado: TADOQuery;
    bbc:arr2;
    j:integer;
     begin
     try
        try
        j:=0;
          CoInitialize(nil);
          ado := tadoquery.Create(nil);
          ado.Connection :=conn;
          ado.Close();
          ado.SQL.Clear;
          ado.SQL.add(String(sqlstr));
          ado.Open;
          while not ado.Eof do
            begin
            if j>100 then
               break;
               ///
                 bbc[j,0]:=pchar(ado.fieldbyname(string(get1)).AsString);             bbc[j,1]:=pchar(ado.fieldbyname(string(get2)).AsString);             bbc[j,2]:=pchar(ado.fieldbyname(string(get3)).AsString);             bbc[j,3]:=pchar(ado.fieldbyname(string(get4)).AsString);             bbc[j,4]:=pchar(ado.fieldbyname(string(get5)).AsString);             bbc[j,5]:=pchar(ado.fieldbyname(string(get6)).AsString);             bbc[j,6]:=pchar(ado.fieldbyname(string(get7)).AsString);             bbc[j,7]:=pchar(ado.fieldbyname(string(get8)).AsString);             bbc[j,8]:=pchar(ado.fieldbyname(string(get9)).AsString);             bbc[j,9]:=pchar(ado.fieldbyname(string(get0)).AsString);           //        j:=j+1;
            ado.Next;
            end;    except
        end;
     finally
     result:=bbc;
     Ado.Close();
     ado.Free;
     ado:=nil;
     CoUninitialize;
     inputtrack(pchar('getwhilearymany结束:结果:完成'));
     end;
    end;在程序中:type
    arr2=array[0..100,0..21] of pchar;
    function puttzf():string;
    var
    f,k,m:integer;
    sql:string;
    yuyuesms:arr2;
    begin
    try
    for k:=0 to 200 do
    begin
    zu[k].ph:='';
    end;
    sql:='select top 99 nodeid,content from 机床号 order by id';
    yuyuesms:=getwhilearymany(form1.conndll,pchar(sql),pchar('nodeid'),pchar('content'),pchar('nodeid'),pchar('content'),pchar('content'),pchar('nodeid'),pchar('content'),pchar('content'),pchar('nodeid'),pchar('nodeid'));
    m:=0;
    while m<=100 do
    begin
     if string(yuyuesms[m,0])='' then
        break;
      zu[m].ph:=string(yuyuesms[m,0]);
      zu[m].name:=string(yuyuesms[m,1]);
    m:=m+1;
    end;exceptend;
    end;返回来的数据存在乱码
      

  14.   

    用Test(a,100);或者Test(Pchar(@a[0]), 100)看看
      

  15.   

    zwjchina(蒲石) 都不行啊出错的
      

  16.   

    XXXXread of adderss XXXX这样的一个框
      

  17.   

    使用Test(Pchar(@a[0]), 100)把dll修改成这样:
    function Test(Value: PChar; Size: integer): boolean;
    begin
      result:=true;
    end;我这里没Delphi,无法帮你测试
      

  18.   

    我这样是确保你的问题不是出在DLL中这样还是错??????
    你把代码贴出来看,Test的dll以及Test的测试代码
      

  19.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      a:array[0..100] of char;
    begin
    Test(Pchar(@a[0]), 100)
    end;dll:
    dll:
    function Test(Value: PChar; Size: integer): boolean;
    begin
    value[0]:=char(pchar('aaa'));
    result:=true;
    end;
      

  20.   

    声明呢?
    是否使用了stdcall?
      

  21.   

    pchar是以#0为结尾的,a:array[0..100] of char这样定义,如果2个字符有效的话,其余的就是乱码,所以DLL一定要返回一个有效数据长度或用#0表示数据结束
    可以试试这个procedure TForm1.Button1Click(Sender: TObject);
    var
      a:array[0..100] of char;
      s:integer;
    bdata,idata:string;
    begin
    Test(Pchar(@a[0]), s)
    bdata:=string(a);
    idata:=copy(bdata,1,s);//只复制有效数据
    end;function Test(Value: PChar; Size: integer): boolean;
    var
    s1:string;
    begin
    s1:='aaa';
    Move(s1[1],value,length(s1));//复制数据到输出缓冲
    size:=length(s1)
    result:=true;
    end;