3

私はいくつかのWin32コードをC#に移植していますが、AとWで終わることを除いて、同じ名前で同じ構造を使用するいくつかの関数に出くわしました。

例えば:

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("shell32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool Shell_NotifyIconA(uint dwMessage, ref NOTIFYICONDATAA lpData);

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("shell32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool Shell_NotifyIconW(uint dwMessage, ref NOTIFYICONDATAW lpData);

次のように、関数名と関連する構造の両方からAとWを省略したC#の実装を見てきました。

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("shell32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern bool Shell_NotifyIcon(uint dwMessage, ref NOTIFYICONDATA lpData);

私が知りたいのは:

  1. AとWは何を意味しますか?

  2. C#では、AとWの両方を使用して上記のような関数を実装する必要がありますか、それとも単一の実装にするためにAとWを省略した方がよいでしょうか。

4

1 に答える 1

6

「A」サフィックス(ANSIを表す)は、関数が入力マルチバイト文字列(おそらくの一部のメンバーNOTIFYICONDATAは文字列)で機能することを意味し、「W」(「ワイド」を表す)は、関数が入力Unicodeで機能することを意味します文字列。

Windowsでは、可能な限りUnicode文字列を使用することをお勧めします。これは、OSが内部で使用するものだからです。したがって、プロジェクトがマルチバイト文字列を渡すことによってWindows APIを呼び出す場合、Unicodeへの変換は最終的に内部で行われ(OSが文字列を返す場合は2回目の変換がマルチバイトに戻る可能性があります)、処理速度が低下します。

通常、関数の特定のデータ構造の2つのバージョンがXマルチバイト文字とUnicode文字に存在する場合、それらには(それぞれ)XAとの名前が付けられ、プロジェクトの設定に基づいてどちらかに解決されるXW条件付きエイリアスが定義されます(切り替えX#ifdef行います)。

質問の2番目の部分に答えるには、C#について十分に知りません。

編集:

David Heffernanが指摘したように、p / invokeマーシャラーは、属性でCharSet使用されているものと一致する名前に名前を解決します。DllImport

于 2013-02-03T13:57:44.630 に答える