代码之家  ›  专栏  ›  技术社区  ›  willvv

用字符串处理方式调用VB.NET中的C++方法

  •  0
  • willvv  · 技术社区  · 14 年前

    我有一个带有这个签名的C++方法:

    STDMETHODIMP ClassName::FunctionName(long number, BSTR* names, long* status)
    

    在方法内部,名称变量作为字符串数组访问,即

    char *  tempString = NULL;
    
    for (int n = 0; n < number; n++)
    {
        tempString = OLE2T(names[n]);
    ...
    

    我编译C++项目,生成一个DLL,然后注册这个DLL并在VB项目中添加对它的引用。 添加引用时,将自动生成互操作程序集,并且互操作程序集中方法的签名如下:

    FunctionName (number as Integer, ByRef names as String) As Integer
    

    我从vb.net调用如下方法:

    result = FunctionName (number, names(0))
    

    其中,名称是包含多个元素的字符串数组,数字和结果是整数。

    问题是,当C++代码试图访问名称数组中的其余元素(名称(1)和前面)时,它开始在这些字段上获得“垃圾”。

    我的问题是,如何发送整个字符串数组而不仅仅是第一个值。

    C++代码是一个我不能修改的库,因此,我所做的任何更改都必须在VB.NET代码上。

    我在想也许使用pinvoke来调用这个方法可以实现这个技巧(声明一个正确的签名),但我希望有更好的方法。

    有什么想法吗?

    谢谢!

    编辑:

    我不擅长互操作/封送,但我检查了该方法的IDL定义,如下所示:

    [id(60), helpstring("method FunctionName")]
            HRESULT FunctionName(
                        [in] long number, 
                        [in, size_is(number)] BSTR* names,
                        [out, retval] long* status);
    

    大小不应该表示name参数是一个数组,因此,当生成interop程序集时,是否应相应地执行操作?

    再次感谢

    1 回复  |  直到 12 年前
        1
  •  2
  •   Hans Passant    14 年前