2013-02-14 84 views
0

我有一個在C#中的託管GUI和在C++中的非託管DLL。我通過引用來傳遞結構的DLL函數的結構。該結構有幾個wchar_t元素和幾個字符串。wchar_t數據被混亂從非託管到託管

在DLL裏面所有的數據在返回GUI之前看起來都很好。例如:

struct1->ch1 = 0x1234; 
struct1->ch2 = 0x5678; 
struct1->ch3 = 'ab'; 
struct1->ch4 = 'cd'; 

但是,當從DLL返回結構數據時出現亂碼。

struct1->ch1 == 0x0034 
struct1->ch2 == 0x0012 
struct1->ch3 == 0x0078 
struct1->ch4 == 0x0056 

其他字符串元素返回正常。

被填充的char數據是單個字節,所以我知道我可以只使用BYTE類型,但我想要解決這個問題。

我是新來的託管/非託管關係,所以我不知道發生了什麼事情。有任何想法嗎?

+0

試試看看[這個問題](http://stackoverflow.com/questions/6089214/how-do-i-marshal-wchar-t-from- C到C-尖銳-AS-一個出 - 對米或返回值)及其選定答案。看起來wchar_t不能像你這樣做從託管代碼傳遞到非託管代碼。 – jszigeti 2013-02-14 01:19:23

回答

0

有幾種選擇。首先,你可以標記你的整個結構爲Unicode(所以chars將被解釋爲wchar_t)有:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
struct MyStruct { ... } 

或者您可以使用一個16位的int:

short ch1; 

或者告訴編組每個項目明確使用什麼做:

[MarshalAs(UnmanagedType.U2)] char ch1; 
+0

謝謝! [MarshalAs(UnmanagedType.U2)]做到了。 – alexsd 2013-02-14 18:21:45