dic*_*oce 1 winapi deadlock window createwindow
我正在为OpenGL开发一个可移植层(为Linux和Windows抽象出glX和wgl的东西)......无论如何,它有一个创建窗口的方法...如果你没有传入父级,你会得到一个带框架的真实窗口...如果你传入一个父级,你会得到一个无框的无框窗口......
这工作正常,只要我在1个线程上完成所有操作...一旦另一个线程尝试创建子窗口,应用程序就会在win32调用"CreateWindow()"中死锁.有任何想法吗?
这不是一个真正的答案,但由于很多人似乎相信Win32禁止在父母以外的其他线程中创建孩子,我觉得有必要发表相反的示威.
下面的代码演示了如何在属于不同进程的父级上创建子窗口.它接受窗口句柄值作为命令行参数,并在该父窗口上创建子窗口.
// t.cpp
#include <windows.h>
#include <stdio.h>
#define CLASS_NAME L"fykshfksdafhafgsakr452"
static LRESULT CALLBACK WindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch ( msg )
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
break;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int main( int argc, char* argv[] )
{
HWND parent = (argc >= 2) ? (HWND)strtoul(argv[1], 0, 0) : (HWND)0;
printf("parent: 0x%x\n", parent);
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = (HINSTANCE)GetModuleHandle(NULL);
wc.lpszClassName = CLASS_NAME;
wc.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION + 1);
if ( !RegisterClass(&wc) )
{
printf("%d: error %d\n", __LINE__, GetLastError());
return 0;
}
const DWORD style = WS_CHILD | WS_VISIBLE;
HWND hwnd = CreateWindow(CLASS_NAME, L"Test", style, 50, 50, 100, 100,
parent, 0, wc.hInstance, 0);
if ( !hwnd )
{
printf("%d: error %d\n", __LINE__, GetLastError());
return 0;
}
MSG msg;
while ( GetMessage(&msg, 0, 0, 0) )
DispatchMessage(&msg);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令编译它(使用MSVC命令行环境):
cl /EHsc /DUNICODE /D_UNICODE t.cpp user32.lib
Run Code Online (Sandbox Code Playgroud)
然后使用Spy ++或其他工具获取任何窗口的句柄值 - 例如记事本或您正在查看此站点的浏览器.让我们假设它是0x00001234.然后运行编译的示例t.exe 0x1234.使用Ctrl-C终止t.exe(或只关闭控制台窗口).
| 归档时间: |
|
| 查看次数: |
4243 次 |
| 最近记录: |