windows-nt/Source/XPSP1/NT/shell/osshell/regwiz/regwizexe/rwexemain.cpp

311 lines
7 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*************************************************************************
**
**
** File : RWExeMain.cpp
** Product :
** Date : 05/07/97
** Author : Suresh Krishnan
**
** Registration Wizard Exe programs main file
** The Exe version of Registration Wizard is implemented using the Active X
** component
**
*************************************************************************/
#define STRICT
#include <windows.h>
#include <windowsx.h>
#ifdef WIN16
#include <ole2.h>
#include <compobj.h>
#include <dispatch.h>
#include <variant.h>
#include <olenls.h>
#include <commdlg.h>
#endif
#include <initguid.h>
#include "RWInterface.h"
#include "RWExeMain.h"
#include "resource.h"
// Globals
HINSTANCE g_hinst; // Instance of application
HWND g_hwnd; // Toplevel window handle
TCHAR g_szNotFound[STR_LEN];
TCHAR g_szError[STR_LEN];
#define INVOKDE_REGISTRATION 1
#define INVOKE_TRANSFER 2
#define INVOKE_ERROR 3
#define chSpace 32
int ProcessCmdLine(LPTSTR lpCmd)
{
int iC=0;
int iExit=1;
LPTSTR szCurr = lpCmd;
if (lpCmd == NULL || lpCmd[0] == 0)
{
return INVOKE_ERROR;
}
while (*szCurr == chSpace)
{
szCurr = CharNext(szCurr);
}
if (*szCurr != '/' && *szCurr != '-') {
return INVOKE_ERROR ;
}
szCurr = CharNext(szCurr);
if (*szCurr == 'I' || *szCurr == 'i') {
return INVOKDE_REGISTRATION ;
}
if (*szCurr == 'T' || *szCurr == 't') {
return INVOKE_TRANSFER ;
}
return INVOKE_ERROR;
}
/*
* WinMain
*
* Purpose:
* Main entry point of application. Should register the app class
* if a previous instance has not done so and do any other one-time
* initializations.
*
*/
/*
int _tWinMain ( HINSTANCE hinst,
HINSTANCE hinstPrev,
LPTSTR lpCmdLine,
int nCmdShow)
*/
int APIENTRY WinMain (HINSTANCE hinst,
HINSTANCE hinstPrev,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
static IRegWizCtrl FAR* pRegWiz = NULL;
HRESULT hr;
LPUNKNOWN punk;
// It is recommended that all OLE applications set
// their message queue size to 96. This improves the capacity
// and performance of OLE's LRPC mechanism.
int cMsg = 96; // Recommend msg queue size for OLE
while (cMsg && !SetMessageQueue(cMsg)) // take largest size we can get.
cMsg -= 8;
if (!cMsg)
return -1; // ERROR: we got no message queue
LoadString(hinst, IDS_RWNOTFOUND, g_szNotFound, STR_LEN);
LoadString(hinst, IDS_ERROR, g_szError, STR_LEN);
if (!hinstPrev)
if (!InitApplication(hinst))
return (FALSE);
if(OleInitialize(NULL) != NOERROR)
return FALSE;
if (!InitInstance(hinst, nCmdShow))
return (FALSE);
hr = CoCreateInstance(CLSID_RegWizCtrl, NULL, CLSCTX_INPROC_SERVER,
IID_IUnknown, (void FAR* FAR*)&punk);
if (FAILED(hr)) {
MessageBox(NULL,g_szNotFound , g_szError, MB_OK);
return 0L;
}
hr = punk->QueryInterface(IID_IRegWizCtrl , (void FAR* FAR*)&pRegWiz);
if (FAILED(hr))
{
MessageBox(NULL, TEXT("QueryInterface(IID_IHello)"), g_szError, MB_OK);
punk->Release();
return 0L;
}
#ifndef _UNICODE
hr = pRegWiz->InvokeRegWizard(ConvertToUnicode(lpCmdLine));
#else
hr = pRegWiz->InvokeRegWizard(lpCmdLine);
#endif
/*
int iStatus = ProcessCmdLine(lpCmdLine);
switch(iStatus )
{
case INVOKDE_REGISTRATION :
#ifndef _UNICODE
hr = pRegWiz->InvokeRegWizard(ConvertToUnicode(lpCmdLine));
#else
hr = pRegWiz->InvokeRegWizard(lpCmdLine);
#endif
break;
case INVOKE_TRANSFER :
#ifndef _UNICODE
hr = pRegWiz->TransferRegWizInformation(ConvertToUnicode(lpCmdLine));
#else
hr = pRegWiz->TransferRegWizInformation(lpCmdLine);
#endif
default:
break;
}
*/
// ConvertToUnicode("/i \"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\"") );
OleUninitialize();
if(SUCCEEDED(hr))
return NO_ERROR;
else
return 1;
//return (msg.wParam); // Returns the value from PostQuitMessage
}
/*
* InitApplication
*
* Purpose:
* Registers window class
*
* Parameters:
* hinst hInstance of application
*
* Return Value:
* TRUE if initialization succeeded, FALSE otherwise.
*/
BOOL InitApplication (HINSTANCE hinst)
{
WNDCLASS wc;
wc.style = CS_DBLCLKS;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hinst;
wc.hIcon =0; // LoadIcon(hinst, TEXT("ControlIcon"));
wc.hCursor =0; // LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = NULL ;//TEXT("");
wc.lpszClassName = TEXT("RegistrationWizard");
return RegisterClass(&wc);
}
/*
* InitInstance
*
* Purpose:
* Creates and shows main window
*
* Parameters:
* hinst hInstance of application
* nCmdShow specifies how window is to be shown
*
* Return Value:
* TRUE if initialization succeeded, FALSE otherwise.
*/
BOOL InitInstance (HINSTANCE hinst, int nCmdShow)
{
g_hinst = hinst;
return TRUE;
}
/*
* MainWndProc
*
* Purpose:
* Window procedure for main window
*
*/
LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return NULL;
}
/*
* DisplayError
*
* Purpose:
* Obtains Rich Error Information about the automation error from
* the IErrorInfo interface.
*
*/
void DisplayError(IRegWizCtrl FAR* phello)
{
IErrorInfo FAR* perrinfo;
BSTR bstrDesc;
HRESULT hr;
ISupportErrorInfo FAR* psupporterrinfo;
hr = phello->QueryInterface(IID_ISupportErrorInfo, (LPVOID FAR*)&psupporterrinfo);
if (FAILED(hr))
{
MessageBox(NULL, TEXT("QueryInterface(IID_ISupportErrorInfo)"), g_szError, MB_OK);
return;
}
hr = psupporterrinfo->InterfaceSupportsErrorInfo(IID_IRegWizCtrl);
if (hr != NOERROR)
{
psupporterrinfo->Release();
return;
}
psupporterrinfo->Release();
// In this example only the error description is obtained and displayed.
// See the IErrorInfo interface for other information that is available.
hr = GetErrorInfo(0, &perrinfo);
if (FAILED(hr))
return;
hr = perrinfo->GetDescription(&bstrDesc);
if (FAILED(hr))
{
perrinfo->Release();
return;
}
MessageBox(NULL, FROM_OLE_STRING(bstrDesc), g_szError, MB_OK);
SysFreeString(bstrDesc);
}
#ifdef WIN32
#ifndef UNICODE
char* ConvertToAnsi(OLECHAR FAR* szW)
{
static char achA[STRCONVERT_MAXLEN];
WideCharToMultiByte(CP_ACP, 0, szW, -1, achA, STRCONVERT_MAXLEN, NULL, NULL);
return achA;
}
OLECHAR* ConvertToUnicode(char FAR* szA)
{
static OLECHAR achW[STRCONVERT_MAXLEN];
MultiByteToWideChar(CP_ACP, 0, szA, -1, achW, STRCONVERT_MAXLEN);
return achW;
}
#endif
#endif