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

How to call a COM function that returns a string when called from C#, Java

本文关键字:调用 返回 Java 字符串 函数 COM 何调用 一个      更新时间:2023-10-16

问题说明:

    在现有的COM库中添加一个返回字符串的函数。c#应用程序使用COM互操作版本使用COM库(使用tblimp生成的。net运行时程序集)

到目前为止,我已经尝试了以下变化:

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或类似的措辞异常。

我讲对了吗?或者是否有一些编组限制导致异常被引发(比如在进行内存管理等时)?我在网上找不到一个明确的解释,哪种方法最适合上述场景,所以这个请求帮助。

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

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

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

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

其中ReturnString可以替换为您希望返回的任何字符串

您还问了java…

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

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