使用P / Invoke如何马歇尔C ++的char *到C#字符串 [英] How to marshall c++ char* to C# string using P/INVOKE

查看:333
本文介绍了使用P / Invoke如何马歇尔C ++的char *到C#字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新的C ++。我打电话从C#使用的PInvoke C ++函数,并希望得到一个字符串作为回out参数。不过,我只是得到一个空字符串返回。通过int out参数正常工作。



导入:

 函数[DllImport(@UnamanagedAssembly.dll ,字符集= CharSet.Ansi)] 
公共静态外部INT激活(REF INT numActivated,StringBuilder的eventsActivated);

的externC__declspec(dllexport)的INT激活(INT * p_NumActivated,字符* p_EventsActivated){返回激活::的GetInstance() - GT;激活(p_NumActivated,p_EventsActivated);}

调用我的C ++从C#功能:

  INT numActivated = 0; 
StringBuilder的eventsActivated =新的StringBuilder();
INT状态=激活(REF numActivated,eventsActivated);



C ++函数:

  INT激活::激活(INT * p_NumActivated,字符*&安培; p_EventsActivated)
{
的char * PTEMP =你好;
p_EventsActivated = PTEMP;

* p_NumActivated = 1;

返回0;
}


解决方案

 函数[DllImport(@UnamanagedAssembly.dll,字符集= CharSet.Ansi)] 
公共静态外部INT激活(
REF INT numActivated,
[的MarshalAs(UnmanagedType.LPStr) StringBuilder的eventsActivated);


I'm new to C++. I'm calling a C++ function from C# using a PINVOKE and wanting to get a string back as an out parameter. However I just get an empty string back. The int out parameter works fine.

Importing:

[DllImport ( @"UnamanagedAssembly.dll", CharSet = CharSet.Ansi)] 
public static extern int Activate(ref int numActivated,  StringBuilder eventsActivated);

extern "C" __declspec(dllexport) int Activate(int *p_NumActivated, char *p_EventsActivated) {return Activation::GetInstance()->Activate(p_NumActivated, p_EventsActivated);}

Calling my C++ function from C#:

int numActivated = 0;
StringBuilder eventsActivated = new StringBuilder();
int status = Activate(ref numActivated, eventsActivated);  

The C++ function:

int Activation::Activate(int *p_NumActivated, char *&p_EventsActivated)
{
    char *pTemp = "Hello";
    p_EventsActivated = pTemp;

    *p_NumActivated = 1;

    return 0;
}

解决方案

[DllImport ( @"UnamanagedAssembly.dll", CharSet = CharSet.Ansi)]
public static extern int Activate(
    ref int numActivated, 
    [MarshalAs(UnmanagedType.LPStr)]StringBuilder eventsActivated);

这篇关于使用P / Invoke如何马歇尔C ++的char *到C#字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆