HWND hdWindowThread::CreatWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x, int y,
int nWidth, int nHeight,
HWND hWndParent,HMENU hMenu,
HINSTANCE hInstance, LPVOID lpParam) {
Start();
Shared_CW &Shared=*new Shared_CW;
MARSHAL(LPCTSTR, lpClassName)
MARSHAL(LPCTSTR , lpWindowName)
MARSHAL(DWORD, dwStyle)
MARSHAL(int, x)
MARSHAL(int, y)
MARSHAL(int, nWidth)
MARSHAL(int, nHeight)
MARSHAL(HWND, hWndParent)
MARSHAL(HMENU, hMenu)
MARSHAL(HANDLE, hInstance)
MARSHAL(LPVOID, lpParam)
Shared.hdr.hEvent=CreateEvent(0,1,0,0);
Shared.hdr.hWnd=0;
if (!TryPostThreadMessage(idThread,wm_CreateWindow,0,(LPARAM)&Shared)) {
SetLastError(ERROR_TIMEOUT);
return (HWND)INVALID_HANDLE_VALUE;
}
WaitForSingleObject(Shared.hdr.hEvent,INFINITE);
CloseHandle(Shared.hdr.hEvent);
HWND result=Shared.hdr.hWnd;
if (result==INVALID_HANDLE_VALUE) SetLastError(Shared.hdr.CW_Result);
delete &Shared;
return result;
}
the secondary thread function starts out like:
while (GetMessage(&msg,(HWND)NULL,0,0)) {
if (!msg.hwnd) {
switch (msg.message) {
case wm_CreateWindow: {
Shared_CW &Shared=*(Shared_CW*)lpData;
Shared.hdr.hWnd=::CreateWindow(Shared.lpClassName,
Shared.lpWindowName,
Shared.dwStyle,
Shared.x, Shared.y,
Shared.nWidth,Shared.nHeight,
Shared.hWndParent,Shared.hMenu,
Shared.hInstance,Shared.lpParam);
if (Shared.hdr.hWnd==INVALID_HANDLE_VALUE) {
Shared.hdr.CW_Result=GetLastError();
}
SetEvent(Shared.hdr.hEvent);
}
break;