visualstudio2008-如何使用COM将字符串从c#传递到c++

本文关键字:c++ 字符串 何使用 COM visualstudio2008- | 更新日期: 2023-09-27 17:58:45

当我尝试从c++调用c#代码时,我遵循了本文中的说明

http://support.microsoft.com/kb/828736

我的c#的一部分是:

[Guid("6A2E9B00-C435-48f8-AEF1-747E9F39E77A")]
public interface IGameHelper
{
 void getInfo(out string result);
}
public class GameHelper : IGameHelper
{
 void getInfo(out string result)
 {
  result =  new StringBuilder().Append("Hello").ToString();
 }
}

我的c++代码的一部分:

#import "../lst/bin/Release/LST.tlb" named_guids raw_interfaces_only
using namespace LST;
using namespace std;
...
HRESULT hr = CoInitialize(NULL);
IGameHelperPtr pIGame(__uuidof(GameHelper));
BSTR ha = SysAllocString(NULL);
pIGame->GetInfo(&ha);
wprintf(_T(" %s"),ha);
SysFreeString(ha);

但我就是无法获得字符串结果值,当我尝试获得整数结果时,它可以很好地工作,但不能获得字符串。

我不太了解COM。请帮帮我。非常感谢。

visualstudio2008-如何使用COM将字符串从c#传递到c++

根据Msdn,如果在传递NULL时调用SysAllocString,它将返回NULL。

因此,您不是在COM接口中传递对NULL指针的引用吗?如果是这样的话,哈就永远不会有人居住了?(我不确定COM,所以可能是错误的)

通常,您的代码应该可以工作,但首先要确保它正确编译,因为GameHelper内部的void getInfo(out string result)应该是公共的。则CCD_ 3应当再次与CCD_ 4固定。因此,您可能正在运行旧版本的代码。

将C#代码更改为:

[Guid("6A2E9B00-C435-48f8-AEF1-747E9F39E77A")]
public interface IGameHelper
{
    string getInfo();
}

public class GameHelper : IGameHelper
{
    public string getInfo()
    {
       return "Hello World";
    }
}

然后你的C++客户端:

HRESULT hr = CoInitialize(NULL);
IGameHelperPtr pIGame(__uuidof(GameHelper));
_bstr_t ha = pIGame->GetInfo();
wprintf(_T(" %s"),ha);

这应该工作