2012-11-29 67 views
0

這VC6代碼:我有win32 DLL在VC6和調用C#參數字符*?

MCASMARTMANAGER_API int __stdcall reqeustKey_test(char* prKey) 
{  
    Xhandeler.GetPrimaryKey(prKey); 
    return 0; 
} 

prKey = "AB472EDB9012" 

而這個C#代碼:

[DllImport(McaSmartManagerDllPath, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)] 
[return:MarshalAs(UnmanagedType.LPStr)] 
public static extern string reqeustKey_test([MarshalAs(UnmanagedType.LPWStr), In, Out] string prKey); 
var key_ = new string(' ', 17); 
_strPrimaryKey = McaSmartNativeCommand.reqeustKey_test(key_); 

運行時我就收到KEY_ { 'い㠶㐵䘷䘰䉆ㄴ㌰'}。我究竟做錯了什麼?

+0

我認爲這應該是一個'LPStr',而不是'LPWStr'。另外...你怎麼從'int'編組返回值'string'?我認爲你的代碼應該使用'ref'作爲'string prKey'參數。 –

回答

0

首先,「請求」拼寫錯誤。

其次,c#字符串是unicode(16位)。 VC6 char *是ASCII(8位)。你的MarshalAs應該使用MarshalAs(UnmanagedType.LPStr)

三,你的返回類型不是一個字符串,它是一個int,並應封送MarshalAs(UnmanagedType.I4)

+0

使用時UnmanagedType.LPStr返回''是空的!?!!? –

+0

正如Alvin Wong所指出的那樣,如果你想設置'prKey'的值,你也應該使用ref字符串(或者更可能是out字符串) – Tawnos