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を適用します。