5

以下の試験問題の可能な解答についていくつか質問があります。

質問: 次のコード セグメントを記述して、プラットフォーム呼び出しを使用して 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は機能しないのですか?

4

3 に答える 3

12
 string personName = "N?el";

この文字列は、この質問が尋ねている正確な問題によって文字化けしました。間違いなく、オリジナルでは次のように見えました。

 string personName = "Nöel";

ö は問題になりがちです。ASCII 文字セットにない文字コードが含まれており、デフォルトのシステム コード ページでサポートされていない可能性があります。これは、MessageBoxA とも呼ばれる ANSI バージョンの MessageBox を P/Invoke するときに使用されるものです。実際の関数は、UTF-16 でエンコードされた Unicode 文字列を受け取る MessageBoxW です。

MessageBoxA は、プログラムがまだ 8 ビットの文字列を使用していた古いバージョンの Windows で使用されていたレガシー関数です。完全になくなったわけではなく、多くの C および C++ プログラムは依然として 8 ビット エンコーディングに固執する傾向があります。MessageBoxA は、8 ビットでエンコードされた文字列を Unicode に変換してからMessageBoxW を呼び出すことによって実装されます。そもそもUnicode文字列を持っていた場合、これは遅くて損失があります.

したがって、4 つのバージョンを評価します。

A: MessageBoxA + 8 ビット エンコーディングを使用します。危険です。
B: MessageBoxA + Unicode を使用し、失敗します。
C: MessageBoxW + Unicode を使用します。
D: MessageBoxA + Unicode を使用し、失敗します。

于 2013-07-23T11:15:00.350 に答える
0

答えは にあると思いpersonNameます。

あなたの質問に適切にコピー&ペーストされたとは思いません。

string personName = "N?el";

?キャラクターに注意してください。これは、元の文字列に ANSI 以外の文字が含まれていたことを示していると思います。それが真実であり、それを適切に見ることができる場合、ANSI ではなく Unicode を使用する必要があることを示します (したがって、答えは である必要がありますC)。

いずれにせよ、Unicode は ANSI よりも多くの形式で動作するため、デフォルトの選択肢としてはより適切です。

于 2013-07-23T10:55:14.823 に答える