我写一个vc atl dll,里面有一个函数
STDMETHODIMP CATLDll::BSTRRefTest(BSTR *tempStr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here CString s = *tempStr;
s = s + s;
BSTR tbstr = s.AllocSysString();
tempStr = &tbstr;
return S_OK;
}编译注册ATLDll后在vb中调用
    Dim VcDll As ATLDllLib.XXXX
    Set VcDll = New XXXX
    
    Dim s As String
    s = "abcd"
    VcDll.BSTRRefTest s '这里系统报错
    MsgBox "s =" & s
结果运行到“VcDll.BSTRRefTest s”一句vb报错“Compile error:Wrong number of arguments or invalid property assignment”
什么原因,如何实现vb向atl dll输入并返回字符串呢?谢谢!

解决方案 »

  1.   

    CString s = *tempStr;
    s = s + s;
    // 去掉这个中间变量 ,直接写就可以了 BSTR tbstr = s.AllocSysString();
    tempStr = s.AllocSysString();
    return S_OK;
      

  2.   

    tempStr = &tbstr;
    这句改成:
    *tempStr = &tbstr; 试试
      

  3.   

    谢谢上面两位的回复,我已经按所说试验过了,依然是报告“Compile error:Wrong number of arguments or invalid property assignment”,现在看来是类型不识别或其它原因,字符串根本就没有传进去,还有办法吗?谢谢!
      

  4.   

    VcDll.BSTRRefTest s这句调用是不是这样啊:
    VcDll.BSTRRefTest(s)
      

  5.   

    大家好,我是楼主。我又检查了一下,我的程序是这样定义的:
    [id(7), helpstring("method BSTRRefTest")] HRESULT BSTRRefTest([out,retval] BSTR *tempStr);
    发现如果将*tempStr定义为[out,retval]就会出现上述问题,而定义为[in,out]就可以运行,但只能向dll传入字符串,无法将修改结果传回给vb程序,请问是什么原因?如何修改?谢谢!
      

  6.   

    BSTR tbstr = s.AllocSysString();
    *tempStr = tbstr.Copy();
    应该就可以了
      

  7.   

    vb 中没有指针概念,有retval定义的方法在vb中这样使用
    s = VcDll.BSTRRefTest()
      

  8.   

    xiaoyuzi(小鱼子) 你好:
    s = VcDll.BSTRRefTest()得到的s是个空字符串啊,如果改成
    ss = VcDll.BSTRRefTest(s)依然报上面的错误。
    我把dll程序修改如下
    [out,retval]BSTRRefTest(BSTR *tempStr)
    {
             CString s = "aaaaa";
    BSTR tbstr = s.AllocSysString();
    tempStr = &tbstr; return S_OK;
    }
    得到的也是空字符串,为什么?谢谢!
      

  9.   

    vc
    [id(10), helpstring("method testBSTR")] HRESULT testBSTR(BSTR* lpsz);
    STDMETHODIMP CHBLine1::testBSTR(BSTR *lpsz)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()) CString s = *lpsz;
    s += "ffffffff";
    *lpsz = s.AllocSysString();
    return S_OK;
    }vb
        Dim str As String
        str = "1234"
        obj.testBSTR str
        MsgBox str
      

  10.   

    谢谢上面所有回复的网友,问题终于解决我把函数定义修改如下:[id(7), helpstring("method BSTRRefTest")] HRESULT BSTRRefTest([out] BSTR *tempStr);就是只保留“[out]”,做成输出参数,输入用其它参数就可以了。谢谢大家!