extern "C" BOOL RegisterComServers (char *modulePath) { BOOL ret = TRUE; wchar_t mainModule[1024], formatModule[1024]; CComPtr<ITypeLib> tl, tl2; wsprintfW (mainModule, L"%hsGostCrypt.exe", modulePath); wsprintfW (formatModule, L"%hsGostCrypt Format.exe", modulePath); UnRegisterTypeLib (LIBID_GostCryptMainCom, GST_MAIN_COM_VERSION_MAJOR, GST_MAIN_COM_VERSION_MINOR, 0, SYS_WIN32); UnRegisterTypeLib (LIBID_GostCryptFormatCom, GST_FORMAT_COM_VERSION_MAJOR, GST_FORMAT_COM_VERSION_MINOR, 0, SYS_WIN32); wchar_t setupModule[MAX_PATH]; GetModuleFileNameW (NULL, setupModule, sizeof (setupModule) / sizeof (setupModule[0])); CRegObject ro; HRESULT r; if (!SUCCEEDED (r = ro.FinalConstruct ()) || !SUCCEEDED (r = ro.AddReplacement (L"MAIN_MODULE", mainModule)) || !SUCCEEDED (r = ro.AddReplacement (L"FORMAT_MODULE", formatModule)) || !SUCCEEDED (r = ro.ResourceRegister (setupModule, IDR_COMREG, L"REGISTRY")) || !SUCCEEDED (r = LoadTypeLib (mainModule, &tl)) || !SUCCEEDED (r = RegisterTypeLib (tl, mainModule, 0)) || !SUCCEEDED (r = LoadTypeLib (formatModule, &tl2)) || !SUCCEEDED (r = RegisterTypeLib (tl2, formatModule, 0))) { MessageBox (MainDlg, _com_error (r).ErrorMessage(), GST_APP_NAME, MB_ICONERROR); ret = FALSE; } ro.FinalRelease (); return ret; }
///////////////////////////////////////////////////////////////////////////// // SAX message handlers BOOL SAX::OnInitDialog() { CDialog::OnInitDialog(); ITypeLib **pptLib = new (ITypeLib *); CString tlb, path; tlb = path = getApp().getCamcadExeFolderPath(); tlb += "camcad.tlb"; if (LoadTypeLib(tlb.AllocSysString(), pptLib) != S_OK || RegisterTypeLib(*pptLib, tlb.AllocSysString(), path.AllocSysString()) != S_OK) MessageBox("Type libraries not avalible for browsing."); delete (pptLib); //#Reference {F8DE4B05-FBC2-11D1-BA40-0080ADB36DBB}#1.0#0#C:\camcad\WinDebug\Camcad.tlb#CAMCAD dispatch = NULL; // HRESULT hr = __CreateObject(OLESTR("CAMCAD.Application"), &dispatch); // if (FAILED(hr)) // { m_sbpro.SetCode("Sub Main\r\n\tDim objCAMCAD\r\n\tSet objCAMCAD = CreateObject(\"CAMCAD.Application\")\r\n\r\n\t'example\r\n\t'objCAMCAD.ZoomLevel 2, 1\r\n\r\nEnd Sub"); m_sbpro.AddExtension("{F8DE4B05-FBC2-11D1-BA40-0080ADB36DBB}#1.0#0#", NULL); // } // else // m_sbpro.AddExtension("", dispatch); m_sbpro.SetDefaultDataType("CAMCAD.Application"); m_sbpro.SetHighlightExtension(0x804000); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
// Register this browser helper object. This method is invoked by regsrv32.exe // during installation to set the Windows Registry keys that tell Internet // Explorer that we are a Browser Helper Object server. HRESULT __stdcall DllRegisterServer(void) { HKEY hkBHO = NULL, hkVerity = NULL; LPTYPELIB pTypeLib = NULL; HRESULT hr; WCHAR lpzLibrary[MAX_PATH]; LPTSTR lpzControlName = _T("Verity Controller"); LPTSTR lpzClassKey = _T("CLSID\\") CLSID_VERITY; LPTSTR lpzContextKey = _T("CLSID\\{7CD57D42-C553-4B82-A52A-513082F57EE0}"); LPTSTR lpzOnDocumentKey = _T("CLSID\\{42939237-42F0-4E3F-818E-FA63E4EB5A82}"); LPTSTR lpzBHOKey = _T("Software\\Microsoft\\Windows\\CurrentVersion\\") _T("Explorer\\Browser Helper Objects"); if (!GetModuleFileNameW(hDllModule, lpzLibrary, MAX_PATH)) { hr = E_FAIL; goto exit; } if (hr = AddClass(L"CLSID\\" CLSID_VERITY, L"Verity Controller", lpzLibrary)) { goto exit; } if (hr = AddClass(L"CLSID\\{73C6AB50-2BEE-4DC0-AB1C-910C255D1C23}", L"Verity ActiveScriptSite", lpzLibrary)) { goto exit; } if (hr = AddClass(L"CLSID\\{42939237-42F0-4E3F-818E-FA63E4EB5A82}", L"Verity OnDocument Handler", lpzLibrary)) { goto exit; } if (hr = AddClass(L"CLSID\\{7CD57D42-C553-4B82-A52A-513082F57EE0}", L"Verity Script Context", lpzLibrary)) { goto exit; } if (hr = CreateKey(HKEY_LOCAL_MACHINE, lpzBHOKey, &hkBHO)) goto exit; if (hr = CreateKey(hkBHO, CLSID_VERITY, &hkVerity)) goto exit; if (hr = SetString(hkVerity, NULL, lpzControlName)) goto exit; if (hr = LoadTypeLib(lpzLibrary, &pTypeLib)) goto exit; if (hr = RegisterTypeLib(pTypeLib, lpzLibrary, NULL)) goto exit; exit: if (hkBHO) { RegCloseKey(hkBHO); } if (hkVerity) { RegCloseKey(hkVerity); } if (pTypeLib) { pTypeLib->lpVtbl->Release(pTypeLib); } return hr; }
BOOL AFXAPI AfxOleRegisterTypeLib(HINSTANCE hInstance, REFGUID tlid, LPCTSTR pszFileName, LPCTSTR pszHelpDir) { USES_CONVERSION; BOOL bSuccess = FALSE; CString strPathName; TCHAR *szPathName = strPathName.GetBuffer(_MAX_PATH); ::GetModuleFileName(hInstance, szPathName, _MAX_PATH); strPathName.ReleaseBuffer(); LPTYPELIB ptlib = NULL; // If a filename was specified, replace final component of path with it. if (pszFileName != NULL) { int iBackslash = strPathName.ReverseFind('\\'); if (iBackslash != -1) strPathName = strPathName.Left(iBackslash+1); strPathName += pszFileName; } if (SUCCEEDED(LoadTypeLib(T2COLE(strPathName), &ptlib))) { ASSERT_POINTER(ptlib, ITypeLib); LPTLIBATTR pAttr; GUID tlidActual = GUID_NULL; if (SUCCEEDED(ptlib->GetLibAttr(&pAttr))) { ASSERT_POINTER(pAttr, TLIBATTR); tlidActual = pAttr->guid; ptlib->ReleaseTLibAttr(pAttr); } // Check that the guid of the loaded type library matches // the tlid parameter. ASSERT(IsEqualGUID(tlid, tlidActual)); if (IsEqualGUID(tlid, tlidActual)) { // Register the type library. if (SUCCEEDED(RegisterTypeLib(ptlib, T2OLE((LPTSTR)(LPCTSTR)strPathName), T2OLE((LPTSTR)pszHelpDir)))) bSuccess = TRUE; } RELEASE(ptlib); } else { TRACE1("Warning: Could not load type library from %s\n", (LPCTSTR)strPathName); } return bSuccess; }
void RegTypeLib(TCHAR *file) { #ifdef _UNICODE ITypeLib* tlib; if (SUCCEEDED(LoadTypeLib(file, &tlib))) { RegisterTypeLib(tlib, file, NULL); tlib->lpVtbl->Release(tlib); } #else WCHAR wfile[STR_SIZE]; if (MultiByteToWideChar(CP_ACP, 0, file, -1, wfile, STR_SIZE) != 0) { ITypeLib* tlib; if (SUCCEEDED(LoadTypeLib(wfile, &tlib))) { RegisterTypeLib(tlib, wfile, NULL); tlib->lpVtbl->Release(tlib); } } #endif }
void RegTypeLib(char *file) { WCHAR wfile[STR_SIZE]; if (MultiByteToWideChar(CP_ACP, 0, file, -1, wfile, STR_SIZE) != 0) { ITypeLib* tlib; if (SUCCEEDED(LoadTypeLib(wfile, &tlib))) { RegisterTypeLib(tlib, wfile, NULL); tlib->lpVtbl->Release(tlib); } } }
// @pymethod |pythoncom|RegisterTypeLib|Adds information about a type library to the system registry. PyObject *pythoncom_registertypelib(PyObject *self, PyObject *args) { PyObject *obTypeLib, *obPath, *obHelpDir = Py_None; // @pyparm <o PyITypeLib>|typelib||The type library being registered. // @pyparm string|fullPath||Fully qualified path specification for the type library being registered // @pyparm string|helpDir|None|Directory in which the Help file for the library being registered can be found. Can be None. // @pyparm int|lcid|LOCALE_USER_DEFAULT|The locale ID to use. if (!PyArg_ParseTuple(args, "OO|O:RegisterTypeLib", &obTypeLib, &obPath, &obHelpDir)) return NULL; PyObject *result = NULL; BSTR bstrPath = NULL; BSTR bstrHelpDir = NULL; ITypeLib *pLib = NULL; SCODE sc; if (!PyWinObject_AsBstr(obPath, &bstrPath, FALSE)) goto done; if (!PyWinObject_AsBstr(obHelpDir, &bstrHelpDir, TRUE)) goto done; if (!PyCom_InterfaceFromPyInstanceOrObject(obTypeLib, IID_ITypeLib, (void **)&pLib, FALSE)) goto done; { // scope to avoid warning about var decl and goto. PY_INTERFACE_PRECALL; sc = RegisterTypeLib(pLib, bstrPath, bstrHelpDir); PY_INTERFACE_POSTCALL; } if (FAILED(sc)) return PyCom_BuildPyException(sc); result = Py_None; Py_INCREF(result); done: if (bstrPath) SysFreeString(bstrPath); if (bstrHelpDir) SysFreeString(bstrHelpDir); if (pLib) { PY_INTERFACE_PRECALL; pLib->Release(); PY_INTERFACE_POSTCALL; } return result; // @comm This function can be used during application initialization to register the application's type // library correctly. When RegisterTypeLib is called to register a type library, // both the minor and major version numbers are registered in hexadecimal. // <nl> In addition to filling in a complete registry entry under the type library key, // RegisterTypeLib adds entries for each of the dispinterfaces and Automation-compatible // interfaces, including dual interfaces. This information is required to create // instances of these interfaces. Coclasses are not registered (that is, // RegisterTypeLib does not write any values to the CLSID key of the coclass). }
// // Server registration // STDAPI DllRegisterServer() { const HMODULE hModule = ::GetModuleHandle(nullptr); HRESULT hr = RegisterServer(hModule, CLSID_GitWCRev, L"GitWCRev Server Object", L"GitWCRev.object", L"GitWCRev.object.1", LIBID_LibGitWCRev) ; if (SUCCEEDED(hr)) RegisterTypeLib(hModule, nullptr); return hr; }
STDAPI DllRegisterServer(void) { WCHAR path[MAX_PATH]; GetModuleFileName(g_hMod, path, MAX_PATH); RegisterServer(CLSID_Book, L"BookLib.Book", 1); RegisterServer(CLSID_Chapter, L"BookLib.Chapter", 1); RegisterServer(CLSID_Section, L"BookLib.Section", 1); ITypeLib* typeLib = nullptr; auto hr = LoadTypeLib(path, &typeLib); if (hr != S_OK) { return hr; } hr = RegisterTypeLib(typeLib, path, NULL); return hr; }
extern "C" BOOL RegisterComServers (char *modulePath) { BOOL ret = FALSE; wchar_t mainModule[1024], formatModule[1024]; CComPtr<ITypeLib> tl, tl2; wsprintfW (mainModule, L"%hsTrueCrypt.exe", modulePath); wsprintfW (formatModule, L"%hsTrueCrypt Format.exe", modulePath); UnRegisterTypeLib (LIBID_TrueCryptMainCom, 1, 0, 0, SYS_WIN32); UnRegisterTypeLib (LIBID_TrueCryptFormatCom, 1, 0, 0, SYS_WIN32); CRegObject ro; ro.FinalConstruct (); ro.AddReplacement (L"MAIN_MODULE", mainModule); ro.AddReplacement (L"FORMAT_MODULE", formatModule); wchar_t setupModule[MAX_PATH]; GetModuleFileNameW (NULL, setupModule, sizeof (setupModule) / sizeof (setupModule[0])); if (ro.ResourceRegister (setupModule, IDR_COMREG, L"REGISTRY") != S_OK) goto error; if (LoadTypeLib (mainModule, &tl) != S_OK || RegisterTypeLib (tl, mainModule, 0) != S_OK) goto error; if (LoadTypeLib (formatModule, &tl2) != S_OK || RegisterTypeLib (tl2, formatModule, 0) != S_OK) goto error; ret = TRUE; error: ro.FinalRelease (); return ret; }
HRESULT CComModule::UpdateRegistry(BOOL bRegTypeLib) { _ASSERTE(m_hInst != NULL); _ASSERTE(m_pObjMap != NULL); _ATL_OBJMAP_ENTRY* pEntry = m_pObjMap; while (pEntry->pclsid != NULL) { pEntry->UpdateRegistry(GetModuleInstance(), GetResourceInstance()); pEntry++; } HRESULT hRes = S_OK; #ifndef ATL_NOTYPEINFO if (bRegTypeLib) hRes = RegisterTypeLib(); #endif return hRes; }
STDAPI DllRegisterServer() { HRESULT hr = AMovieDllRegisterServer2(TRUE); // register type library WCHAR achFileName[MAX_PATH]; GetModuleFileNameW(g_hInst, achFileName, MAX_PATH); ITypeLib* pTypeLib; LoadTypeLib(achFileName, &pTypeLib); if (pTypeLib) { RegisterTypeLib(pTypeLib, achFileName, NULL); pTypeLib->Release(); } return hr; }
HRESULT ComRegistration::registerTypeLib( HMODULE hInst ) { //get the qualified path of the dll calling this function WCHAR modulePath[MAX_PATH]; GetModuleFileName( hInst, modulePath, MAX_PATH ); ITypeLib *ptlib; HRESULT hr = LoadTypeLib( modulePath, &ptlib ); if( !SUCCEEDED(hr) ) return hr; hr = RegisterTypeLib( ptlib, modulePath, NULL ); ptlib->Release(); return hr; }
/*********************************************************************** * AtlRegisterTypeLib [atl80.19] */ HRESULT WINAPI AtlRegisterTypeLib(HINSTANCE inst, const WCHAR *index) { ITypeLib *typelib; BSTR path; HRESULT hres; TRACE("(%p %s)\n", inst, debugstr_w(index)); hres = AtlLoadTypeLib(inst, index, &path, &typelib); if(FAILED(hres)) return hres; hres = RegisterTypeLib(typelib, path, NULL); /* FIXME: pass help directory */ ITypeLib_Release(typelib); SysFreeString(path); return hres; }
// // Server registration // STDAPI DllRegisterServer() { HRESULT hr = RegisterServer(g_hInstance, CLSID_CoCOMServerOptional, g_szFriendlyNameOptional, g_szVerIndProgIDOptional, g_szProgIDOptional, LIBID_AutoHotkey) ; hr= RegisterServer(g_hInstance, CLSID_CoCOMServer, g_szFriendlyName, g_szVerIndProgID, g_szProgID, LIBID_AutoHotkey) ; if (SUCCEEDED(hr)) { RegisterTypeLib( g_hInstance, NULL); } return hr; }
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { int result; TCHAR filename[MAX_PATH]; { OPENFILENAME ofn; // Pick out where our DLL is located. We need to know its location in // order to register it as a COM component lstrcpy(&filename[0], &OurDllName[0]); ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.lpstrFilter = &FileDlgExt[0]; ofn.lpstrFile = &filename[0]; ofn.nMaxFile = MAX_PATH; ofn.lpstrTitle = &FileDlgTitle[0]; ofn.Flags = OFN_FILEMUSTEXIST|OFN_EXPLORER|OFN_PATHMUSTEXIST; result = GetOpenFileName(&ofn); } if (result > 0) { HKEY rootKey; HKEY hKey; HKEY hKey2; HKEY hkExtra; TCHAR buffer[39]; DWORD disposition; // Assume an error result = 1; // Open "HKEY_LOCAL_MACHINE\Software\Classes" if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, &ClassKeyName[0], 0, KEY_WRITE, &rootKey)) { // For a script engine to call the OLE function CLSIDFromProgID() (passing // our registered ProgID in order to get our IExample2 object's GUID), then // we need to create a subkey named with our IExample2 ProgID string. We've // decided to use the ProgID "IExample2.object" if (!RegCreateKeyEx(rootKey, &OurProgID[0], 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hKey, &disposition)) { // Set its default value to some "friendly" string that helps // a user identify what this COM DLL is for. Setting this value // is optional. You don't need to do it RegSetValueEx(hKey, 0, 0, REG_SZ, (const BYTE *)&ObjectDescription[0], sizeof(ObjectDescription)); // Create a "CLSID" subkey whose default value is our IExample2 object's GUID (in ascii string format) if (!(disposition = RegCreateKeyEx(hKey, &CLSID_Str[0], 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hKey2, &disposition))) { stringFromCLSID(&buffer[0], (REFCLSID)(&CLSID_IExample3)); disposition = RegSetValueEx(hKey2, 0, 0, REG_SZ, (const BYTE *)&buffer[0], lstrlen(&buffer[0]) + 1); RegCloseKey(hKey2); } RegCloseKey(hKey); if (!disposition) { // Open "HKEY_LOCAL_MACHINE\Software\Classes\CLSID" if (!RegOpenKeyEx(rootKey, &CLSID_Str[0], 0, KEY_ALL_ACCESS, &hKey)) { // Create a subkey whose name is the ascii string that represents // our IExample2 object's GUID if (!RegCreateKeyEx(hKey, &buffer[0], 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hKey2, &disposition)) { // Set its default value to some "friendly" string that helps // a user identify what this COM DLL is for. Setting this value // is optional. You don't need to do it RegSetValueEx(hKey2, 0, 0, REG_SZ, (const BYTE *)&ObjectDescription[0], sizeof(ObjectDescription)); // Create an "InprocServer32" key whose default value is the path of this DLL if (!RegCreateKeyEx(hKey2, &InprocServer32Name[0], 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hkExtra, &disposition)) { disposition = 1; if (!RegSetValueEx(hkExtra, 0, 0, REG_SZ, (const BYTE *)&filename[0], lstrlen(&filename[0]) + 1)) { // Create a "ThreadingModel" value set to the string "both" (ie, we don't need to restrict an // application to calling this DLL's functions only from a single thread. We don't use global // data in our IExample2 functions, so we're thread-safe) disposition = RegSetValueEx(hkExtra, &ThreadingModel[0], 0, REG_SZ, (const BYTE *)&BothStr[0], sizeof(BothStr)); } RegCloseKey(hkExtra); // Create a "ProgID" subkey whose default value is our ProgID. This allows the app to call ProgIDFromCLSID() if (!disposition && !(disposition = RegCreateKeyEx(hKey2, &ProgIDName[0], 0, 0, REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hkExtra, &disposition))) { disposition = RegSetValueEx(hkExtra, 0, 0, REG_SZ, (const BYTE *)&OurProgID[0], sizeof(OurProgID)); RegCloseKey(hkExtra); if (!disposition) result = 0; } } RegCloseKey(hKey2); } RegCloseKey(hKey); } // Register the type lib (which is assumed to be a .TLB file in the same dir as this DLL) if (!result) { ITypeLib *pTypeLib; LPTSTR str; str = &filename[0] + lstrlen(&filename[0]); while (str > &filename[0] && *(str - 1) != '\\') --str; lstrcpy(str, &TypeLibName[0]); #ifdef UNICODE if (!(result = LoadTypeLib(&filename[0], &pTypeLib))) { result = RegisterTypeLib(pTypeLib, &filename[0], 0); pTypeLib->lpVtbl->Release(pTypeLib); } #else { wchar_t wbuffer[MAX_PATH]; MultiByteToWideChar(CP_ACP, 0, &filename[0], -1, &wbuffer[0], MAX_PATH); if (!(result = LoadTypeLib(&wbuffer[0], &pTypeLib))) { result = RegisterTypeLib(pTypeLib, &wbuffer[0], 0); pTypeLib->lpVtbl->Release(pTypeLib); } } #endif } if (!result) MessageBox(0, "Successfully registered IExample3.DLL as a COM component.", &ObjectDescription[0], MB_OK); } } RegCloseKey(rootKey); } // If an error, make sure we clean everything up if (result) { cleanup(); MessageBox(0, "Failed to register IExample3.DLL as a COM component.", &ObjectDescription[0], MB_OK|MB_ICONEXCLAMATION); } } return(0); }
BOOL CSTEditorApp::InitInstance() { HRESULT hr; COleMessageFilter *pFilter; USES_CONVERSION; #ifdef STEDITOR_DEBUG DebugBreak(); #endif // Initialize OLE libraries if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } hr = ::CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); assert (SUCCEEDED (hr)); pFilter = AfxOleGetMessageFilter (); assert (pFilter); if (pFilter != NULL) { pFilter->EnableNotRespondingDialog (FALSE); pFilter->EnableBusyDialog (FALSE); }; AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif _Module.Init (ObjectMap, m_hInstance); // Change the registry key under which our settings are stored. // You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey (_T("Softing\\4CONTROLV2\\4CONTROL Engineering")); // keywords are case insensitive // AUTOFMT 08.08.06 SIS >> InitRegistry(); // AUTOFMT 08.08.06 SIS << LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. m_pDocTemplate = new CMultiDocTemplate( IDR_STTYPE, RUNTIME_CLASS(CSTEditorDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CSTEditorView)); m_pDocTemplate->SetServerInfo( IDR_STTYPE_SRVR_EMB, IDR_STTYPE_SRVR_IP, RUNTIME_CLASS(CInPlaceFrame)); AddDocTemplate(m_pDocTemplate); // Connect the COleTemplateServer to the document template. // The COleTemplateServer creates new documents on behalf // of requesting OLE containers by using information // specified in the document template. m_server.ConnectTemplate(clsid, m_pDocTemplate, FALSE); // Register all OLE server factories as running. This enables the // OLE libraries to create objects from other applications. COleTemplateServer::RegisterAll(); // Note: MDI applications register all server objects without regard // to the /Embedding or /Automation on the command line. // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; // Enable drag/drop open m_pMainWnd->DragAcceptFiles(); // Enable DDE Execute open EnableShellOpen(); RegisterShellFileTypes(TRUE); // Parse command line for standard shell commands, DDE, file open CSTCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Check to see if launched as OLE server if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) { // Application was run with /Embedding or /Automation. Don't show the // main window in this case. return TRUE; } // When a server application is launched stand-alone, it is a good idea // to update the system registry in case it has been damaged. m_server.UpdateRegistry(OAT_DOC_OBJECT_SERVER); COleObjectFactory::UpdateRegistryAll(); if (cmdInfo.m_bRegServer) { TCHAR szModule[_MAX_PATH+10]; LPOLESTR pszModule; HRESULT hr; LPTYPELIB pTypeLib; USES_CONVERSION; ::GetModuleFileName (m_hInstance, szModule, _MAX_PATH); pszModule = T2OLE (szModule); hr = LoadTypeLib (pszModule, &pTypeLib); if (SUCCEEDED (hr)) { hr = RegisterTypeLib (pTypeLib, pszModule, NULL); pTypeLib->Release (); }; return (FALSE); }; // Prevents ProcessShellCommand from displaying // a message box when unregistering. if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister) { cmdInfo.m_bRunEmbedded = true; }; // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The main window has been initialized, so show and update it. pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); return TRUE; }
STDAPI DllRegisterServer(void) { //register server WCHAR path[MAX_PATH]; GetModuleFileName(g_hMod, path, MAX_PATH); auto ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\InprocServer32", NULL, path); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\InprocServer32", L"ThreadingModel", L"Apartment"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\ProgID", NULL, L"CircleControl.CircleControl.1"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\VersionIndependentProgID", NULL, L"CircleControl.CircleControl"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\TypeLib", NULL, L"{E9D304EC-552C-4D89-9804-7AB9E45FEF32}"); if (!ret) return E_FAIL; HKEY hKey = NULL; auto hr = RegCreateKeyEx(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\Programmable", NULL, NULL, NULL, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (hr != ERROR_SUCCESS) return hr; hr = RegCreateKeyEx(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\Control", NULL, NULL, NULL, KEY_ALL_ACCESS, NULL, &hKey, NULL); if (hr != ERROR_SUCCESS) return hr; ret = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\Version", NULL, L"1.0"); if (!ret) return E_FAIL; WCHAR pathRsrc[MAX_PATH + 100]; StringCchPrintf(pathRsrc, MAX_PATH + 100, L"%s, 101", path); hr = RegSetString(HKEY_CLASSES_ROOT, L"CLSID\\{1C797BFB-3F97-4CF8-B857-45C90028759B}\\ToolboxBitmap32", NULL, pathRsrc); if (hr != ERROR_SUCCESS) return hr; ret = RegSetString(HKEY_CLASSES_ROOT, L"CircleControl.CircleControl.1\\CLSID", NULL, L"{1C797BFB-3F97-4CF8-B857-45C90028759B}"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CircleControl.CircleControl\\CLSID", NULL, L"{1C797BFB-3F97-4CF8-B857-45C90028759B}"); if (!ret) return E_FAIL; ret = RegSetString(HKEY_CLASSES_ROOT, L"CircleControl.CircleControl\\CurVer", NULL, L"CircleControl.CircleControl.1"); if (!ret) return E_FAIL; //register the typelib HRSRC hrsrc = FindResource(g_hMod, MAKEINTRESOURCE(1), L"TYPELIB"); if (!hrsrc) return E_FAIL; HGLOBAL hGlobal = LoadResource(g_hMod, hrsrc); if (!hGlobal) return E_FAIL; auto size = SizeofResource(g_hMod, hrsrc); WCHAR tempDir[MAX_PATH]; GetTempPath(MAX_PATH, tempDir); WCHAR tempFile[MAX_PATH]; GetTempFileName(tempDir, L"keke", 0, tempFile); HANDLE hFile = CreateFile(tempFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL); if (hFile == INVALID_HANDLE_VALUE) return E_FAIL; DWORD byteCount; if (!WriteFile(hFile, hGlobal, size, &byteCount, NULL) || byteCount != size) return E_FAIL; if (!CloseHandle(hFile)) return E_FAIL; ITypeLib* typeLib = nullptr; hr = LoadTypeLib(tempFile, &typeLib); if (hr != S_OK) { return hr; } hr = RegisterTypeLib(typeLib, path, NULL); return hr; }
// deprecated - remove once a registry-free version of Safari has shipped (first major version after 3.1.1) static void registerWebKitNightly() { // look up server's file name TCHAR szFileName[MAX_PATH]; GetModuleFileName(gInstance, szFileName, MAX_PATH); typedef HRESULT (WINAPI *RegisterTypeLibForUserPtr)(ITypeLib*, OLECHAR*, OLECHAR*); COMPtr<ITypeLib> typeLib; LoadTypeLibEx(szFileName, REGKIND_NONE, &typeLib); if (RegisterTypeLibForUserPtr registerTypeLibForUser = reinterpret_cast<RegisterTypeLibForUserPtr>(GetProcAddress(GetModuleHandle(TEXT("oleaut32.dll")), "RegisterTypeLibForUser"))) registerTypeLibForUser(typeLib.get(), szFileName, 0); else RegisterTypeLib(typeLib.get(), szFileName, 0); HKEY userClasses; if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\CLASSES"), 0, KEY_WRITE, &userClasses) != ERROR_SUCCESS) userClasses = 0; // register entries from table int nEntries = ARRAYSIZE(gRegTable); HRESULT hr = S_OK; for (int i = 0; SUCCEEDED(hr) && i < nEntries; i++) { LPTSTR pszKeyName = _tcsdup(gRegTable[i][0]); LPTSTR pszValueName = gRegTable[i][1] ? _tcsdup(gRegTable[i][1]) : 0; LPTSTR allocatedValue = (gRegTable[i][2] != (LPTSTR)-1) ? _tcsdup(gRegTable[i][2]) : (LPTSTR)-1; LPTSTR pszValue = allocatedValue; if (pszKeyName && pszValue) { int clsidIndex = i/gSlotsPerEntry; substituteGUID(pszKeyName, &gRegCLSIDs[clsidIndex]); substituteGUID(pszValueName, &gRegCLSIDs[clsidIndex]); // map rogue value to module file name if (pszValue == (LPTSTR)-1) pszValue = szFileName; else substituteGUID(pszValue, &gRegCLSIDs[clsidIndex]); // create the key HKEY hkey; LONG err = RegCreateKey(HKEY_CLASSES_ROOT, pszKeyName, &hkey); if (err != ERROR_SUCCESS && userClasses) err = RegCreateKey(userClasses, pszKeyName, &hkey); if (err == ERROR_SUCCESS) { // set the value err = RegSetValueEx(hkey, pszValueName, 0, REG_SZ, (const BYTE*)pszValue, (DWORD) sizeof(pszValue[0])*(_tcslen(pszValue) + 1)); RegCloseKey(hkey); } } if (pszKeyName) free(pszKeyName); if (pszValueName) free(pszValueName); if (allocatedValue && allocatedValue != (LPTSTR)-1) free(allocatedValue); } if (userClasses) RegCloseKey(userClasses); }
STDAPI DllRegisterServer(VOID) #endif { DBIPATH pszDllPath = { 0 }; OLECHAR pszDllPathw[DBIMAXPATHLEN+1] = { 0 }; HINSTANCE hInst; HRESULT rslt = SELFREG_E_CLASS; hInst = GetModuleHandle(DBCLIENT_DLL); if (hInst) { ITypeLib *pTypeLib = 0; DWORD dw = GetModuleFileName(hInst, pszDllPath, sizeof(pszDllPath)/sizeof(pszDllPath[0])); if (dw < 1) { regError("ERROR: Unable to retrieve module file name"); } MultiByteToWideChar(0, 0, pszDllPath, -1, pszDllPathw, sizeof(pszDllPathw)/sizeof(pszDllPathw[0])); rslt = LoadTypeLib(pszDllPathw, &pTypeLib); if (!rslt) { HRESULT hr = RegisterTypeLib(pTypeLib, pszDllPathw, NULL); if (hr != S_OK) { regError("ERROR: RegisterTypeLib returned %lX", hr); } pTypeLib->Release(); pTypeLib = 0; } else { regError("ERROR: LoadTypeLib returned %lX", rslt); } #ifdef MIDAS_DLL // DSBASE rslt = Register_IF(pszDllPath, PROGID_MDSBASE, PROGID_MDSBASE_DESC, PROGID_MDSBASE_1, NULL, CLSID_MDSBASE_1, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_MDSBASE_1, PROGID_MDSBASE_DESC_1, NULL, PROGID_MDSBASE, CLSID_MDSBASE_1, TRUE); // DSCursor if (!rslt) rslt = Register_IF(pszDllPath, PROGID_MDSCURSOR, PROGID_MDSCURSOR_DESC, PROGID_MDSCURSOR_1, NULL, CLSID_MDSCURSOR_1, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_MDSCURSOR_1, PROGID_MDSCURSOR_DESC_1, NULL, PROGID_MDSCURSOR, CLSID_MDSCURSOR_1, TRUE); // DSDATAPACKET if (!rslt) rslt = Register_IF(pszDllPath, PROGID_MDATAPACKETREAD, PROGID_MDATAPACKETREAD_DESC, NULL, NULL, CLSID_MDATAPACKETREAD, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_MDATAPACKETWRITE, PROGID_MDATAPACKETWRITE_DESC, NULL, NULL, CLSID_MDATAPACKETWRITE, TRUE); #else // DSBASE rslt = Register_IF(pszDllPath, PROGID_DSBASE, PROGID_DSBASE_DESC, PROGID_DSBASE_2, NULL, CLSID_DSBASE_2, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_DSBASE_1, PROGID_DSBASE_DESC_1, NULL, NULL, CLSID_DSBASE_1, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_DSBASE_2, PROGID_DSBASE_DESC_2, NULL, PROGID_DSBASE, CLSID_DSBASE_2, TRUE); // DSCursor if (!rslt) rslt = Register_IF(pszDllPath, PROGID_DSCURSOR, PROGID_DSCURSOR_DESC, PROGID_DSCURSOR_2, NULL, CLSID_DSCURSOR_2, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_DSCURSOR_1, PROGID_DSCURSOR_DESC_1, NULL, NULL, CLSID_DSCURSOR_1, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_DSCURSOR_2, PROGID_DSCURSOR_DESC_2, NULL, PROGID_DSCURSOR, CLSID_DSCURSOR_2, TRUE); // DSDATAPACKET if (!rslt) rslt = Register_IF(pszDllPath, PROGID_DATAPACKETREAD, PROGID_DATAPACKETREAD_DESC, NULL, NULL, CLSID_DATAPACKETREAD, TRUE); if (!rslt) rslt = Register_IF(pszDllPath, PROGID_DATAPACKETWRITE, PROGID_DATAPACKETWRITE_DESC, NULL, NULL, CLSID_DATAPACKETWRITE, TRUE); #endif } return rslt; }
void CAtmoComRegistry::SaveSettings(ATMO_BOOL force) { CAtmoRegistry *reg = new CAtmoRegistry(HKEY_CLASSES_ROOT); char buffer[MAX_PATH]; char exe[MAX_PATH]; // char tlb[MAX_PATH]; wchar_t widePath[MAX_PATH]; GetModuleFileName(GetModuleHandle(NULL),exe,MAX_PATH); LPOLESTR aguid = NULL; if((reg->RegistryKeyExists("AtmoRemoteControl.1") == ATMO_FALSE) || force) { reg->WriteRegistryString("AtmoRemoteControl.1\\",NULL,"AtmoRemoteControl Basic Functions"); StringFromCLSID(CLSID_AtmoRemoteControl,&aguid); reg->WriteRegistryString("AtmoRemoteControl.1\\CLSID\\",NULL,(char *)(_bstr_t)aguid); sprintf(buffer,"CLSID\\%s",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"AtmoRemoteControl Basic Functions"); sprintf(buffer,"CLSID\\%s\\LocalServer32",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,exe); sprintf(buffer,"CLSID\\%s\\ProgID",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"AtmoRemoteControl.1"); CoTaskMemFree(aguid); } if((reg->RegistryKeyExists("AtmoLiveViewControl.1") == ATMO_FALSE) || force) { reg->WriteRegistryString("AtmoLiveViewControl.1\\",NULL,"Atmo Live View Control Object"); StringFromCLSID(CLSID_AtmoLiveViewControl,&aguid); reg->WriteRegistryString("AtmoLiveViewControl.1\\CLSID\\",NULL,(char *)(_bstr_t)aguid); sprintf(buffer,"CLSID\\%s",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"Atmo Live View Control Object"); sprintf(buffer,"CLSID\\%s\\LocalServer32",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,exe); sprintf(buffer,"CLSID\\%s\\ProgID",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"AtmoLiveViewControl.1"); CoTaskMemFree(aguid); } //IAtmoRemoteControl StringFromIID(IID_IAtmoRemoteControl,&aguid); sprintf(buffer,"Interface\\%s",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"IAtmoRemoteControl"); sprintf(buffer,"Interface\\%s\\ProxyStubClsid32",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"{00020424-0000-0000-C000-000000000046}"); sprintf(buffer,"Interface\\%s\\TypeLib",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"{e01e2041-5afc-11d3-8e80-00805f91cdd9}"); reg->WriteRegistryString(buffer,"Version","1.0"); CoTaskMemFree(aguid); //IAtmoRemoteControl2 StringFromIID(IID_IAtmoRemoteControl2,&aguid); sprintf(buffer,"Interface\\%s",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"IAtmoRemoteControl2"); sprintf(buffer,"Interface\\%s\\ProxyStubClsid32",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"{00020424-0000-0000-C000-000000000046}"); sprintf(buffer,"Interface\\%s\\TypeLib",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"{e01e2041-5afc-11d3-8e80-00805f91cdd9}"); reg->WriteRegistryString(buffer,"Version","1.0"); CoTaskMemFree(aguid); //IID_IAtmoLiveViewControl StringFromIID(IID_IAtmoLiveViewControl,&aguid); sprintf(buffer,"Interface\\%s",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"IAtmoLiveViewControl"); sprintf(buffer,"Interface\\%s\\ProxyStubClsid32",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"{00020424-0000-0000-C000-000000000046}"); // {e01e2041-5afc-11d3-8e80-00805f91cdd9} sprintf(buffer,"Interface\\%s\\TypeLib",(char *)(_bstr_t)aguid); reg->WriteRegistryString(buffer,NULL,"{e01e2041-5afc-11d3-8e80-00805f91cdd9}"); reg->WriteRegistryString(buffer,"Version","1.0"); CoTaskMemFree(aguid); MultiByteToWideChar(CP_ACP, 0, exe, lstrlen(exe) + 1, widePath, MAX_PATH); ITypeLib *typeLib = NULL; HRESULT res; res = LoadTypeLib( widePath, &typeLib); if(res != S_OK) { char buf[100]; sprintf(buf, "LoadTypeLib failed. Code: 0x%.8x", res); MessageBox(0, buf, "Error" ,0); } /* S_OK E_OUTOFMEMORY E_INVALIDARG TYPE_E_IOERROR TYPE_E_REGISTRYACCESS --> Vista Problem mit Registry und dem UAC krams! TYPE_E_INVALIDSTATE */ if(typeLib) { res = RegisterTypeLib(typeLib, widePath, 0); if(res == TYPE_E_REGISTRYACCESS) { HMODULE oleaut32 = GetModuleHandle("Oleaut32.dll"); if(oleaut32 != 0) { OaEnablePerUserTLibRegistrationFn oaEnablePerUserTLibRegistration = (OaEnablePerUserTLibRegistrationFn )GetProcAddress(oleaut32, "OaEnablePerUserTLibRegistration"); if(oaEnablePerUserTLibRegistration) { oaEnablePerUserTLibRegistration(); res = RegisterTypeLib(typeLib, widePath, 0); } } } if( res != S_OK ) { if(force) { char buf[100]; sprintf(buf, "RegisterTypeLib failed. Code: 0x%.8x", res); MessageBox(0, buf, "Error" ,0); } } else { if(force) MessageBox(0,"COM Server registered Ok!","Info",0); } typeLib->Release(); } delete reg; };
virtual BOOL InitInstance() { #ifdef CRASH_HANDLER rde::CrashHandler::Init(); #endif // disable auto-rotate on tablets #if (WINVER <= 0x0601) SetDisplayAutoRotationPreferences = (pSDARP)GetProcAddress(GetModuleHandle(TEXT("user32.dll")), "SetDisplayAutoRotationPreferences"); if (SetDisplayAutoRotationPreferences) SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE_LANDSCAPE); #else SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE_LANDSCAPE); #endif g_hinst = theInstance; #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED) hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED); #else hRes = CoInitialize(NULL); #endif _ASSERTE(SUCCEEDED(hRes)); _Module.Init(ObjectMap, theInstance, &LIBID_VPinballLib); fFile = false; fPlay = false; fPov = false; bRun = true; int nRet = 0; memset(szTableFileName, 0, _MAX_PATH); // Start VP with file dialog open and then also playing that one? int stos; HRESULT hr = GetRegInt("Editor", "SelectTableOnStart", &stos); if (hr != S_OK) stos = 1; // The default = on if (stos) { fFile = true; fPlay = true; fPov = false; } int nArgs; LPSTR *szArglist = CommandLineToArgvA(GetCommandLine(), &nArgs); for (int i = 0; i < nArgs; ++i) { if (lstrcmpi(szArglist[i], _T("-h")) == 0 || lstrcmpi(szArglist[i], _T("/h")) == 0 || lstrcmpi(szArglist[i], _T("-Help")) == 0 || lstrcmpi(szArglist[i], _T("/Help")) == 0 || lstrcmpi(szArglist[i], _T("-?")) == 0 || lstrcmpi(szArglist[i], _T("/?")) == 0) { ShowError("-UnregServer Unregister VP functions\n-RegServer Register VP functions\n\n-DisableTrueFullscreen Force-disable True Fullscreen setting\n\n-Edit [filename] load file into VP\n-Play [filename] load and play file\n-Pov [filename] load, export pov and close"); bRun = false; break; } if (lstrcmpi(szArglist[i], _T("-UnregServer")) == 0 || lstrcmpi(szArglist[i], _T("/UnregServer")) == 0) { _Module.UpdateRegistryFromResource(IDR_VPINBALL, FALSE); nRet = _Module.UnregisterServer(TRUE); bRun = false; break; } if (lstrcmpi(szArglist[i], _T("-RegServer")) == 0 || lstrcmpi(szArglist[i], _T("/RegServer")) == 0) { _Module.UpdateRegistryFromResource(IDR_VPINBALL, TRUE); nRet = _Module.RegisterServer(TRUE); bRun = false; break; } disableTrueFullscreen |= (lstrcmpi(szArglist[i], _T("-DisableTrueFullscreen")) == 0 || lstrcmpi(szArglist[i], _T("/DisableTrueFullscreen")) == 0); const bool editfile = (lstrcmpi(szArglist[i], _T("-Edit")) == 0 || lstrcmpi(szArglist[i], _T("/Edit")) == 0); const bool playfile = (lstrcmpi(szArglist[i], _T("-Play")) == 0 || lstrcmpi(szArglist[i], _T("/Play")) == 0); const bool povfile = (lstrcmpi(szArglist[i], _T("-Pov")) == 0 || lstrcmpi(szArglist[i], _T("/Pov")) == 0); if ((editfile || playfile || povfile) && (i + 1 < nArgs)) { fFile = true; fPlay = playfile; fPov = povfile; // Remove leading - or / char* filename; if ((szArglist[i + 1][0] == '-') || (szArglist[i + 1][0] == '/')) filename = szArglist[i + 1] + 1; else filename = szArglist[i + 1]; // Remove " " if (filename[0] == '"') { strcpy_s(szTableFileName, filename + 1); szTableFileName[lstrlen(szTableFileName) - 1] = '\0'; } else strcpy_s(szTableFileName, filename); // Add current path char szLoadDir[MAX_PATH]; if (szTableFileName[1] != ':') { GetCurrentDirectory(MAX_PATH, szLoadDir); strcat_s(szLoadDir, "\\"); strcat_s(szLoadDir, szTableFileName); strcpy_s(szTableFileName, szLoadDir); } else // Or set from table path if (playfile) { PathFromFilename(szTableFileName, szLoadDir); SetCurrentDirectory(szLoadDir); } if (playfile || povfile) VPinball::SetOpenMinimized(); break; } } free(szArglist); // load and register VP type library for COM integration char szFileName[_MAX_PATH]; if (GetModuleFileName(theInstance, szFileName, _MAX_PATH)) { ITypeLib *ptl = NULL; MAKE_WIDEPTR_FROMANSI(wszFileName, szFileName); if (SUCCEEDED(LoadTypeLib(wszFileName, &ptl))) { // first try to register system-wide (if running as admin) hr = RegisterTypeLib(ptl, wszFileName, NULL); if (!SUCCEEDED(hr)) { // if failed, register only for current user hr = RegisterTypeLibForUser(ptl, wszFileName, NULL); if (!SUCCEEDED(hr)) MessageBox(0, "Could not register type library. Try running Visual Pinball as administrator.", "Error", MB_ICONWARNING); } ptl->Release(); } else MessageBox(0, "Could not load type library.", "Error", MB_ICONSTOP); } //SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF ); return TRUE; }
/*func*------------------------------------------------------------------------ description: in : out: -----------------------------------------------------------------------------*/ BOOL CGrEditorApp::InitInstance() { HRESULT hr; HFONT hFont; LOGFONT logFont; CGdiObject *pGdiObject; USES_CONVERSION; // Initialize OLE libraries if (!AfxOleInit()) { AfxMessageBox(IDP_GR_OLE_INIT_FAILED); return FALSE; } hr = ::CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); assert (SUCCEEDED (hr)); // prevent the Server-Busy dialog COleMessageFilter *pFilter = AfxOleGetMessageFilter(); assert (pFilter); if (pFilter != NULL) { pFilter->EnableNotRespondingDialog(FALSE); pFilter->EnableBusyDialog(FALSE); } AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif _Module.Init (ObjectMap, m_hInstance); // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey (_T ("Softing\\4CONTROLV2\\4CONTROL Engineering")); int iValue; CString strKey, strSec; strSec.LoadString(IDS_GR_REG_SECTION); strKey.LoadString(IDS_GR_REG_RUBBLINE); iValue = GetProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, 0); WriteProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, iValue ); // set Line draw mode to rubberlines strKey.LoadString(IDS_GR_REG_RUBB_RECON); iValue = GetProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, 1); WriteProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, iValue ); // set Line draw mode to rubberlines strKey.LoadString(IDS_GR_REG_ZOOMVALUE); iValue = GetProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, 100); WriteProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, iValue ); // set zoom factor for 4gr // default sizes for element insertion strKey.LoadString(IDS_GR_REG_STEPSIZE); iValue = GetProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, (4<<16)+4); // <0: AutoSize:on; HiWord:X; LoWord:Y WriteProfileInt ((LPCTSTR)strSec, (LPCTSTR)strKey, iValue ); // ST actions we yes the STEditor settings .. WriteProfileInt (_T ("ST"), _T ("Case" ), 0 ); // keywords are case insensitive WriteProfileInt (_T ("ST"), _T ("Chroma" ), 1 ); // coloring enabled WriteProfileString (_T ("ST"), _T ("Background" ), _T ("255,255,255" )); // background color white WriteProfileString (_T ("ST"), _T ("Default Text" ), _T ("0,0,0" )); // text color black WriteProfileString (_T ("ST"), _T ("Quote" ), _T ("128,128,128" )); // string color grey WriteProfileString (_T ("ST"), _T ("Comment" ), _T ("0,128,0" )); // comment color red WriteProfileString (_T ("ST"), _T ("Comment Start 1"), _T ("(*" )); // comments start with (* WriteProfileString (_T ("ST"), _T ("Comment End 1" ), _T ("*)" )); // comments end with *) WriteProfileInt (_T ("ST"), _T ("Keep Tabs" ), 0 ); // tabs are not converted to spaces WriteProfileInt (_T ("ST"), _T ("Show Tabs" ), 0 ); // tabs are not visualized WriteProfileInt (_T ("ST"), _T ("Tab Size" ), 4 ); // tab is as wide as 4 spaces WriteProfileString (_T ("ST"), _T ("Keywords" ), _T ("stkeywords.ini")); // // sizeof (LOGFONT) gives you the maximum size of a LOGFONT structure. // CGdiObject::GetObject possibly returns less because the font name // at the end of the LOGFONT structure may not take the whole space // reserved for it. hFont = (HFONT)GetStockObject (ANSI_FIXED_FONT); pGdiObject = CGdiObject::FromHandle (hFont); if (pGdiObject != NULL && pGdiObject->GetObject (sizeof (LOGFONT), &logFont) != 0) { int iFontSize; CWindowDC dc (m_pMainWnd); WriteProfileString (_T ("ST"), _T ("Font Name"), A2T (logFont.lfFaceName)); iFontSize = MulDiv (logFont.lfHeight, 72, dc.GetDeviceCaps (LOGPIXELSY)); WriteProfileInt (_T ("ST"), _T ("Font Size"), iFontSize); WriteProfileInt (_T ("ST"), _T ("Font Weight"), logFont.lfWeight); WriteProfileInt (_T ("ST"), _T ("Font Italic"), logFont.lfItalic); WriteProfileInt (_T ("ST"), _T ("CharSet"), logFont.lfCharSet); }; LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. m_pDocTemplate = new CMultiDocTemplate( IDR_GR_TYPE, RUNTIME_CLASS(CGrEditorDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CGrEditorView)); m_pDocTemplate->SetServerInfo( IDR_GR_TYPE_SRVR_EMB, IDR_GR_TYPE_SRVR_IP, RUNTIME_CLASS(CInPlaceFrame)); AddDocTemplate(m_pDocTemplate); // Connect the COleTemplateServer to the document template. // The COleTemplateServer creates new documents on behalf // of requesting OLE containers by using information // specified in the document template. m_server.ConnectTemplate(clsid, m_pDocTemplate, FALSE); // Register all OLE server factories as running. This enables the // OLE libraries to create objects from other applications. COleTemplateServer::RegisterAll(); // Note: MDI applications register all server objects without regard // to the /Embedding or /Automation on the command line. // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_GR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; // create a dummy image .. to solve the problem with DeleteTempMap in OnIdle m_pDummyImage = new CImageList(); VERIFY (m_pDummyImage->Create (16, 15, TRUE, 0, 1)); CBitmap bm; bm.LoadBitmap (IDR_GR_MAINFRAME); m_pDummyImage->Add (&bm, RGB (192, 192, 192)); // Enable drag/drop open m_pMainWnd->DragAcceptFiles(); // Enable DDE Execute open EnableShellOpen(); RegisterShellFileTypes(TRUE); // Parse command line for standard shell commands, DDE, file open CSTCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Check to see if launched as OLE server if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) { // Application was run with /Embedding or /Automation. Don't show the // main window in this case. return TRUE; } // When a server application is launched stand-alone, it is a good idea // to update the system registry in case it has been damaged. m_server.UpdateRegistry(OAT_DOC_OBJECT_SERVER); COleObjectFactory::UpdateRegistryAll(); if (cmdInfo.m_bRegServer) { TCHAR szModule[_MAX_PATH+10]; LPOLESTR pszModule; HRESULT hr; LPTYPELIB pTypeLib; USES_CONVERSION; ::GetModuleFileName (m_hInstance, szModule, _MAX_PATH); pszModule = T2OLE (szModule); hr = LoadTypeLib (pszModule, &pTypeLib); if (SUCCEEDED (hr)) { hr = RegisterTypeLib (pTypeLib, pszModule, NULL); pTypeLib->Release (); }; return (FALSE); }; // Prevents ProcessShellCommand from displaying // a message box when unregistering. if (cmdInfo.m_nShellCommand == CCommandLineInfo::AppUnregister) { cmdInfo.m_bRunEmbedded = true; }; // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The main window has been initialized, so show and update it. pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); return TRUE; }
/* Scan the command line, extract arguments and init variables */ int scan_cmdline(int argc, char **argv) { int cnt; char *p; char msg[80]; int import = 0; char *rom = NULL; char *tib = NULL; char *sav = NULL; char *fn = NULL; //for(cnt = 0; cnt < argc; cnt++) // fprintf(stdout, "%i: [%s]\n", cnt, argv[cnt]); /* Parses list of arguments */ for(cnt=1; cnt<argc; cnt++) { p = argv[cnt]; #ifdef __WIN32__ if(!stricmp(p, "/RegServer") || !stricmp(p, "-RegServer") || !stricmp(p, "--RegServer")) { char *p; ITypeLib *tlb; char szModule[512]; wchar_t tlbname[512]; HMODULE hModule = GetModuleHandle(NULL); DWORD dwResult = GetModuleFileName(hModule, szModule, sizeof(szModule)); if (!dwResult) exit(1); p = szModule + strlen(szModule) - 4; if (stricmp(p,".exe")) exit(1); strcpy(++p,"tlb"); mbstowcs(tlbname, szModule, strlen(szModule)+1); if (RegisterServer(&CLSID_TiEmuOLE, "TiEmu OLE Interface", "TiEmu.TiEmuOLE", "TiEmu.TiEmuOLE.1", NULL) || LoadTypeLib(tlbname, &tlb)) exit(1); else { if (RegisterTypeLib(tlb, tlbname, NULL)) { tlb->lpVtbl->Release(tlb); exit(1); } else { tlb->lpVtbl->Release(tlb); fprintf(stdout, "TiEmu OLE Interface successfully registered."); exit(0); } } } if(!stricmp(p, "/UnregServer") || !stricmp(p, "-UnregServer") || !stricmp(p, "--UnregServer")) { if (UnregisterServer(&CLSID_TiEmuOLE, "TiEmu.TiEmuOLE", "TiEmu.TiEmuOLE.1") || UnRegisterTypeLib(&LIBID_TiEmuOLELib, 1, 0, 0, SYS_WIN32)) exit(1); else { fprintf(stdout, "TiEmu OLE Interface successfully unregistered."); exit(0); } } if(!stricmp(p, "/Embedding") || !stricmp(p, "-Embedding") || !stricmp(p, "--Embedding")) { // VB runs it with this option. continue; } #endif if(*p == '-') { // a long option (like --help) p++; } else { fn = g_strdup(p); // a filename //g_free(params.rom_file); //params.rom_file = g_strdup(p); } strcpy(msg, p); if(strexact(msg, "-import")) import = !0; if(strstr(msg, "rom=")) rom = g_strdup(msg + 4); if(strstr(msg, "tib=")) tib = g_strdup(msg + 4); if(strstr(msg, "sav=")) sav = g_strdup(msg + 4); if(strstr(msg, "send=")) file_to_send = g_strdup(msg + 5); if(strexact(msg, "-help") || strexact(msg, "h")) help(); if(strexact(msg, "-version") || strexact(msg, "v")) exit(0); } /* */ if(fn && ti68k_is_a_rom_file(fn)) rom = fn; else if(fn && ti68k_is_a_tib_file(fn)) tib = fn; else if(fn && ti68k_is_a_sav_file(fn)) sav = fn; /* And process them */ if(rom && ti68k_is_a_rom_file(rom)) { gchar *dstname; int err = ti68k_convert_rom_to_image(rom, inst_paths.img_dir, &dstname); if(err) { tiemu_err(err, NULL); exit(-1); } if(import) exit(0); g_free(params.rom_file); params.rom_file = dstname; g_free(params.sav_file); params.sav_file = g_strdup(""); } if(tib && ti68k_is_a_tib_file(tib)) { gchar *dstname; int err = ti68k_convert_tib_to_image(tib, inst_paths.img_dir, &dstname, -1); if(err) { tiemu_err(err, NULL); exit(-1); } if(import) exit(0); g_free(params.rom_file); params.rom_file = dstname; g_free(params.sav_file); params.sav_file = g_strdup(""); } if(sav && !fn) // for compatibility { g_free(params.sav_file); params.sav_file = g_strdup(sav); } if(sav && ti68k_is_a_sav_file(sav) && fn) { gchar *rf, *tf; ti68k_state_parse(sav, &rf, &tf); if(!ti68k_is_a_img_file(rf)) return 0; g_free(params.rom_file); params.rom_file = rf; g_free(params.tib_file); params.tib_file = tf; g_free(params.sav_file); params.sav_file = g_strdup(sav); } return 0; }
extern "C" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpCmdLine*/, int /*nShowCmd*/) { #ifdef CRASH_HANDLER rde::CrashHandler::Init(); #endif // disable auto-rotate on tablets #if (WINVER <= 0x0601) SetDisplayAutoRotationPreferences = (pSDARP) GetProcAddress(GetModuleHandle(TEXT("user32.dll")), "SetDisplayAutoRotationPreferences"); if(SetDisplayAutoRotationPreferences) SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE_LANDSCAPE); #else SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE_LANDSCAPE); #endif g_hinst = hInstance; #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED) HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED); #else HRESULT hRes = CoInitialize(NULL); #endif _ASSERTE(SUCCEEDED(hRes)); _Module.Init(ObjectMap, hInstance, &LIBID_VPinballLib); bool fFile = false; bool fPlay = false; bool bRun = true; TCHAR szTableFileName[_MAX_PATH] = {0}; int nRet = 0; int nArgs; LPSTR *szArglist = CommandLineToArgvA(GetCommandLine(), &nArgs); for(int i=0; i < nArgs; ++i) { if (lstrcmpi(szArglist[i], _T("-UnregServer"))==0 || lstrcmpi(szArglist[i], _T("/UnregServer"))==0) { _Module.UpdateRegistryFromResource(IDR_VPINBALL, FALSE); nRet = _Module.UnregisterServer(TRUE); bRun = false; break; } if (lstrcmpi(szArglist[i], _T("-RegServer"))==0 || lstrcmpi(szArglist[i], _T("/RegServer"))==0) { _Module.UpdateRegistryFromResource(IDR_VPINBALL, TRUE); nRet = _Module.RegisterServer(TRUE); bRun = false; break; } const bool editfile = (lstrcmpi(szArglist[i], _T("-Edit"))==0 || lstrcmpi(szArglist[i], _T("/Edit"))==0); const bool playfile = (lstrcmpi(szArglist[i], _T("-Play"))==0 || lstrcmpi(szArglist[i], _T("/Play"))==0); if ((editfile || playfile) && (i+1 < nArgs)) { fFile = true; fPlay = playfile; // Remove leading - or / char* filename; if((szArglist[i+1][0] == '-') || (szArglist[i+1][0] == '/')) filename = szArglist[i+1]+1; else filename = szArglist[i+1]; // Remove " " if(filename[0] == '"') { strcpy_s(szTableFileName,filename+1); szTableFileName[lstrlen(szTableFileName)] = '\0'; } else strcpy_s(szTableFileName,filename); // Add current path char szLoadDir[MAX_PATH]; if(szTableFileName[1] != ':') { GetCurrentDirectory(MAX_PATH,szLoadDir); strcat_s(szLoadDir,"\\"); strcat_s(szLoadDir,szTableFileName); strcpy_s(szTableFileName,szLoadDir); } else // Or set from table path if(playfile) { PathFromFilename(szTableFileName, szLoadDir); SetCurrentDirectory(szLoadDir); } if(playfile) VPinball::SetOpenMinimized(); break; } } free(szArglist); // load and register VP type library for COM integration char szFileName[_MAX_PATH]; if (GetModuleFileName(hInstance, szFileName, _MAX_PATH)) { ITypeLib *ptl = NULL; MAKE_WIDEPTR_FROMANSI(wszFileName, szFileName); if (SUCCEEDED(LoadTypeLib(wszFileName, &ptl))) { // first try to register system-wide (if running as admin) HRESULT hr = RegisterTypeLib(ptl, wszFileName, NULL); if (!SUCCEEDED(hr)) { // if failed, register only for current user hr = RegisterTypeLibForUser(ptl, wszFileName, NULL); if (!SUCCEEDED(hr)) MessageBox(0, "Could not register type library. Try running Visual Pinball as administrator.", "Error", MB_ICONWARNING); } ptl->Release(); } else MessageBox(0, "Could not load type library.", "Error", MB_ICONSTOP); } if (bRun) { #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED) hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED); _ASSERTE(SUCCEEDED(hRes)); hRes = CoResumeClassObjects(); #else hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE); #endif _ASSERTE(SUCCEEDED(hRes)); INITCOMMONCONTROLSEX iccex; iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); iccex.dwICC = ICC_COOL_CLASSES; InitCommonControlsEx(&iccex); { EditableRegistry::RegisterEditable<Bumper>(); EditableRegistry::RegisterEditable<Decal>(); EditableRegistry::RegisterEditable<DispReel>(); EditableRegistry::RegisterEditable<Flasher>(); EditableRegistry::RegisterEditable<Flipper>(); EditableRegistry::RegisterEditable<Gate>(); EditableRegistry::RegisterEditable<Kicker>(); EditableRegistry::RegisterEditable<Light>(); EditableRegistry::RegisterEditable<LightSeq>(); EditableRegistry::RegisterEditable<Plunger>(); EditableRegistry::RegisterEditable<Primitive>(); EditableRegistry::RegisterEditable<Ramp>(); EditableRegistry::RegisterEditable<Rubber>(); EditableRegistry::RegisterEditable<Spinner>(); EditableRegistry::RegisterEditable<Surface>(); EditableRegistry::RegisterEditable<Textbox>(); EditableRegistry::RegisterEditable<Timer>(); EditableRegistry::RegisterEditable<Trigger>(); } g_pvp = new VPinball(); g_pvp->AddRef(); g_pvp->Init(); g_haccel = LoadAccelerators(g_hinst,MAKEINTRESOURCE(IDR_VPACCEL)); if (fFile) { g_pvp->LoadFileName(szTableFileName); if (fPlay) g_pvp->DoPlay(); } // VBA APC handles message loop (bastards) g_pvp->MainMsgLoop(); g_pvp->Release(); DestroyAcceleratorTable(g_haccel); _Module.RevokeClassObjects(); Sleep(dwPause); //wait for any threads to finish } _Module.Term(); CoUninitialize(); #ifdef _CRTDBG_MAP_ALLOC #ifdef DEBUG_XXX //disable this in perference to DevPartner _CrtSetDumpClient(MemLeakAlert); #endif _CrtDumpMemoryLeaks(); #endif //SET_CRT_DEBUG_FIELD( _CRTDBG_LEAK_CHECK_DF ); return nRet; }
// (Un)Register the ActiveX server in the registry. // The QAxFactory implementation provides the information. HRESULT UpdateRegistry(BOOL bRegister) { qAxIsServer = false; const QChar dot(QLatin1Char('.')); const QChar slash(QLatin1Char('/')); QString file = QString::fromWCharArray(qAxModuleFilename); const QString module = QFileInfo(file).baseName(); const QString appId = qAxFactory()->appID().toString().toUpper(); const QString libId = qAxFactory()->typeLibID().toString().toUpper(); const QString libFile = qAxInit(); TLIBATTR *libAttr = 0; if (qAxTypeLibrary) qAxTypeLibrary->GetLibAttr(&libAttr); if (!libAttr) return SELFREG_E_TYPELIB; bool userFallback = false; if (bRegister) { if (RegisterTypeLib(qAxTypeLibrary, reinterpret_cast<wchar_t *>(const_cast<ushort *>(libFile.utf16())), 0) == TYPE_E_REGISTRYACCESS) { #ifndef Q_CC_MINGW // MinGW does not have RegisterTypeLibForUser() implemented so we cannot fallback in this case RegisterTypeLibForUser(qAxTypeLibrary, reinterpret_cast<wchar_t *>(const_cast<ushort *>(libFile.utf16())), 0); userFallback = true; #endif } } else { if (UnRegisterTypeLib(libAttr->guid, libAttr->wMajorVerNum, libAttr->wMinorVerNum, libAttr->lcid, libAttr->syskind) == TYPE_E_REGISTRYACCESS) { #ifndef Q_CC_MINGW // MinGW does not have RegisterTypeLibForUser() implemented so we cannot fallback in this case UnRegisterTypeLibForUser(libAttr->guid, libAttr->wMajorVerNum, libAttr->wMinorVerNum, libAttr->lcid, libAttr->syskind); userFallback = true; #endif } } if (userFallback) qWarning("QAxServer: Falling back to registering as user for %s due to insufficient permission.", qPrintable(module)); qAxTypeLibrary->ReleaseTLibAttr(libAttr); // check whether the user has permission to write to HKLM\Software\Classes // if not, use HKCU\Software\Classes QString keyPath(QLatin1String("HKEY_LOCAL_MACHINE\\Software\\Classes")); QScopedPointer<QSettings> settings(new QSettings(keyPath, QSettings::NativeFormat)); if (userFallback || !settings->isWritable()) { keyPath = QLatin1String("HKEY_CURRENT_USER\\Software\\Classes"); settings.reset(new QSettings(keyPath, QSettings::NativeFormat)); } // we try to create the ActiveX widgets later on... bool delete_qApp = false; if (!qApp) { static int argc = 0; // static lifetime, since it's passed as reference to QApplication, which has a lifetime exceeding the stack frame (void)new QApplication(argc, 0); delete_qApp = true; } if (bRegister) { if (qAxOutProcServer) { settings->setValue(QLatin1String("/AppID/") + appId + QLatin1String("/."), module); settings->setValue(QLatin1String("/AppID/") + module + QLatin1String(".EXE/AppID"), appId); } const QStringList keys = qAxFactory()->featureList(); for (const QString &classNameIn : keys) { QObject *object = qAxFactory()->createObject(classNameIn); const QMetaObject *mo = qAxFactory()->metaObject(classNameIn); const QString classId = qAxFactory()->classID(classNameIn).toString().toUpper(); const QString className = qax_clean_type(classNameIn, mo); if (object) { // don't register subobject classes QString classVersion = mo ? QString::fromLatin1(mo->classInfo(mo->indexOfClassInfo("Version")).value()) : QString(); if (classVersion.isNull()) classVersion = QLatin1String("1.0"); bool insertable = mo && !qstricmp(mo->classInfo(mo->indexOfClassInfo("Insertable")).value(), "yes"); bool control = object->isWidgetType(); QString classMajorVersion = classVersion.left(classVersion.indexOf(dot)); uint olemisc = OLEMISC_SETCLIENTSITEFIRST |OLEMISC_ACTIVATEWHENVISIBLE |OLEMISC_INSIDEOUT |OLEMISC_CANTLINKINSIDE |OLEMISC_RECOMPOSEONRESIZE; if (!control) olemisc |= OLEMISC_INVISIBLEATRUNTIME; else if (object->findChild<QMenuBar*>() && !qax_disable_inplaceframe) olemisc |= OLEMISC_WANTSTOMENUMERGE; const QString versionLessProgId = module + dot + className; const QString progId = versionLessProgId + dot + classMajorVersion; QString key = slash + progId; settings->setValue(key + QLatin1String("/."), className + QLatin1String(" Class")); settings->setValue(key + QLatin1String("/CLSID/."), classId); if (insertable) settings->setValue(key + QLatin1String("/Insertable/."), QVariant(QLatin1String(""))); key = slash + module + dot + className; settings->setValue(key + QLatin1String("/."), className + QLatin1String(" Class")); settings->setValue(key + QLatin1String("/CLSID/."), classId); settings->setValue(key + QLatin1String("/CurVer/."), progId); key = QLatin1String("/CLSID/") + classId; settings->setValue(key + QLatin1String("/."), className + QLatin1String(" Class")); if (file.endsWith(QLatin1String("exe"), Qt::CaseInsensitive)) settings->setValue(key + QLatin1String("/AppID"), appId); if (control) settings->setValue(key + QLatin1String("/Control/."), QVariant(QLatin1String(""))); if (insertable) settings->setValue(key + QLatin1String("/Insertable/."), QVariant(QLatin1String(""))); if (file.endsWith(QLatin1String("dll"), Qt::CaseInsensitive)) settings->setValue(key + QLatin1String("/InProcServer32/."), file); else settings->setValue(key + QLatin1String("/LocalServer32/."), QLatin1Char('\"') + file + QLatin1String("\" -activex")); settings->setValue(key + QLatin1String("/MiscStatus/."), control ? QLatin1String("1") : QLatin1String("0")); settings->setValue(key + QLatin1String("/MiscStatus/1/."), QString::number(olemisc)); settings->setValue(key + QLatin1String("/Programmable/."), QVariant(QLatin1String(""))); settings->setValue(key + QLatin1String("/ToolboxBitmap32/."), QLatin1Char('\"') + file + QLatin1String("\", 101")); settings->setValue(key + QLatin1String("/TypeLib/."), libId); settings->setValue(key + QLatin1String("/Version/."), classVersion); settings->setValue(key + QLatin1String("/VersionIndependentProgID/."), versionLessProgId); settings->setValue(key + QLatin1String("/ProgID/."), progId); QString mime = QLatin1String(mo->classInfo(mo->indexOfClassInfo("MIME")).value()); if (!mime.isEmpty()) { QStringList mimeTypes = mime.split(QLatin1Char(';')); for (int m = 0; m < mimeTypes.count(); ++m) { mime = mimeTypes.at(m); if (mime.isEmpty()) continue; QString extension; while (mime.contains(QLatin1Char(':'))) { extension = mime.mid(mime.lastIndexOf(QLatin1Char(':')) + 1); mime.chop(extension.length() + 1); // Prepend '.' before extension, if required. extension = extension.trimmed(); if (!extension.startsWith(dot)) extension.prepend(dot); } if (!extension.isEmpty()) { key = slash + extension; settings->setValue(key + QLatin1String("/."), module + dot + className); settings->setValue(key + QLatin1String("/Content Type"), mime); mime.replace(slash, QLatin1Char('\\')); key = QLatin1String("/MIME/Database/Content Type/") + mime; settings->setValue(key + QLatin1String("/CLSID"), classId); settings->setValue(key + QLatin1String("/Extension"), extension); } } } delete object; qCDebug(lcAxRegistration).nospace().noquote() << "Registered \"" << progId << "\"/" << classId << ", \"" << file << "\" at \"" << keyPath << "\", insertable=" << insertable << ", control=" << control << ", olemisc=" << hex << showbase << olemisc << ", mime=" << mime; } qAxFactory()->registerClass(classNameIn, settings.data()); } } else { if (qAxOutProcServer) { settings->remove(QLatin1String("/AppID/") + appId + QLatin1String("/.")); settings->remove(QLatin1String("/AppID/") + module + QLatin1String(".EXE")); } const QStringList keys = qAxFactory()->featureList(); for (const QString &classNameIn : keys) { const QMetaObject *mo = qAxFactory()->metaObject(classNameIn); const QString classId = qAxFactory()->classID(classNameIn).toString().toUpper(); const QString className = qax_clean_type(classNameIn, mo); QString classVersion = mo ? QString::fromLatin1(mo->classInfo(mo->indexOfClassInfo("Version")).value()) : QString(); if (classVersion.isNull()) classVersion = QLatin1String("1.0"); const QString classMajorVersion = classVersion.left(classVersion.indexOf(dot)); qAxFactory()->unregisterClass(classNameIn, settings.data()); const QString progId = module + dot + className + dot + classMajorVersion; QString key = slash + progId; settings->remove(key + QLatin1String("/CLSID/.")); settings->remove(key + QLatin1String("/Insertable/.")); settings->remove(key + QLatin1String("/.")); settings->remove(key); key = slash + module + dot + className; settings->remove(key + QLatin1String("/CLSID/.")); settings->remove(key + QLatin1String("/CurVer/.")); settings->remove(key + QLatin1String("/.")); settings->remove(key); key = QLatin1String("/CLSID/") + classId; settings->remove(key + QLatin1String("/AppID")); settings->remove(key + QLatin1String("/Control/.")); settings->remove(key + QLatin1String("/Insertable/.")); settings->remove(key + QLatin1String("/InProcServer32/.")); settings->remove(key + QLatin1String("/LocalServer32/.")); settings->remove(key + QLatin1String("/MiscStatus/1/.")); settings->remove(key + QLatin1String("/MiscStatus/.")); settings->remove(key + QLatin1String("/Programmable/.")); settings->remove(key + QLatin1String("/ToolboxBitmap32/.")); settings->remove(key + QLatin1String("/TypeLib/.")); settings->remove(key + QLatin1String("/Version/.")); settings->remove(key + QLatin1String("/VersionIndependentProgID/.")); settings->remove(key + QLatin1String("/ProgID/.")); settings->remove(key + QLatin1String("/.")); settings->remove(key); QString mime = QLatin1String(mo->classInfo(mo->indexOfClassInfo("MIME")).value()); if (!mime.isEmpty()) { QStringList mimeTypes = mime.split(QLatin1Char(';')); for (int m = 0; m < mimeTypes.count(); ++m) { mime = mimeTypes.at(m); if (mime.isEmpty()) continue; QString extension; while (mime.contains(QLatin1Char(':'))) { extension = mime.mid(mime.lastIndexOf(QLatin1Char(':')) + 1); mime.chop(extension.length() + 1); // Prepend '.' before extension, if required. extension = extension.trimmed(); if (extension[0] != dot) extension.prepend(dot); } if (!extension.isEmpty()) { key = slash + extension; settings->remove(key + QLatin1String("/Content Type")); settings->remove(key + QLatin1String("/.")); settings->remove(key); mime.replace(slash, QLatin1Char('\\')); key = QLatin1String("/MIME/Database/Content Type/") + mime; settings->remove(key + QLatin1String("/Extension")); settings->remove(key + QLatin1String("/CLSID")); settings->remove(key + QLatin1String("/.")); settings->remove(key); } } } qCDebug(lcAxRegistration).nospace().noquote() << "Unregistered \"" << progId << "\"/" << classId << ", \"" << file << "\" from \"" << keyPath << '"'; } } if (delete_qApp) delete qApp; qAxCleanup(); if (settings->status() == QSettings::NoError) return S_OK; qWarning() << module << ": Error writing to " << keyPath; return SELFREG_E_CLASS; }