如何使用COM将字符串从c#传递给c ++?

时间:2011-06-07 08:07:56

标签: c# visual-studio-2008 visual-c++ com com-interop

当我尝试从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。请帮我。 谢谢。

3 个答案:

答案 0 :(得分:0)

According to Msdn如果在传入NULL时调用SysAllocString,则返回NULL。

您是否因此将对NULL指针的引用传递到COM接口?如果是这样,ha将永远不会被填充? (我不确定COM可能是错的)

答案 1 :(得分:0)

通常,您的代码应该可以运行,但首先要确保它正确编译,因为void getInfo(out string result)内的GameHelper应该是公开的。然后,再次使用pIGame->GetInfo(&ha);修复getInfo。因此,您可能正在运行旧版本的代码。

答案 2 :(得分:0)

将您的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);

那应该有用