当我尝试从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。请帮我。 谢谢。
答案 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);
那应该有用