如何调用从C#,Java调用时返回字符串的COM函数

时间:2011-12-03 15:49:19

标签: c# c++ com com-interop

问题陈述:

  1. 将函数添加到返回字符串的现有COM库中。
  2. C#应用程序使用COM互操作版本(使用tblimp生成的.net运行时程序集)使用COM库。
  3. 直到现在,我已经尝试了以下变化:

    C ++方面的代码:

    变体1:HRESULT GetString([out] BSTR* string);

    变体2:HRESULT GetString([out,retval] BSTR* string);

    C#端的代码:

    string str;
    

    变体1:GetString(out str);

    变体2:str = GetString();

    然而,两者都提出了Attempt to read/write memory或类似的措辞异常。

    我是否在正确的轨道上?或者是否存在一些编组限制导致异常被引发(比如进行内存管理等)?我无法在网上找到关于哪种方法最适合上述情况的明确解释,因此请求帮助。

    进一步的计划是,将从Java应用程序调用此COM函数。

    注意:请忽略函数语法,可能包含错误。 COM中实现的代码在C ++ COM库中从两个变量调用时都没有任何问题,但如上所述C#失败。

2 个答案:

答案 0 :(得分:3)

我怀疑您的C ++代码存在问题。假设你正在使用ATL,一种返回字符串的方法就是这样做:

HRESULT GetString([out,retval] BSTR* string)
{
    const char* ReturnString = "A string to return";
    *string = CComBSTR( ReturnString ).Detach();
    return S_OK;
}

其中ReturnString可以替换为您想要返回的任何字符串。

答案 1 :(得分:0)

您还询问了java ...

你必须使用JNI。您将这些函数声明为 native ,然后生成包装代码,在其中您可以访问您想要的任何内容,例如: .NET库或COM。

看看这里: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html