考虑WM_SETTEXT
可用于通过老式 Win32 API 设置另一个窗口的文本的消息。在 .NET 中可能有多种方法可以做到这一点,我知道有两种方法:
[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 处理它。第二个使用 anIntPtr
并显式创建一个指针 usingMarshal.StringToCoTaskMemUni
然后释放 using Marshal.FreeCoTaskMem
。据我所知,这两种方法都很有效。
请注意,我通常会使用前者(事实上,我多年前作为 VB6 程序员曾经这样做过),但我在另一篇 StackOverflow 帖子的评论中遇到了后者,并且很好奇前者是否是另一个需要压制的坏习惯。
我还看到了第一个示例的变体,char[]
在声明中使用数组并传入StringBuilder
我的问题很简单——哪种(如果有的话)是正确的做法?例如,SendMessage
Win32 调用无论如何都只接受指针,因此“某些东西”必须在幕后为第一个版本创建指针,如果是这样,它是否会进行清理,或者最好是冗长并使用显式分配和指针的释放。