=============== dephi7.0中DLL源码:===============
procedure testFun1(out Arg1:array of string;out Arg2:array of integer;out Arg3:integer);stdcall;
begin
  Arg1[0]:='aa'; Arg1[1]:='bb';
  Arg2[0]:=1001; Arg2[1]:=1002;
  Arg3 := 888;
end;
procedure testFun2(out Arg3:integer);stdcall;
begin
  Arg3 := 888;
end;=============== VB 调用 ===============
'DLL声明
Private Declare Sub testFun1 Lib "mydll.dll" (ByRef Arg1() As String, ByRef Arg1() As Integer, ByRef Arg3 As Integer)
Private Declare Sub testFun2 Lib "mydll.dll" (ByRef Arg3 As Integer)
  
Private Sub Command1_Click()
  Dim arg1(50) As String
  Dim arg2(50) As Integer
  Dim arg3 As Integer
  arg3 = 0  Call testFun1(arg1(), arg2(), arg3)   ' 调用失败,并自动退出程序,为什么??????
  Call testFun2(arg3)                   ' 调用成功,arg3返回888End Sub

解决方案 »

  1.   

    另外:
    =============== VB 调用 =============== 
    Call testFun1(arg1(), arg2(), arg3)  
    改为
    Call testFun1(arg1, arg2, arg3)  ' 调用还是失败,并自动退出程序,为什么?????? 
      

  2.   

    网上看到,要用地址传送,VB用数组第一个元素
    =============== VB 调用 =============== 
    改为 
    Call testFun1(arg1(0), arg2(0), arg3)  ' 调用还是失败,报“类型不匹配”错误怎么办啊????
      

  3.   

    =============== VB 调用 =============== 
    'DLL声明 
    Private Declare Sub testFun1 Lib "mydll.dll" (ByVal Arg1() As String, ByVal Arg2() As Integer, ByVal Arg3 As Integer) 
    Private Declare Sub testFun2 Lib "mydll.dll" (ByVal Arg3 As Integer) '你的问题是在testFun1中同时声明了2个Arg1数组,另外将ByRef 全部改为ByVal.
      

  4.   

    VB 只支持 [in]、[in/out] 参数,不支持 [out] 参数。
      

  5.   

    区别太大了。
    比如传递一个数组:
    [in/out]通常将参数定义为一个指针,编译器只负责实现指针的传递,至于数组的大小、成员的类型由调用者和被调用者自己解决;
    如果是[out],那么编译器需要将参数堆栈中的数组内容复制到调用者的数组中,这就需要知道具体数组的大小、成员的类型等等具体信息,通常不会在跨语言调用中实现。
      

  6.   

    [code=BatchFile][
      uuid(FA3AA1B8-469C-4C8F-AD9E-E49AEA89B508), 
      version(1.0), 
      helpstring("Project1 Library")
        
    ]
    library Project1
    {  importlib("stdole2.tlb");  [
        uuid(9ADE99CD-D5B9-4E56-B745-74A575BA7C53), 
        version(1.0), 
        helpstring("Interface for CoTestOut Object"),
        oleautomation
      ]
       interface ICoTestOut: IUnknown
      {
        [
        id(0x00000065)
        ]
        HRESULT _stdcall Method1([in] long Param1, [out] long * Param2 );
      };  [
        uuid(D03E8985-35CE-44D3-9F3C-996519B89831), 
        version(1.0), 
        helpstring("CoTestOut")
      ]
      coclass CoTestOut
      {
        [default] interface ICoTestOut;
      };};[/code]
    按这份IDL定义,写一个ActiveX DLL,然后直接在该DLL当中使用Method1的第二个参数,看看这个Param2定义成[out]还是[in, out]有啥区别。
      

  7.   

    你只要在类中加了下面的实现,直接就是编译错误:Bad interface for Implements: method has out-only or LCID parameter
    Implements Project1.CoTestOut
      

  8.   

    楼主说的是Delphi创建的DLL。实际上楼主使用的只是API。
      

  9.   

    [in,out]还[out]实际上只是一个修饰关键字,并不影响编码,只影响预处理器对代码做检查。
      

  10.   

    总之VB不支持[out],差别只是接口实现在编译时就能发现,Declare 的函数编译时不检查,认为就是[in,out]的,所以执行就崩溃了。
      

  11.   

     
     
    可以使用Variant
    [/Quote]请问怎么使用Variant?Delphi和VB都要用Variant吗?用数组形式的Variant?
    VB和Delphi的代码怎么写?
      

  12.   

    VB 的数组是 COM 标准的 SAFEARRAY,Delphi 的估计不是;
    你应该将参数 Arg2 声明为 [in/out] 型的指针。
    而且 VB 的 String 是 COM 标准的 BStr,Delphi 的估计不是;
    建议将 Arg1 约定为 [in/out] 型的字符指针,返回内容为用特殊字符分割的单个字符串。procedure testFun1(var Arg1:pchar; var Arg2:pinteger; var Arg3:integer);stdcall; 
    'VB 会自动将参数 ByVal ... As String 作为 char* 处理
    '参数 ByVal ... As Long 等同与 Delphi 的万能指针
    Private Declare Sub testFun1 Lib "mydll.dll" (ByVal Arg1 As String, ByVal Arg2 As Long, ByRef Arg3 As Integer) 
    Private Declare Sub testFun2 Lib "mydll.dll" (ByRef Arg3 As Integer) 
      
    Private Sub Command1_Click() 
      Dim arg1 As String 
      Dim arg1Arr() as string
      Dim arg2(50) As Integer 
      Dim arg3 As Integer 
      arg3 = 0   arg1=space(500) '分配足够的字符空间
      Call testFun1(arg1, varptr(arg2(0)), arg3)
      arg1Arr = split(trim(arg1), "|") ' 假定 | 为约定的分割符
      Call testFun2(arg3)
    End Sub 
      

  13.   

    procedure testFun1(var Arg1:OleVariant;var Arg2:OleVariant;var Arg3:integer);stdcall;
    begin
      Arg1 := VarArrayCreate([0,2-1],varOleStr);
      Arg1[0]:='aa'; Arg1[1]:='bb';
      Arg2 := VarArrayCreate([0,2-1],varInteger);
      Arg2[0]:=1001; Arg2[1]:=1002;
      Arg3 := 888;
    end;
    exports
      testFun1;
    Private Declare Sub testFun1 Lib "Project1.dll" (ByRef arg1 As Variant, ByRef arg2 As Variant, ByRef Arg3 As Long)Dim str() As String
    Dim l() As Long
    Dim arg1 As Variant, arg2 As Variant
    Dim l1 As Long
    Call testFun1(arg1, arg2, l1)
    str = arg1
    l = arg2
      

  14.   

    VarArrayCreate 创建的是 Variant Array,不等于用 Variant 变量引用的字符串数组。
      

  15.   

    我拜托,要不就自己测试一下,要不就自己了解一下Variant的结构。
      

  16.   

    同样的字节流,在 DBSC/Unicode/UFT-8 下可以得到不同的字符串,为什么?
      

  17.   

    在VB当中除了作为与外部接口(API接口)使用的String参数由VB做过特殊处理外,所有String都是Unicode串,更确切地说是OLESTR
      

  18.   

    同样的字节流,在 DBSC/Unicode/UFT-8 下可以得到不同的字符串,为什么? 参考标准不同
    斯琴高娃对中国人来说是外国人,对瑞士来说是本国人,为什么? 参考标准不同
    同样的参数堆栈,VB 和 Delphi 理解不同,为什么? 参考标准不同
      

  19.   

    你可以要求 Borland 和 Microsoft 制定一个统一标准。