我想從我的託管代碼得到一個字符串到我的非託管代碼:我怎樣才能傳遞一個空字符串緩衝區,可以從本地寫入到C#?
非託管的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);
}
在我的管理程序我的字符串看起來很好,但它變成非託管方的垃圾。我沒有複製所有的代碼,但我認爲這是我想要完成的。如果我以錯誤的方式去解決這個問題,或者我犯了錯誤,請告訴我。謝謝。
如果您可以更改回調以使用'BSTR',則可以在此問題中使用該解決方案:http://stackoverflow.com/questions/4455234/passing-string-from-c-to-c-sharp – shf301