// // Server unregistration // STDAPI DllUnregisterServer() { const HMODULE hModule = ::GetModuleHandle(nullptr); HRESULT hr = UnregisterServer(CLSID_GitWCRev, L"GitWCRev.object", L"GitWCRev.object.1", LIBID_LibGitWCRev) ; if (SUCCEEDED(hr)) UnRegisterTypeLib(hModule, nullptr); return hr; }
extern "C" BOOL RegisterComServers (char *modulePath) { BOOL ret = TRUE; wchar_t mainModule[1024], formatModule[1024]; CComPtr<ITypeLib> tl, tl2; wsprintfW (mainModule, L"%hsVeraCrypt.exe", modulePath); wsprintfW (formatModule, L"%hsVeraCrypt Format.exe", modulePath); UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR, 0, SYS_WIN32); UnRegisterTypeLib (LIBID_TrueCryptFormatCom, TC_FORMAT_COM_VERSION_MAJOR, TC_FORMAT_COM_VERSION_MINOR, 0, SYS_WIN32); // unregister older versions that may still exist UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-3, 0, SYS_WIN32); UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-2, 0, SYS_WIN32); UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-1, 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(), TC_APP_NAME, MB_ICONERROR); ret = FALSE; } ro.FinalRelease (); return ret; }
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; }
// // Server unregistration // STDAPI DllUnregisterServer() { HRESULT hr = UnregisterServer(CLSID_CoCOMServerOptional, g_szVerIndProgIDOptional, g_szProgIDOptional, LIBID_AutoHotkey) ; hr = UnregisterServer(CLSID_CoCOMServer, g_szVerIndProgID, g_szProgID, LIBID_AutoHotkey) ; if (SUCCEEDED(hr)) { UnRegisterTypeLib( g_hInstance, NULL); } return hr; }
static void cleanup(void) { HKEY rootKey; HKEY hKey; HKEY hKey2; TCHAR buffer[39]; stringFromCLSID(&buffer[0], (REFCLSID)(&CLSID_IExample3)); // Open "HKEY_LOCAL_MACHINE\Software\Classes" if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, &ClassKeyName[0], 0, KEY_WRITE, &rootKey)) { // Delete ProgID subkey and everything under it if (!RegOpenKeyEx(rootKey, &OurProgID[0], 0, KEY_ALL_ACCESS, &hKey)) { RegDeleteKey(hKey, &CLSID_Str[0]); RegCloseKey(hKey); RegDeleteKey(rootKey, &OurProgID[0]); // Delete our CLSID key and everything under it if (!RegOpenKeyEx(rootKey, &CLSID_Str[0], 0, KEY_ALL_ACCESS, &hKey)) { if (!RegOpenKeyEx(hKey, &buffer[0], 0, KEY_ALL_ACCESS, &hKey2)) { RegDeleteKey(hKey2, &InprocServer32Name[0]); RegDeleteKey(hKey2, &ProgIDName[0]); RegCloseKey(hKey2); RegDeleteKey(hKey, &buffer[0]); } RegCloseKey(hKey); } } RegCloseKey(rootKey); // Unregister type library UnRegisterTypeLib(&CLSID_TypeLib, 1, 0, LOCALE_NEUTRAL, SYS_WIN32); } }
//============================================== int g_UnregisterCOM() { HRESULT hr; // Unregister typelib hr = UnRegisterTypeLib(LIBID_CP_TimeSync_Lib, // Typelib GUID 0, // Version Major 0, // Version Minor LANG_NEUTRAL, // LocaleID SYS_WIN32); // The target operating system if( hr != S_OK) { return 1; } // Unregister server hr = g_UnregisterServer(CLSID_CP_TimeSyncClass, "CP_TimeSync.Application", "CP_TimeSync.Application.1"); if( hr != S_OK) { return 2; } return 0; }
STDAPI DllUnregisterServer() { HRESULT hr = AMovieDllRegisterServer2(FALSE); // unregister type library WCHAR achFileName[MAX_PATH]; GetModuleFileNameW(g_hInst, achFileName, MAX_PATH); ITypeLib* pTypeLib; LoadTypeLib(achFileName, &pTypeLib); if (pTypeLib) { TLIBATTR* ptla; hr = pTypeLib->GetLibAttr(&ptla); if (SUCCEEDED(hr)) { hr = UnRegisterTypeLib(ptla->guid, ptla->wMajorVerNum, ptla->wMinorVerNum, ptla->lcid, ptla->syskind); pTypeLib->ReleaseTLibAttr(ptla); } pTypeLib->Release(); } return hr; }
static HRESULT register_server(BOOL do_register) { HRESULT hres; HMODULE hAdvpack; HRESULT (WINAPI *pRegInstall)(HMODULE hm, LPCSTR pszSection, const STRTABLEA* pstTable); STRTABLEA strtable; STRENTRYA pse[35]; static CLSID const *clsids[35]; unsigned int i = 0; static const WCHAR wszAdvpack[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; TRACE("(%x)\n", do_register); INF_SET_CLSID(AboutProtocol); INF_SET_CLSID(CAnchorBrowsePropertyPage); INF_SET_CLSID(CBackgroundPropertyPage); INF_SET_CLSID(CCDAnchorPropertyPage); INF_SET_CLSID(CCDGenericPropertyPage); INF_SET_CLSID(CDocBrowsePropertyPage); INF_SET_CLSID(CDwnBindInfo); INF_SET_CLSID(CHiFiUses); INF_SET_CLSID(CHtmlComponentConstructor); INF_SET_CLSID(CImageBrowsePropertyPage); INF_SET_CLSID(CInlineStylePropertyPage); INF_SET_CLSID(CPeerHandler); INF_SET_CLSID(CRecalcEngine); INF_SET_CLSID(CSvrOMUses); INF_SET_CLSID(CrSource); INF_SET_CLSID(ExternalFrameworkSite); INF_SET_CLSID(HTADocument); INF_SET_CLSID(HTMLDocument); INF_SET_CLSID(HTMLLoadOptions); INF_SET_CLSID(HTMLPluginDocument); INF_SET_CLSID(HTMLPopup); INF_SET_CLSID(HTMLPopupDoc); INF_SET_CLSID(HTMLServerDoc); INF_SET_CLSID(HTMLWindowProxy); INF_SET_CLSID(IImageDecodeFilter); INF_SET_CLSID(IImgCtx); INF_SET_CLSID(IntDitherer); INF_SET_CLSID(JSProtocol); INF_SET_CLSID(MHTMLDocument); INF_SET_CLSID(MailtoProtocol); INF_SET_CLSID(ResProtocol); INF_SET_CLSID(Scriptlet); INF_SET_CLSID(SysimageProtocol); INF_SET_CLSID(TridentAPI); INF_SET_ID(LIBID_MSHTML); for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) { pse[i].pszValue = heap_alloc(39); sprintf(pse[i].pszValue, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", clsids[i]->Data1, clsids[i]->Data2, clsids[i]->Data3, clsids[i]->Data4[0], clsids[i]->Data4[1], clsids[i]->Data4[2], clsids[i]->Data4[3], clsids[i]->Data4[4], clsids[i]->Data4[5], clsids[i]->Data4[6], clsids[i]->Data4[7]); } strtable.cEntries = sizeof(pse)/sizeof(pse[0]); strtable.pse = pse; hAdvpack = LoadLibraryW(wszAdvpack); pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall"); hres = pRegInstall(hInst, do_register ? "RegisterDll" : "UnregisterDll", &strtable); for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) heap_free(pse[i].pszValue); if(FAILED(hres)) { ERR("RegInstall failed: %08x\n", hres); return hres; } if(do_register) { ITypeLib *typelib; static const WCHAR wszMSHTML[] = {'m','s','h','t','m','l','.','t','l','b',0}; hres = LoadTypeLibEx(wszMSHTML, REGKIND_REGISTER, &typelib); if(SUCCEEDED(hres)) ITypeLib_Release(typelib); }else { hres = UnRegisterTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT, SYS_WIN32); } if(FAILED(hres)) ERR("typelib registration failed: %08x\n", hres); return hres; }
/* 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; }
// (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; }
BOOL CMyApp::InitInstance() { if (!DComOk()) { AfxMessageBox(_T("DCOM OLE Not supported"),MB_SYSTEMMODAL+MB_OK); return FALSE; } // Initialize OLE libraries if (!AfxOleInit2()) { AfxMessageBox(_T("OLE Initialization Failed!"),MB_SYSTEMMODAL+MB_OK); return FALSE; } // Initialize the ATL Module _Module.Init(ObjectMap,m_hInstance); _Module.dwThreadID = GetCurrentThreadId(); #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking // to MFC statically #endif //Reg UnregSever TCHAR szTokens[] = _T("-/"); int nRet = 0; BOOL bRun = TRUE; LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens); while (lpszToken != NULL) { if (lstrcmpi(lpszToken, _T("UnregServer"))==0) { _Module.UpdateRegistryFromResource(IDR_ModbusServer, FALSE); nRet = _Module.UnregisterServer(); nRet = UnRegisterTypeLib( LIBID_MODBUSSERVERLib, 1, 0, LOCALE_NEUTRAL, SYS_WIN32); bRun = FALSE; break; } if (lstrcmpi(lpszToken, _T("RegServer"))==0) { _Module.UpdateRegistryFromResource(IDR_ModbusServer, TRUE); nRet = _Module.RegisterServer(TRUE); bRun = FALSE; // Update the System Registry COleObjectFactory::UpdateRegistryAll(); // MFC Classes if(!(SUCCEEDED(nRet))){ AfxMessageBox("Register server Failed",MB_SYSTEMMODAL+MB_OK); } bRun=FALSE; break; } lpszToken = FindOneOf(lpszToken, szTokens); } // ATL Classes // Create the dialog box or other stuff here // Register OLE Class Factories // MFC ones are for multiple as specified // by the IMPLEMENT_OLECREATE() macro //COleObjectFactory::RegisterAll(); // ATL ones specifically register with REGCLS_MULTIPLEUSE if (bRun) { if(!(SUCCEEDED(_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE)))){ AfxMessageBox("RegisterClassObjects Failed",MB_SYSTEMMODAL+MB_OK); } } VERIFY(CTcpServer::StartWinsock()); // Parse the command line to see if launched as OLE server if (RunEmbedded() || RunAutomated()) { // Application was run with /Embedding or /Automation. // Don't show the main window in this case. //Test(); return TRUE; } return FALSE; // Nothing to do, so exit. }
STDAPI DllUnregisterServer(VOID) #endif { HRESULT rslt; HINSTANCE hInst; hInst = GetModuleHandle(DBCLIENT_DLL); if (hInst) { DBIPATH pszDllPath = { 0 }; OLECHAR pszDllPathw[DBIMAXPATHLEN+1] = { 0 }; GetModuleFileName(hInst, pszDllPath, sizeof(pszDllPath)); MultiByteToWideChar(0, 0, pszDllPath, -1, pszDllPathw, sizeof(pszDllPathw)/sizeof(pszDllPathw[0])); ITypeLib *pTypeLib = 0; ; // oleauto.h rslt = LoadTypeLib(pszDllPathw, &pTypeLib); if (!rslt) { TLIBATTR *pLibAttr = 0; // oaidl.h pTypeLib->GetLibAttr(&pLibAttr); HRESULT hr = UnRegisterTypeLib(pLibAttr->guid, pLibAttr->wMajorVerNum, pLibAttr->wMinorVerNum, pLibAttr->lcid, pLibAttr->syskind); if (hr != S_OK) { regError("ERROR: UnregisterTypeLib returned %lX", hr); } pTypeLib->ReleaseTLibAttr(pLibAttr); pTypeLib->Release(); pTypeLib = 0; } else { regError("ERROR: LoadTypeLib returned %lX", rslt); } } #ifdef MIDAS_DLL // DSBASE rslt = Register_IF(NULL, PROGID_MDSBASE, NULL, PROGID_MDSBASE_1, NULL, CLSID_MDSBASE_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_MDSBASE_1, NULL, NULL, NULL, CLSID_MDSBASE_1, FALSE); // DSCursor if (!rslt) rslt = Register_IF(NULL, PROGID_MDSCURSOR, NULL, PROGID_MDSCURSOR_1, NULL, CLSID_MDSCURSOR_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_MDSCURSOR_1, NULL, NULL, NULL, CLSID_MDSCURSOR_1, FALSE); // DSDATAPACKET if (!rslt) rslt = Register_IF(NULL, PROGID_MDATAPACKETREAD, NULL, NULL, NULL, CLSID_MDATAPACKETREAD, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_MDATAPACKETWRITE, NULL, NULL, NULL, CLSID_MDATAPACKETWRITE, FALSE); #else // DSBASE rslt = Register_IF(NULL, PROGID_DSBASE, NULL, PROGID_DSBASE_2, NULL, CLSID_DSBASE_2, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSBASE_1, NULL, NULL, NULL, CLSID_DSBASE_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSBASE_2, NULL, NULL, NULL, CLSID_DSBASE_2, FALSE); // DSCursor if (!rslt) rslt = Register_IF(NULL, PROGID_DSCURSOR, NULL, PROGID_DSCURSOR_2, NULL, CLSID_DSCURSOR_2, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSCURSOR_1, NULL, NULL, NULL, CLSID_DSCURSOR_1, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DSCURSOR_2, NULL, NULL, NULL, CLSID_DSCURSOR_2, FALSE); // DSDATAPACKET if (!rslt) rslt = Register_IF(NULL, PROGID_DATAPACKETREAD, NULL, NULL, NULL, CLSID_DATAPACKETREAD, FALSE); if (!rslt) rslt = Register_IF(NULL, PROGID_DATAPACKETWRITE, NULL, NULL, NULL, CLSID_DATAPACKETWRITE, FALSE); #endif return rslt; }
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; TCHAR buffer[39]; stringFromCLSID(&buffer[0], (REFCLSID)(&CLSID_IExample2)); // Open "HKEY_LOCAL_MACHINE\Software\Classes" if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, &ClassKeyName[0], 0, KEY_WRITE, &rootKey)) { // Delete ProgID subkey and everything under it if (!RegOpenKeyEx(rootKey, &OurProgID[0], 0, KEY_ALL_ACCESS, &hKey)) { RegDeleteKey(hKey, &CLSID_Str[0]); RegCloseKey(hKey); RegDeleteKey(rootKey, &OurProgID[0]); // Delete our CLSID key and everything under it if (!RegOpenKeyEx(rootKey, &CLSID_Str[0], 0, KEY_ALL_ACCESS, &hKey)) { if (!RegOpenKeyEx(hKey, &buffer[0], 0, KEY_ALL_ACCESS, &hKey2)) { RegDeleteKey(hKey2, &InprocServer32Name[0]); RegDeleteKey(hKey2, &ProgIDName[0]); RegCloseKey(hKey2); RegDeleteKey(hKey, &buffer[0]); } RegCloseKey(hKey); } } RegCloseKey(rootKey); // Unregister type library UnRegisterTypeLib(&CLSID_TypeLib, 1, 0, LOCALE_NEUTRAL, SYS_WIN32); } MessageBox(0, "De-registered IExample2.DLL as a COM component.", &ObjectDescription[0], MB_OK|MB_ICONEXCLAMATION); } return(0); }