以下の試験問題の可能な解答についていくつか質問があります。
質問: 次のコード セグメントを記述して、プラットフォーム呼び出しを使用して Win32 アプリケーション プログラミング インターフェイス (API) から関数を呼び出します。
string personName = "N?el";
string msg = "Welcome" + personName + "to club"!";
bool rc = User32API.MessageBox(0, msg, personName, 0);
文字列データを最適にマーシャリングできるメソッド プロトタイプを定義する必要があります。どのコード セグメントを使用する必要がありますか?
// A.
[DllImport("user32", CharSet = CharSet.Ansi)]
public static extern bool MessageBox(int hWnd, string text, string caption, uint type);
}
// B.
[DllImport("user32", EntryPoint = "MessageBoxA", CharSet = CharSet.Ansi)]
public static extern bool MessageBox(int hWnd,
[MarshalAs(UnmanagedType.LPWStr)]string text,
[MarshalAs(UnmanagedType.LPWStr)]string caption, uint type);
}
// C. - Correct answer
[DllImport("user32", CharSet = CharSet.Unicode)]
public static extern bool MessageBox(int hWnd, string text, string caption, uint type);
}
// D.
[DllImport("user32", EntryPoint = "MessageBoxA", CharSet = CharSet.Unicode)]
public static extern bool MessageBox(int hWnd,
[MarshalAs(UnmanagedType.LPWStr)]string text,
[MarshalAs(UnmanagedType.LPWStr)]string caption,
uint type);
}
正解がCなのはなぜですか?それはAであったこともできませんでしたか?唯一の違いは、Unicode ではなく ANSI であることです。
文字セットとして Unicode を選択し、エントリポイントとして ANSI 関数を使用しているため、D ではないことは理解しています。
なぜBは機能しないのですか?