C# 从非托管C+;返回LPTSTR+;包含'\0';人物 我有一个C++的GUI调用一个非托管C++ DLL。回调用于dll->gui消息传递

C# 从非托管C+;返回LPTSTR+;包含'\0';人物 我有一个C++的GUI调用一个非托管C++ DLL。回调用于dll->gui消息传递,c#,c++,pinvoke,marshalling,C#,C++,Pinvoke,Marshalling,在dll中创建的LPTSTR可能包含“\0”字符。需要通过回调参数将该字符串完整地传递回gui 不幸的是,我只能将字符串传递到gui,直到返回空字符为止。似乎是封送切断了绳子 // C# callback declarations public delegate bool callbackDelegate(int iEvent, [MarshalAs(UnmanagedType.LPWStr)] string SomeString); private callbackDelegate callb

在dll中创建的LPTSTR可能包含“\0”字符。需要通过回调参数将该字符串完整地传递回gui

不幸的是,我只能将字符串传递到gui,直到返回空字符为止。似乎是封送切断了绳子

// C# callback declarations
public delegate bool callbackDelegate(int iEvent, [MarshalAs(UnmanagedType.LPWStr)] string SomeString);
private callbackDelegate callbackDelegateInstance;

// instantiating and calling the callback in C#
callbackDelegateInstance = new callbackDelegate(CallbackHandler);
DLLCallbackFunction(callbackDelegateInstance);

// C# callback handler
private bool CallbackHandler(int iEvent, [MarshalAs(UnmanagedType.LPWStr)] string SomeString)
{
    // SomeString only contains characters up until the null char
}
是否有方法返回整个字符串,包括dll中的空字符


我可以访问dll和gui代码。

您可以将其封送为原始字节数组,而不是LPTSTR。如果数据不是恒定大小,则必须添加额外的长度参数

委托的声明如下:

 public delegate bool callbackDelegate(int iEvent, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] data, int dataCount);
在非托管方面:

typedef void (__stdcall *callbackDelegate)(int iEvent, const char* data, int size);

这是正常情况,LPWSTR是以零结尾的字符串。您必须将其声明为IntPtr并自行封送。您现在可以解决pinvoke marshaller不知道如何解决的问题:字符串有多长?如果您可以更改本机代码,则使用BSTR。我在dll中有字符串长度。BSTR的目的是什么?您能提供IntPtr封送的示例吗?不要束手无策,在google查询中键入“什么是bstr”。如果您想要示例代码,请仔细记录我们应该如何知道字符串的长度。我的意思是为什么在本文中使用BSTR,而不是一般情况下使用。@alexsd BSTR,因为pinvoke封送员可以为您完成所有工作。您只需要
[marshallas(UnmanagedType.BSTR)]
就可以了。在本机端,如果有Unicode字符串,则使用
SysAllocStringLen
;如果有ANSI字符串,则使用
SysAllocStringByteLen
。谢谢!这起作用了。只是必须更改为SizeParamIndex=2。@user1580523哦,对了,你是说SizeParamIndex=2?我的错误。