mirror of https://github.com/lianthony/NT4.0
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.
272 lines
5.0 KiB
272 lines
5.0 KiB
/***
|
|
*
|
|
* Copyright (C) 1993-1994, Microsoft Corporation. All Rights Reserved.
|
|
* Information Contained Herein Is Proprietary and Confidential.
|
|
*
|
|
* File:
|
|
* main.cpp
|
|
*
|
|
* Purpose:
|
|
* This file contains:
|
|
*
|
|
* WinMain() and WndProc(), which are called by Windows when the app is run.
|
|
* Code to initialize and uninitialize OLE.
|
|
* Code to create and destroy the window for the application.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#include "common.h"
|
|
#include "resource.h"
|
|
#include "hello.h"
|
|
|
|
#include <string.h>
|
|
|
|
|
|
/* Global variables.
|
|
*/
|
|
|
|
DWORD g_dwCHelloCF = 0; // Holds the return code for class factory creation.
|
|
|
|
CHello FAR* g_phello = NULL; // Pointer to a CHello object.
|
|
|
|
TCHAR g_szAppName[] = TSTR("Hello"); // Name of the application.
|
|
|
|
|
|
|
|
/* Forward declarations.
|
|
*/
|
|
HRESULT InitOle(void);
|
|
void UninitOle(void);
|
|
BOOL InitApplication(HINSTANCE);
|
|
BOOL InitInstance(HINSTANCE, int);
|
|
|
|
|
|
|
|
/* Let Windows call WinMain and WndProc.
|
|
*/
|
|
extern "C"
|
|
{
|
|
long FAR PASCAL WndProc(HWND, UINT, WPARAM, LPARAM);
|
|
int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* WinMain
|
|
*
|
|
* Windows calls WinMain when the application starts.
|
|
*
|
|
*/
|
|
extern "C" int PASCAL
|
|
WinMain(
|
|
HINSTANCE hinst,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
MSG msg;
|
|
|
|
|
|
if(!hPrevInstance)
|
|
if(!InitApplication(hinst))
|
|
return FALSE;
|
|
|
|
if(InitOle() != NOERROR)
|
|
return FALSE;
|
|
|
|
if(!InitInstance(hinst, nCmdShow)){
|
|
UninitOle();
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
while(GetMessage(&msg, NULL, NULL, NULL)) {
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
|
|
// Uninitialize OLE.
|
|
UninitOle();
|
|
|
|
return msg.wParam;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* InitApplication
|
|
*
|
|
* Create a window and register it with Windows.
|
|
*
|
|
* Return FALSE if an error occurs and TRUE otherwise.
|
|
*/
|
|
BOOL
|
|
InitApplication(HINSTANCE hinst)
|
|
{
|
|
WNDCLASS wc;
|
|
|
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
wc.lpfnWndProc = WndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = DLGWINDOWEXTRA;
|
|
wc.hInstance = hinst;
|
|
wc.hIcon = LoadIcon(hinst, g_szAppName); // Loads hello.ico
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Normal arrow pointer
|
|
wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1);
|
|
wc.lpszMenuName = NULL; // No menus.
|
|
wc.lpszClassName= g_szAppName;
|
|
|
|
// Tell Windows about the window class we just created.
|
|
// Exit if an error occurs.
|
|
if(!RegisterClass(&wc))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* InitInstance
|
|
*
|
|
* Create an instance of CHello and make g_phello
|
|
* point to it..
|
|
*
|
|
* Return FALSE if an error occurs and TRUE otherwise.
|
|
*/
|
|
BOOL
|
|
InitInstance(HINSTANCE hinst, int nCmdShow)
|
|
{
|
|
HWND hwnd;
|
|
|
|
// Create the window and show it
|
|
hwnd = CreateDialog(hinst, g_szAppName, 0, NULL);
|
|
ShowWindow(hwnd, nCmdShow);
|
|
g_phello->m_hwnd = hwnd;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" long FAR PASCAL
|
|
WndProc(
|
|
HWND hwnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
switch(message) {
|
|
case WM_COMMAND:
|
|
g_phello->ProcessCommand(wParam);
|
|
return 0;
|
|
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
}
|
|
return DefWindowProc(hwnd, message, wParam, lParam);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HRESULT
|
|
InitOle()
|
|
{
|
|
HRESULT hresult;
|
|
IClassFactory FAR* pcf;
|
|
|
|
if((hresult = OleInitialize(NULL)) != NOERROR)
|
|
return hresult;
|
|
|
|
// create the single global instance of CHello
|
|
if((g_phello = CHello::Create()) == NULL){
|
|
hresult = ResultFromScode(E_OUTOFMEMORY);
|
|
return hresult;
|
|
}
|
|
|
|
// Create an instance of the class factory for CHello.
|
|
// Exit if an error occurs.
|
|
pcf = CHelloCF::Create();
|
|
if (pcf == NULL) {
|
|
UninitOle();
|
|
return hresult;
|
|
}
|
|
|
|
// Register the class factroy. Exit if an error occurs.
|
|
hresult = CoRegisterClassObject(CLSID_CHello,
|
|
pcf,
|
|
CLSCTX_LOCAL_SERVER,
|
|
REGCLS_MULTIPLEUSE,
|
|
&g_dwCHelloCF);
|
|
if (hresult != NOERROR) {
|
|
pcf->Release();
|
|
UninitOle();
|
|
return hresult;
|
|
}
|
|
|
|
pcf->Release();
|
|
|
|
// If execution has reached this spot, then no errors have occurred.
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* UninitOLE
|
|
*
|
|
* Tell OLE that we are going away.
|
|
*
|
|
*/
|
|
void
|
|
UninitOle()
|
|
{
|
|
// If a class factory was successfully created earlier then
|
|
// tell OLE that the object is no longer available.
|
|
if(g_dwCHelloCF != 0)
|
|
CoRevokeClassObject(g_dwCHelloCF);
|
|
|
|
// cause the remaining typeinfo to be released
|
|
if (g_phello != NULL)
|
|
g_phello->Release();
|
|
|
|
// Tell OLE we are done using them.
|
|
OleUninitialize();
|
|
}
|
|
|
|
|
|
#if defined(WIN32)
|
|
|
|
extern "C" char FAR*
|
|
ConvertStrWtoA(OLECHAR FAR* strIn, char FAR* buf, UINT size)
|
|
{
|
|
int badConversion = FALSE;
|
|
|
|
WideCharToMultiByte(CP_ACP, NULL,
|
|
strIn, -1,
|
|
buf, size,
|
|
NULL, &badConversion);
|
|
return buf;
|
|
}
|
|
|
|
extern "C" char FAR*
|
|
AnsiString(OLECHAR FAR* strIn)
|
|
{
|
|
static char buf[256];
|
|
|
|
return (ConvertStrWtoA(strIn, buf, 256));
|
|
}
|
|
|
|
#endif
|
|
|