如何传递可以写入到从原产地到C#一个空字符串缓冲区? [英] How can I pass an empty string buffer that can be written to from native to c#?
本文介绍了如何传递可以写入到从原产地到C#一个空字符串缓冲区?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想从我的管理code得到一个字符串进入我的非托管code:
I'm trying to get a string from my managed code into my unmanaged code:
非托管的DLL:
typedef int (__stdcall * GetNameFromDictionaryCallback)(ULONGLONG id, WCHAR * name);
declspec(dllexport) void __stdcall UnmanagedSetNameLookupCallback(GetNameFromDictionaryCallback fn)
{
GetNameFromDictionaryCallback GetNameFromDictionary = fn;
WCHAR * value = new WCHAR[256];
ULONGLONG key = 0x250000000DA44785;
GetNameFromDictionary(key, value); // reverse P/Invoke call to C# function
wprintf_s("%ls", value); // just to display the result for simplicity
delete value;
}
托管DLL:
public class ProgramInterop
{
private delegate int GetNameFromDictionaryCallback(UInt64 key, string value);
private static GetNameFromDictionaryCallback mGetNameInstance;
private Dictionary<UInt64, string> dict;
private ProgramInterop()
{
mGetNameInstance = new GetNameFromDictionaryCallback(GetNameFromDictionary);
UnmanagedSetNameLookupCallback(mGetNameInstance);
}
public bool GetNameFromDictionary(UInt64 key, string value)
{
return dict.TryGetValue(key, out value);
}
[DllImport("Unmanaged.dll")]
private static extern void UnmanagedSetNameLookupCallback(GetNameFromDictionaryCallback fn);
}
在我的管理程序我的字符串看起来不错,但它变成在非托管方的垃圾。我没有复制所有code,但我认为这使得我想要做到这一点。如果我要对此错误的方式或者我犯过错误,请让我知道。谢谢你。
Within my managed program my string looks fine but it turns into garbage on the unmanaged side. I didn't copy all the code but I think this makes the point of what I'm trying to accomplish. If I'm going about this the wrong way or I made mistakes, please let me know. Thanks.
推荐答案
试试这个:
delegate int GetNameFromDictionaryCallback(
UInt64 key, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder value);
public bool GetNameFromDictionary(UInt64 key, StringBuilder value)
{
string s;
if (dict.TryGetValue(key, out s))
{
value.Append(s);
return true;
}
return false;
}
这篇关于如何传递可以写入到从原产地到C#一个空字符串缓冲区?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文