311 lines
7 KiB
C++
311 lines
7 KiB
C++
/*************************************************************************
|
|
**
|
|
**
|
|
** 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
|
|
|