QString WindowsPlatform::getDefaultOpenApp(QString extension) { DWORD length = 0; ASSOCSTR type = ASSOCSTR_CONTENTTYPE; QString extensionWithDot = QString::fromUtf8(".") + extension; QString mimeType; HRESULT ret = AssocQueryString(0, type, (LPCWSTR)extensionWithDot.utf16(), NULL, NULL, &length); if (ret == S_FALSE) { WCHAR *buffer = new WCHAR[length]; ret = AssocQueryString(0, type, (LPCWSTR)extensionWithDot.utf16(), NULL, buffer, &length); if (ret == S_OK) { mimeType = QString::fromUtf16((ushort *)buffer); } delete [] buffer; } if (!mimeType.startsWith(QString::fromUtf8("video"))) { return QString(); } type = ASSOCSTR_EXECUTABLE; ret = AssocQueryString(0, type, (LPCWSTR)extensionWithDot.utf16(), NULL, NULL, &length); if (ret == S_FALSE) { WCHAR *buffer = new WCHAR[length]; ret = AssocQueryString(0, type, (LPCWSTR)extensionWithDot.utf16(), NULL, buffer, &length); if (ret == S_OK) { QString result = QString::fromUtf16((ushort *)buffer); delete [] buffer; return result; } delete [] buffer; } WCHAR buff[MAX_PATH]; if (SHGetFolderPath(0, CSIDL_PROGRAM_FILESX86, NULL, SHGFP_TYPE_CURRENT, buff) == S_OK) { QString path = QString::fromUtf16((ushort *)buff); path.append(QString::fromUtf8("\\Windows Media Player\\wmplayer.exe")); if (QFile(path).exists()) { return path; } } return QString(); }
// Launches the end splash screen. bool LaunchApplication::LaunchEndSplashScreen( ) { #if defined(PLATFORM_WIN32) if( !g_pLTIStringEdit->DoesIDExist(g_pLTDBStringEdit, "EndSplashURL" )) return false; char szEndSplashURL[MAX_PATH*2] = ""; LTStrCpy( szEndSplashURL, MPW2A( LoadString( "EndSplashURL" )).c_str(), LTARRAYSIZE( szEndSplashURL )); if( LTStrEmpty( szEndSplashURL )) return false; char szExe[MAX_PATH] = ""; uint32 nExeSize = LTARRAYSIZE( szExe ); AssocQueryString(ASSOCF_NOTRUNCATE, ASSOCSTR_EXECUTABLE, ".htm", "open", szExe, ( DWORD* )&nExeSize); return LaunchFromString( szExe, szEndSplashURL, true, true ); #else return false; #endif }
// --------------------------------------------------------------------------- // // // ROUTINE: LaunchApplication::LaunchMOTDLink // // PURPOSE: Launches Browser with a given MOTD Link // // --------------------------------------------------------------------------- // bool LaunchApplication::LaunchMOTDLink( char const* pszUrl ) { #if defined(PLATFORM_WIN32) // Check inputs. if( !pszUrl || !pszUrl[0] ) return false; char szExe[MAX_PATH] = ""; uint32 nExeSize = LTARRAYSIZE( szExe ); AssocQueryString(ASSOCF_NOTRUNCATE, ASSOCSTR_EXECUTABLE, ".htm", "open", szExe, ( DWORD* )&nExeSize); if( !LaunchFromString( szExe, pszUrl, false, false )) return false; return true; #else return false; #endif }
static char *get_exe_for_type (const char *ext) { char *exe = NULL; HRESULT ret; DWORD len = 0; ret = AssocQueryString(ASSOCF_NOTRUNCATE, ASSOCSTR_EXECUTABLE, ext, NULL, NULL, &len); if (ret == S_FALSE) { exe = calloc(len + 1, 1); ret = AssocQueryString(0, ASSOCSTR_EXECUTABLE, ext, NULL, exe, &len); if (ret != S_OK) { fprintf(stderr, "couldn't determine exe for type %s\n", ext); free(exe); exe = NULL; } } return exe; }
static int virgo__lua_win32_get_associated_exe(lua_State *L) { DWORD exePathLen = MAX_PATH; HRESULT hr; TCHAR exePath[ MAX_PATH ] = { 0 }; virgo_t* v = virgo__lua_context(L); const char *extension = luaL_checkstring(L, 1); hr = AssocQueryString(ASSOCF_INIT_IGNOREUNKNOWN, ASSOCSTR_EXECUTABLE, extension, "open", exePath, &exePathLen); if (hr < 0) { lua_pushnil(L); lua_pushfstring(L, "could not find file association: '%d'", hr); return 2; } lua_pushlstring(L, exePath, exePathLen - 1); return 1; }
CString CCommonAppUtils::GetAppForFile ( const CString& fileName , const CString& extension , const CString& verb , bool applySecurityHeuristics) { CString application; // normalize file path CString fullFileName = ExpandEnvironmentStrings (fileName); CString normalizedFileName = L"\"" + fullFileName + L"\""; // registry lookup CString extensionToUse = extension.IsEmpty() ? CPathUtils::GetFileExtFromPath (fullFileName) : extension; if (!extensionToUse.IsEmpty()) { // lookup by verb CString documentClass; DWORD buflen = 0; AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_COMMAND, extensionToUse, verb, NULL, &buflen); std::unique_ptr<TCHAR[]> cmdbuf(new TCHAR[buflen + 1]); if (FAILED(AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_COMMAND, extensionToUse, verb, cmdbuf.get(), &buflen))) { documentClass = CRegString (extensionToUse + L"\\", L"", FALSE, HKEY_CLASSES_ROOT); CString key = documentClass + L"\\Shell\\" + verb + L"\\Command\\"; application = CRegString (key, L"", FALSE, HKEY_CLASSES_ROOT); } else { application = cmdbuf.get(); } // fallback to "open" if (application.IsEmpty()) { buflen = 0; AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_COMMAND, extensionToUse, L"open", NULL, &buflen); std::unique_ptr<TCHAR[]> cmdopenbuf (new TCHAR[buflen + 1]); if (FAILED(AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_COMMAND, extensionToUse, L"open", cmdopenbuf.get(), &buflen))) { CString key = documentClass + L"\\Shell\\Open\\Command\\"; application = CRegString (key, L"", FALSE, HKEY_CLASSES_ROOT); } else { application = cmdopenbuf.get(); } } } // normalize application path application = ExpandEnvironmentStrings (application); // security heuristics: // some scripting languages (e.g. python) will execute the document // instead of open it. Try to identify these cases. if (applySecurityHeuristics) { if ( (application.Find (L"%2") >= 0) || (application.Find (L"%*") >= 0)) { // consumes extra parameters // -> probably a script execution // -> retry with "open" verb or ask user if (verb.CompareNoCase (L"open") == 0) application.Empty(); else return GetAppForFile ( fileName , extension , L"open" , true); } } // exit here, if we were not successful if (application.IsEmpty()) return application; // resolve parameters if (application.Find (L"%1") < 0) application += L" %1"; if (application.Find(L"\"%1\"") >= 0) application.Replace(L"\"%1\"", L"%1"); application.Replace (L"%1", normalizedFileName); return application; }
void PreviewGenerator::GetClsidsFromExt(CString ext, std::vector<CLSID> &retVal) { std::vector<CLSID> res; DWORD size = 1024; TCHAR buff[1024]; LPCWSTR extra = L"{8895B1C6-B41F-4C1C-A562-0D564250836F}"; CString cs = L""; cs.Format(L".%s", ext); HRESULT hr = AssocQueryString(ASSOCF_VERIFY, ASSOCSTR_SHELLEXTENSION, cs, extra, buff, &size); if (hr == S_OK) { CLSID cls; CLSIDFromString(buff, &cls); res.push_back(cls); } extra = L"{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}"; hr = AssocQueryString(ASSOCF_VERIFY, ASSOCSTR_SHELLEXTENSION, cs, extra, buff, &size); if (hr == S_OK) { CLSID cls; CLSIDFromString(buff, &cls); std::vector<CLSID>::iterator it = find(res.begin(), res.end(), cls); if (it == res.end()) res.push_back(cls); } extra = L"{e357fccd-a995-4576-b01f-234630154e96}"; hr = AssocQueryString(ASSOCF_VERIFY, ASSOCSTR_SHELLEXTENSION, cs, extra, buff, &size); if (hr == S_OK) { CLSID cls; CLSIDFromString(buff, &cls); std::vector<CLSID>::iterator it = find(res.begin(), res.end(), cls); if (it == res.end()) res.push_back(cls); } //extra = L"{534A1E02-D58F-44f0-B58B-36CBED287C7C}"; //CLSID cls; //CLSIDFromString(extra, &cls); //res.push_back(cls); //hr = AssocQueryString(ASSOCF_VERIFY, ASSOCSTR_SHELLEXTENSION, cs, extra, buff, &size); //if (hr == S_OK) //{ // std::vector<CString>::iterator it = find(res.begin(), res.end(), buff); // if (it == res.end()) // res.push_back(buff); //} PERCEIVED ptype; PERCEIVEDFLAG pflag; PWSTR ppszType; cs = L""; WCHAR wcData[MAX_PATH]; LONG cData = sizeof(wcData); cs.Format(L".%s", ext); hr = RegQueryValue(HKEY_CLASSES_ROOT, cs, wcData, &cData); if (hr == S_OK) { cs.Format(L"%s\\shellex\\{8895b1c6-b41f-4c1c-a562-0d564250836f}", wcData); cData = sizeof(wcData); hr = RegQueryValue(HKEY_CLASSES_ROOT, cs, wcData, &cData); if (hr == S_OK) { CLSID cls; CLSIDFromString(wcData, &cls); res.push_back(cls); } } cs.Format(L".%s", ext); hr = AssocGetPerceivedType(cs, &ptype, &pflag, &ppszType); if (hr == S_OK) { cs.Format(L"SystemFileAssociations\\%s\\ShellEx\\{e357fccd-a995-4576-b01f-234630154e96}", ppszType); hr = RegQueryValue(HKEY_CLASSES_ROOT, cs, wcData, &cData); if (hr == S_OK) { CLSID cls; CLSIDFromString(buff, &cls); std::vector<CLSID>::iterator it = find(res.begin(), res.end(), cls); if (it == res.end()) res.push_back(cls); } cs.Format(L"SystemFileAssociations\\%s\\ShellEx\\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}", ppszType); hr = RegQueryValue(HKEY_CLASSES_ROOT, cs, wcData, &cData); if (hr == S_OK) { CLSID cls; CLSIDFromString(buff, &cls); std::vector<CLSID>::iterator it = find(res.begin(), res.end(), cls); if (it == res.end()) res.push_back(cls); } cs.Format(L"SystemFileAssociations\\%s\\ShellEx\\ContextMenuHandlers\\ShellVideoSlideshow", ppszType); hr = RegQueryValue(HKEY_CLASSES_ROOT, cs, wcData, &cData); if (hr == S_OK) { CLSID cls; CLSIDFromString(buff, &cls); std::vector<CLSID>::iterator it = find(res.begin(), res.end(), cls); if (it == res.end()) res.push_back(cls); } } retVal.swap(res); }