我的一位同事用VC6写了一个COM
定义为:
change(BSTR arrStr[])在VC6中调用是没有问题在VB6中调用却提示那个参数arrStr是一个String型
而不是String数组请问是哪里出了毛病呢???是VC里面的问题还是VB的问题呢?????

解决方案 »

  1.   

    在vb.net中:dim arrStr() As String = {"aaa","bbb","ccc"}obj.change(arrStr)提示数组不能转换为String
      

  2.   

    你说的VB中的String数组 是不是和CStringArray相类似的变量类型呢?
      

  3.   

    to:xiner(叉叉)我不知道CStringArray和VB的string有什么关系但在VC的COM接口规范中只能用BSTR来接收String是吗???
      

  4.   

    用change(BSTR arrStr[][])试试
      

  5.   

    vc 客户程序
    int arraySize = 3 ;
    CString aa[3] = {"aa","bb","cc"};
    在客户程序
    p->change(arraySize,aa); 
    就可以调用com中的change([ in ] int aSize ,[in] BSTR arrStr[] );那么在VB的客户程序里任何实现呢?
      

  6.   

    obj.change(arrStr(0))试试.
    不行的话,改VC
    //IDL
    change([in] SAFEARRAY(BSTR)* ARR)
    //
    change(SAFEARRAY** ARR)
      

  7.   

    谢谢 paul2002()!!!测试中........
      

  8.   

    SAFEARRAY我不会用请教有什么例子可以参考吗???或有别的方法吗???
      

  9.   

    STDMETHODIMP C::GetName(SAFEARRAY** pVal)
    {
    HRESULT hr;
    //一维,基数0,3个元素
    SAFEARRAY* name=SafeArrayCreateVector(VT_BSTR,0,3);
    ATLASSERT(name);
    long ix[1];
    //第一维索引
    ix[0]=0;
    for(int i=0;i<3;i++)
    {
    hr=SafeArrayPutElement(name,ix,(void*)(BSTR)_bstr_t("hello!"));
    ix[0]++;
    }
    if(SUCCEEDED(hr))
    *pVal=name;
    else
    *pVal=0;
    return hr;
    }STDMETHODIMP C::SetName(SAFEARRAY **arr)
    {
    ULONG DM=SafeArrayGetDim(*arr);
    long bd;
    HRESULT hr;
    SafeArrayGetUBound(*arr,DM,&bd);
    long rg[1];
    rg[0]=0;
    for(int i=0;i<bd;i++)
    {
    BSTR bstr;
    hr=SafeArrayGetElement(*arr,rg,&bstr);
    if(SUCCEEDED(hr))
    {
    _bstr_t s(bstr);
    MessageBox(NULL,s,NULL,NULL);
    }
    rg[0]++;
    }
    return hr;
    }
    另外由于VC6的BUG,IDL文件中 change([in] SAFEARRAY(BSTR)* ARR) 这样定义会出错,须手工输入,VC7不会。
      

  10.   

    非常感谢 paul2002()!!!又在测试中........
      

  11.   

    我也用类似的方法写过

    C::SetName(VARIANT arr)最后只取到每个字串的第一个字符用int型的数组作参数
    是可以正确取出的请问你的方法在VB中如何调用的呢???
      

  12.   

    'in vb IX1 is the default IDispath Interface,and IX2 has the methods
    Set obj1 = New C.IX1
    Dim obj2 As IX2
    Set obj2 = obj1
    Dim str() As String
    Dim i As Integer
    str=obj2.GetName
    For i = 0 To UBound(str)
    Print str(i)
    Next
    obj2.SetName str
    Set obj2= Nothing
    Set obj1 = Nothing
    // in vc idl file
    [id(1), helpstring("method SetName")] HRESULT SetName([in] SAFEARRAY(BSTR)* arr);
    [id(2), helpstring("method GetName")] HRESULT GetName([out,retval] SAFEARRAY(BSTR)* arr);//in header file
    STDMETHOD(GetName)(/*[out,retval]*/ SAFEARRAY** arr);
    STDMETHOD(SetName)(/*[in]*/ SAFEARRAY** arr);
      

  13.   

    感谢 paul2002() 的帮忙无以为报只能以分相许了!!!