0

Microsoft P/Invoke Interop Assistant ツールを使用して、ネイティブ C/C++ コードからいくつかの構造体、デリゲートなどを生成しています。

これらの 1 つの例は関数ポインター (デリゲート) で、マネージ コードで次の名前に解決されます。

EnumCalendarInfoProcA
EnumCalendarInfoProcW
EnumCalendarInfoProcExA
EnumCalendarInfoProcExW

AとW、ExAとExWの違いを説明できる人はいますか?

4

2 に答える 2

2

PInvokeInteropAssistantには少し注意する必要があります。生成される宣言は完全に自動生成され、編集されません。結果としてかなり厄介な結果を生成する傾向があります。少なくとも、pinvoke.netWebサイトやMSDNライブラリから入手できるような編集された宣言のソースと比較する必要があります。

関数が文字列を操作するため、AバージョンとWバージョンが存在します。9xブランチの古いバージョンのWindowsはUnicodeに対応していませんでした。彼らはAバージョン、8ビットでエンコードされた文字を含む文字列を使用しました。これは、WindowsMEの迅速かつ当然の終焉とは関係がなくなりました。今日遭遇するWindowsのすべてのバージョンは、NTブランチのものであり、コアでUnicodeが有効になっています。

pinvokeマーシャラーは、[DllImport]属性のCharSetプロパティに基づいて、AバージョンとWバージョンのどちらかを適切に選択する方法をすでに知っています。残念ながら、デフォルトは依然としてAnsiです。大きな間違いです。常に、CharSet.Autoを指定し、Wなしの名前を使用する必要があります。EnumCalendarInfoProcはコールバックプロトタイプであるため、正確な名前は実際には重要ではありません。デリゲートとして宣言します。任意の名前を選択できます。

EnumCalendarInfoProcとEnumCalendarInfoProcExの違いは、MSDNの記事で詳しく説明されています。Exバージョンには追加の引数があります。どちらを使用する必要があるかは、列挙を開始するために使用するapi関数によって決まります。EnumCalendarInfo()またはEnumCalendarInfoEx()のいずれかを選択します。後者は理にかなっています。また、Vista以降で利用可能なExExバージョンに注意してください。文化は、MicrosoftがExesを作成する能力よりも速く変化します;)

デリゲートと関数宣言の両方にCharSet.Autoを適用します。

于 2012-10-11T12:26:31.793 に答える
2

一部の関数には複数の形式があります。Ascii (MessageBoxA) または wide char / unicode (MessageBoxW) のいずれかです。関数が同じことを行う場合、名前には通常、接尾辞「Ex」が付けられ、おそらく拡張を意味します。

以下の関数のように

メッセージボックス: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

MessageBoxEx: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645507(v=vs.85).aspx

ここで、MessageBoxEx はパラメーター wLanguageId によって拡張されます。

于 2012-10-11T11:22:08.727 に答える