【发布时间】:2023-04-10 15:23:01
【问题描述】:
当我尝试在 WPF 中使用非托管代码时。例如SendMessage(IntPtr hWnd, int Msg, int wParam, ref TOOLINFO toolInfo),此函数可能会直接返回TOOLINFO中lpszText的0XFFFF,应用程序直接崩溃。我参考了 MSDN,发现这是一个 ERROR_ILLEGAL_CHARACTER 错误。所以我想问一下:我如何才能在托管代码中捕捉到这种错误,或者我如何才能返回 TOOLINFO 一个好的结果。
struct TOOLINFO
{
public int cbSize;
public int uFlags;
public IntPtr hwnd;
public IntPtr uId;
public RECT rect;
public IntPtr hinst;
[MarshalAs(UnmanagedType.LPStr)]
public string lpszText;
public IntPtr lParam;
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, ref TOOLINFO toolInfo);
【问题讨论】:
-
您要发送什么消息?解决方案仍然很简单:
public string lpszText;使其成为public IntPtr lpszText;,然后用Marshal.PtrToStringAuto()编组字符串(在 try/catch 中) -
我在ToolInfo 的描述中看到您必须分配缓冲区。您可以尝试使用具有预分配长度的
StringBuilder()(StringBuilder lpszText;,然后在发送消息之前lpszText = new StringBuilder(200) -
wParam应该是IntPtr
标签: c# error-handling memory-leaks pinvoke