2012-05-11 12 views
0

私はアンマネージコードによって呼び出されるインターフェイスを持っています。 BSTR型を渡しますが、データはASCII文字列です。ファイルに書き込まれているときに予期しない文字が表示されます。 Unmanaged [BSTR [ASCII]] - > Managed [String [ASCII]] - > File [Unicode [ASCII]]のようにデータがどのように動くのか考えて、入力時の文字と出力時の文字を同じにする必要があります。これは正しいです?アンマネージコードによって呼び出されるインタフェース関数は以下の通りです。マーシャリングされたBSTR型を使用してASCII文字列を渡す

//C# interface called by unmanged code 
public void WriteOutFile([In] [MarshalAs(UnmanagedType.BStr)] String asciiData) 
{ 
     File.WriteAllText(fileName, asciiData); 
} 
+1

ASCIIからBSTRへの変換がネイティブコードで行われました。 BSTRはUnicode文字列です。あなたのC#メソッドが呼び出されるまでにそれについて何かするのは遅すぎる。これはC/C++コードのかなり典型的な問題ですが、修正を行う必要があります。本当に必死なら、Encoding.Default.GetBytes()でバイトに変換し、正しいエンコーディングのGetString()メソッドを適用することができます。元のエンコーディングがロッシーであるため、これは通常は機能しません。 –

答えて

1

まず、.NET文字列は常にUnicode文字列です。対応するエンコーディングを使用して具体的な文字列を表現することはできますが、文字列内のすべての文字はUnicodeの文字です。

第2に、UnmanagedType.BStrを使用している場合、アンマネージコードはBSTRを渡して文字エンコードの問題自体を解決する必要があります(ASCIIは1バイト、BSTRは2バイト)。不可能な場合は、マーシャリングのための別のタイプを検討する必要があります。 UnmanagedType.LPStr。

関連する問題