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

发布于 2024-11-14 11:55:02 字数 879 浏览 3 评论 0原文

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

when i try to call c# code from c++, i followed instructions from this article

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

part of my c# is :

[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();
 }

}

part of my c++ code:

#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);

but I just cannot get the string result value, it works fine when i try to get integer results,but not string.

I dont know COM very much. PLEASE HELP ME.
Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烈酒灼喉 2024-11-21 11:55:02

根据Msdn如果你调用SysAllocString同时传入NULL,它会返回NULL 。

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

According to Msdn if you call SysAllocString whilst passing in NULL, it returns NULL.

Aren't you therefore passing a reference to a NULL pointer into your COM interface? And if so ha will never get populated? (I'm not sure with COM so may be wrong)

冬天的雪花 2024-11-21 11:55:02

一般来说,您的代码应该可以工作,但首先确保它正确编译,因为 GameHelper 内部的 void getInfo(out string result) 应该是公共的。然后,pIGame->GetInfo(&ha); 应该用 getInfo 修复。因此,您可能正在运行旧版本的代码。

Generally your code should work but first make sure it compiles correctly as void getInfo(out string result) inside of GameHelper should be public. Then again pIGame->GetInfo(&ha); should be fixed with getInfo. So you may be running an older version of the code.

瘫痪情歌 2024-11-21 11:55:02

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

应该可以工作

Change your C# code to:

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


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

}

Then your C++ client to:

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

That should work

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文