/************************************************************************* ** ** ** 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 #include #ifdef WIN16 #include #include #include #include #include #include #endif #include #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