WM_SETTEXT
古い学校の Win32 API を介して別のウィンドウのテキストを設定するために使用できるメッセージを考えてみましょう。.NET でこれを行う方法はおそらく多数ありますが、私が知っている方法は次の 2 つです。
[DllImport("USER32", EntryPoint = "SendMessage", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, string lParam);
SendMessage(handle, WM_SETTEXT, IntPtr.Zero, "Magic String");
[DllImport("USER32", EntryPoint = "SendMessage", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
IntPtr textPointer = Marshal.StringToCoTaskMemUni("Magic String");
SendMessage(handle, WM_SETTEXT, IntPtr.Zero, textPointer);
Marshal.FreeCoTaskMem(textPointer);
最初のものは、dll インポートの宣言で文字列を使用し、.NET にそれを処理させます。この 2 番目は を使用し、IntPtr
を使用してポインタを明示的に作成し、 を使用しMarshal.StringToCoTaskMemUni
て解放しMarshal.FreeCoTaskMem
ます。私が知る限り、これらのアプローチはどちらもうまく機能します。
私は通常、前者を実行します (実際、VB6 プログラマーとして何年も前に実行していました) が、別の StackOverflow 投稿のコメントで後者に出くわし、前者が潰す必要のある別の悪い習慣であるかどうかに興味がありました。
char[]
宣言で配列を使用し、StringBuilder
私の質問は簡単です - (もしあれば) それを行う正しい方法はどれですか? たとえば、SendMessage
とにかく Win32 呼び出しはポインターのみを受け入れるため、「何か」が最初のバージョンの舞台裏でポインターを作成しているに違いありません。ポインタの解放。