Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

204 lines
4.9 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: QVMAIN.CP
//
// Contents:
//
// Functions:
//
// History: dd-mmm-yy History Comment
// 12-Oct-94 davepl NT Port
//
//--------------------------------------------------------------------------
#include "qvstub.h"
#pragma hdrstop
#include <commctrl.h>
HINSTANCE g_hinst = NULL;
const TCHAR c_szQVMasterClass[] = TEXT("QVMasterClass");
HWND QVMaster_Create(LONG * pcqv);
//+-------------------------------------------------------------------------
//
// Function: WinMain
//
// History: dd-mmm-yy History Comment
// 12-Oct-94 davepl NT Port
//
// Notes:
//
//--------------------------------------------------------------------------
int PASCAL WinMain(HINSTANCE hInst,
HINSTANCE hInstPrev,
LPSTR pszAnsiCmdLine,
int nCmdShow)
{
LPTSTR pszCmdLine;
//
// The command line is supplied in ANSI format only at the WinMain entry
// point. When running on a UNICODE platform, we ask for the command
// line in UNICODE from Windows directly.
//
#ifdef UNICODE
pszCmdLine = GetCommandLine();
#else
pszCmdLine = pszAnsiCmdLine;
#endif
COPYDATASTRUCT cpdata = { nCmdShow, lstrlen(pszCmdLine)+1, pszCmdLine };
//
// First, try to find a QVMaster window created by another process.
//
HWND hwndMaster = FindWindow(c_szQVMasterClass, NULL);
if (hwndMaster)
{
// We found a QVMaster window.
if ((HINSTANCE)SendMessage(hwndMaster, WM_COPYDATA, (WPARAM)hInst, (LPARAM)&cpdata)==hInst)
{
// We have successfully sent the message.
return 0;
}
}
//
// It failed -- create our own QVMaster window.
//
g_hinst = hInst;
LONG cqv = 0; // number of quick view window
hwndMaster = QVMaster_Create(&cqv);
if (hwndMaster)
{
SendMessage(hwndMaster, WM_COPYDATA, 0, (LPARAM)&cpdata);
while (cqv)
{
MSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
DispatchMessage(&msg);
}
}
//
// BUGBUG: Kernel put this process in dead-lock if we return from
// the main thread without killing all the other threads.
// Calling exit(0) works around this bug.
//
exit(0);
}
return 0;
}
//+-------------------------------------------------------------------------
//
// Function: QVMaster_OnCopyData
//
// Synopsis: Grabs a pointer from the window data, treats it as a
// pointer to a COPYDATASTRUCT, and fills in the
//
//
// Effects:
//
// Arguments:
//
//
//
// Requires:
//
// Returns:
//
//
// History: dd-mmm-yy Author Comment
// davepl
//
// Notes:
//
//--------------------------------------------------------------------------
// BUGBUG: Treats window long as a ptr. Is this assuming shared memory?
void QVMaster_OnCopyData(HWND hwnd, PCOPYDATASTRUCT pcpdata)
{
LONG * pcqv = (LONG *)GetWindowLong(hwnd, GWL_USERDATA);
if (pcqv)
{
LPCTSTR pszCmdLine = (LPCTSTR)pcpdata->lpData;
int nCmdShow = (int)pcpdata->dwData;
PCQVStub pQV = new CQVStub(g_hinst, pcqv, pszCmdLine, nCmdShow);
DWORD dwIDThread;
HANDLE hThread = CreateThread(0, 1024*8, ViewThreadInit, (PVOID)pQV, 0, &dwIDThread);
CloseHandle(hThread);
}
}
LRESULT WINAPI QVMaster_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COPYDATA:
QVMaster_OnCopyData(hwnd, (PCOPYDATASTRUCT)lParam);
return (LRESULT)wParam;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
HWND QVMaster_Create(LONG * pcqv)
{
HWND hwndMaster = NULL;
WNDCLASS wc;
wc.lpfnWndProc = QVMaster_WndProc;
wc.lpszClassName = c_szQVMasterClass;
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.lpszMenuName = NULL;
wc.hbrBackground = (HBRUSH)(NULL);
wc.hInstance = g_hinst;
wc.style = 0;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(LONG);
if (RegisterClass(&wc))
{
hwndMaster = CreateWindow(c_szQVMasterClass,
NULL,
WS_DISABLED,
0,
0,
0,
0,
NULL,
NULL,
g_hinst,
0L);
if (hwndMaster)
{
SetWindowLong(hwndMaster, GWL_USERDATA, (LONG)pcqv);
}
}
return hwndMaster;
}