.NETコアのC#コンソールアプリケーションでP/Invoke Win32 APIを使用してウィンドウを作成しています。以下は、コアコードです。P/Invokeウィンドウがメッセージを受信するとPostMessageがクラッシュする
class WindowContext
{
public IWindow MainLoop(Action guiMethod)// this is called somewhere else
{
MSG msg = new MSG();
while (msg.message != 0x12/*WM_QUIT*/)
{
if (PeekMessage(ref msg, IntPtr.Zero, 0, 0, 0x0001/*PM_REMOVE*/))
{
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
}
}
private IntPtr WindowProc(IntPtr hWnd, uint msg, UIntPtr wParam, IntPtr lParam)
{
//....
}
public IWindow CreateWindow(Point position, Size size)// this is called to create a window
{
IntPtr hInstance = processHandle.DangerousGetHandle();
string szAppName = "ImGuiApplication~";
WNDCLASS wndclass;
wndclass.style = 0x0002 /*CS_HREDRAW*/ | 0x0001/*CS_VREDRAW*/;
wndclass.lpfnWndProc = WindowProc;
// RegisterClass(ref wndclass);
// CreateWindowEx(...)
// ...
}
}
しかし、ウィンドウにマウスを移動すると、プログラムはクラッシュし続けます。
プログラム '[18996] dotnet.exe'がコード-1073740771(0xc000041d)で終了しました。
最後に、PeekMessageが呼び出されたときにクラッシュが発生していることがわかりました。しかし、私は理由を伝えることができませんでした。