0

私は C# で管理された GUI と C++ で管理されていない DLL を持っています。構造体が格納されている DLL 関数への参照によって構造体を渡します。構造体には、いくつかの 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 データは 1 バイトなので、BYTE 型しか使用できないことはわかっていますが、これを理解したいと思います。

管理対象/管理対象外の関係に慣れていないので、何が起こっているのかわかりません。何か案は?

4

1 に答える 1

0

いくつかのオプションがあります。まず、構造体全体を Unicode としてマークすることができます (したがって、charsは として解釈されますwchar_t)。

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

または、16 ビットの int を使用できます。

short ch1;

または、マーシャラーに次のように明示的に各アイテムを実行するよう指示します。

[MarshalAs(UnmanagedType.U2)] char ch1;
于 2013-02-14T03:21:12.920 に答える