Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用从C、Java调用时返回字符串的COM函数_C#_C++_Com_Com Interop - Fatal编程技术网

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

C# 如何调用从C、Java调用时返回字符串的COM函数,c#,c++,com,com-interop,C#,C++,Com,Com Interop,问题陈述: 向现有COM库中添加一个返回字符串的函数。 C应用程序使用使用tblimp生成的COM互操作版本.net运行时程序集使用COM库 到目前为止,我已经尝试了以下变化: C++代码: 变体1:HRESULT GetString[out]BSTR*字符串 变体2:HRESULT GetString[out,retval]BSTR*字符串 C端代码: string str; 变异1:GetStringout str 变量2:str=GetString 但是,两者都会引发读取/写入内存的尝

问题陈述:

向现有COM库中添加一个返回字符串的函数。 C应用程序使用使用tblimp生成的COM互操作版本.net运行时程序集使用COM库 到目前为止,我已经尝试了以下变化:

C++代码:

变体1:HRESULT GetString[out]BSTR*字符串

变体2:HRESULT GetString[out,retval]BSTR*字符串

C端代码:

string str;
变异1:GetStringout str

变量2:str=GetString

但是,两者都会引发读取/写入内存的尝试或类似的措辞异常

我走对了吗?或者是否存在一些编组限制,导致在执行内存管理等操作时引发异常?我在网上找不到一个关于哪种方法最适合上述场景的清晰解释,因此,我呼吁大家提供帮助

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


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

< P>我怀疑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。您将函数声明为本机函数,然后生成包装代码,在其中您可以访问任何您想要的内容,例如.NET库或COM

请看这里:
你的C++代码是错误的,我看不到。你是什么意思?我不担心语法,但这里的方法。这个函数签名与上面提到的C++代码的变体[2 ]有什么不同?我在COM端进行分配,C希望释放它。函数签名没有什么不同,但我认为问题不在于函数签名。如果你发布C++代码,那么我或其他人可能能够告诉你确切的问题。我明白你的观点。我观察到,当从COM库调用该函数或使用C中的dll导入时,该函数可以完美地工作。要添加,代码也与上面编写的类似。我不明白为什么从interop调用同一个函数时会导致异常?我是否应该通过字符串长度和一个分配的缓冲区从C写入到C++中,这样内存管理变得容易了?我希望避免这种方法,因为函数从此不能返回可变长度字符串。我怀疑函数是从互操作失败的,因为您在C++的GETStand函数中分配内存或类似的错误,这在C调用时会引起问题。它可能在C++调用时起作用,因为没有什么能自动处理释放和分配内存,所以你不会遇到问题。我不建议从C传递分配的缓冲区,这听起来是解决这个问题的一个非常糟糕的解决方案。但是,除非您编辑您的帖子来包含GETStand的C++实现,否则我无法真正帮助您。