前段时间有个软件开发商用.net 做了一DLL 程序。函数中有string 字符串我用delphi 调用不管用什么方法就是失败。不知何故!是不是string 要初始化?也不行。高手指点。

解决方案 »

  1.   

    .NET中的string和VCL中的string是有区别的。
    原生的数据类型才是王道。
      

  2.   

    Public Type str_out
        errtext As String
        out1 As String
        out2 As String
    End TypePublic Type str_in
        ybjgbm As String
        yybm As String
    End TypeSub init_type(par_in As str_in, par_out As str_out)With par_in
            .ybjgbm = "430700"
            .yybm = "4307000001"
    End With
        par_out.errtext = Space(1024)
        par_out.out1 = Space(50)
        par_out.out2 = Space(50)End SubPrivate Sub Command1_Click()
    Dim bln_return As Boolean
    Dim par_in As str_in
    Dim par_out As str_out
    init_type par_in, par_outPublic Declare Function readzfbl Lib "cxybclient.dll" ( _
    ByVal strybjgbm As String, ByVal stryybm As String _
    , ByVal stryycxbm As String, ByVal strbz As String _
    , strout As str_out) As Boolean上面是用VB 调可以调用动态链接库里面的函数.下面是delphi 调用
    (1、)用记录
      type
         strout=record
            errtext:string;
            out1:string;
            out2:string;
      end;setlength(str_out.errtext,200);     setlength(str_out.out1,50);      setlength(str_out.out2,50);
    (2、)类
      type
         strout=class
            errtext:string;
            out1:string;
            out2:string;
      end;var
      xx:=strout.create;这两个都不能成功的调用动态链接库的函数。
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;Type str_out=record
        errtext :Pchar;
        out1 :Pchar;
        out2 :Pchar;
        out3 :Pchar;
        out4 :Pchar;
        out5 :Pchar;
        out6 :Pchar;
        out7 :Pchar;
        out8 :Pchar;
        out9 :Pchar;
        out10 :Pchar;
        out11 :Pchar;
        out12 :Pchar;
        out13 :Pchar;
        out14 :Pchar;
        out15 :Pchar;
        out16 :Pchar;
        out17 :Pchar;
        out18 :Pchar;
        out19 :Pchar;
        out20 :Pchar;
        out21 :Pchar;
        out22 :Pchar;
        out23 :Pchar;
        out24 :Pchar;
        out25 :Pchar;
        out26 :Pchar;
        out27 :Pchar;
        out28 :Pchar;
        out29 :Pchar;
        out30 :Pchar;
    End;var
      Form1: TForm1;
      FUNCTION readzfbl(ybjgbm:Pchar;yybm:Pchar;yycxbm:Pchar;strbz:Pchar;strout:str_out):Boolean; stdcall; external 'CxybClient.dll';
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      par_out:str_out;
    begin  par_out:=str_out.Create;  If readzfbl('430401', '4304010001', '123456', '1', par_out) Then
    end;end.string类型改为PCHAR 也不行。。上面为了简化Public Type str_out
      errtext As String
      out1 As String
      out2 As String
    End Type
    其实为31个字符串 调用函数时为返回值 每个字符串返回不同的值有成功失败等等
      

  4.   

    Type str_out=record 是 Type str_out=class 写错了呵呵
      

  5.   

    .net的DLL是不能直接调用的.. 它不是标准的WIN32 DLL
      

  6.   

    .net的DLL是不能直接调用的.. 它不是标准的WIN32 DLL
      

  7.   

    要在Delphi下调用.net的DLL,必须使用COM对象调用......
      

  8.   

    .net的DLL是不能直接调用的.. 它不是标准的WIN32 DLL具体怎么调用?IMPORT TYPE library ???加载出错高手指点。。急。。
      

  9.   


    必须在COM组件中调用.net的DLL......
      

  10.   

    必须在COM组件中调用.net的DLL...... 咋个操作没搞过,能不能搞个简单的例子谢了兄弟有点急
      

  11.   

    跨进程跨平台的项目少用string,服务类型程序尽量少用string,string不是万能的,出问题都不知道怎么出.
      

  12.   

    楼上已经不少朋友说了,.net是com类型不是标准动态连接库
      

  13.   

    把.NET的DLL封装成COM来调用,D2007好像有专门的向导