从C ++调用的C#回调的字符串参数 - 需要转换

时间:2015-02-17 16:48:27

标签: c# c++ string callback

我有一个C#应用程序(托管),通过一个包装的(托管)DLL调用静态库(C ++ - 非托管)。在从C ++代码回调到C#程序之前,所有代码都可以正常运行。执行中没有错误,其中回调调用中的字符串(C#)与C ++端回调时的字符串不相似。

我完全清楚“字符串”类型从托管到非托管和反向的解释不同。代码已经在托管DLL级别用于处理将字符串传递到C ++端,但是在从非托管代码的C#回调中传递字符串时遇到问题。我已经尝试过多种方法来“编组”参数,如下所示,但没有成功。 C#端参数的字符串结果将是从中文字符到“@VB |°¥¥¥¥.....”的任何内容。我甚至试着查看内存,看看是否有些东西搞砸了。 C ++部分下面的最后一段代码是进行回调的地方,也就是'event'字符串参数看起来很棒且充满可读字符的地方。然而,当代码在回调(C#)端停止时,字符串参数在编组之后似乎不可读或无法识别。

这里的任何帮助都会很精彩,因为通过回调来管理托管并通过回调回到托管是足够的麻烦。

C#:

public delegate void EventCallBackDelegate([In, MarshalAs(UnmanagedType.LPWStr)] string response, IntPtr uParam);
public static EventCallBackDelegate eventDelegate;

eventDelegate = new EventCallBackDelegate(EventCallbackFunction);

IntPtr eventCbPtr = Marshal.GetFunctionPointerForDelegate(eventDelegate);
jmcStatus = Mjmc.MgdJsonMsgClientRegisterEvents(eventCbPtr);

public void EventCallbackFunction([In, MarshalAs(UnmanagedType.LPWStr)] string response, IntPtr uParam)
{
    jsonAuto = response;
    MessageBox.Show("The Event Callback Function was invoked by the managed DLL");
}

托管DLL(包装器):

int MgdJsonMsgClientRegisterEvents(IntPtr eventCbPtr)
{
    JsonMsgClient::EventCbPtr eventCb = static_cast<JsonMsgClient::EventCbPtr>(eventCbPtr.ToPointer());
    return _JsonMsgClient->RegisterVelEvent(NULL, JsonMsgClient::USE_CB, eventCb);
}

C ++:

typedef void(_stdcall *EventCbPtr)(const string& event, const void* userParam);


JmsStatus::JsonMsgStatus JsonMsgClient::RegisterVelEvent
(
    const void* userParam,
    AutonomousMsgStrategy strategy,
    JsonMsgClient::EventCbPtr cb
)
{
    m_velEventStrategy = strategy;
    if (strategy == USE_CB)
    {
        m_eventCb = cb;
        m_eventUserParam = userParam;
    }
    else if (strategy == NOT_SUPPORTED)
    {
        m_eventCb = NULL;
        m_eventUserParam = NULL;
    }

    return JmsStatus::JMS_ST_OK;
}


if (m_velEventStrategy == USE_CB)
{
    if (m_eventCb != NULL)
    {
        m_eventCb(event, m_eventUserParam);
    }
}

0 个答案:

没有答案