Fixed: Use ShellExecute to open a document or URL as primary method, because second one doesn't work everytime

This commit is contained in:
kervala 2015-11-07 18:31:58 +01:00
parent 75aeb2ecf6
commit 02633263d0
3 changed files with 69 additions and 78 deletions

View file

@ -1025,73 +1025,47 @@ LONG GetRegKey(HKEY key, LPCSTR subkey, LPSTR retdata)
} }
#endif // NL_OS_WINDOWS #endif // NL_OS_WINDOWS
bool openURL (const char *url) static bool openDocWithExtension (const char *document, const char *ext)
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
char key[1024];
if (GetRegKey(HKEY_CLASSES_ROOT, ".html", key) == ERROR_SUCCESS)
{
lstrcatA(key, "\\shell\\open\\command");
if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS)
{
char *pos;
pos = strstr(key, "\"%1\"");
if (pos == NULL) { // No quotes found
pos = strstr(key, "%1"); // Check for %1, without quotes
if (pos == NULL) // No parameter at all...
pos = key+lstrlenA(key)-1;
else
*pos = '\0'; // Remove the parameter
}
else
*pos = '\0'; // Remove the parameter
lstrcatA(pos, " ");
lstrcatA(pos, url);
int res = WinExec(key,SW_SHOWDEFAULT);
return (res>31);
}
}
#elif defined(NL_OS_MAC)
return launchProgram("open", url);
#elif defined(NL_OS_UNIX)
return launchProgram("/etc/alternatives/x-www-browser", url);
#else
nlwarning("openURL() is not implemented for this OS");
#endif // NL_OS_WINDOWS
return false;
}
bool openDoc (const char *document)
{
#ifdef NL_OS_WINDOWS
string ext = CFile::getExtension (document);
char key[MAX_PATH + MAX_PATH];
// First try ShellExecute() // First try ShellExecute()
HINSTANCE result = ShellExecuteA(NULL, "open", document, NULL, NULL, SW_SHOWDEFAULT); HINSTANCE result = ShellExecuteA(NULL, "open", document, NULL, NULL, SW_SHOWDEFAULT);
// If it failed, get the .htm regkey and lookup the program // If it failed, get the .htm regkey and lookup the program
if ((uintptr_t)result <= HINSTANCE_ERROR) if ((uintptr_t)result <= HINSTANCE_ERROR)
{ {
if (GetRegKey(HKEY_CLASSES_ROOT, ext.c_str(), key) == ERROR_SUCCESS) char key[MAX_PATH + MAX_PATH];
if (GetRegKey(HKEY_CLASSES_ROOT, ext, key) == ERROR_SUCCESS)
{ {
lstrcatA(key, "\\shell\\open\\command"); lstrcatA(key, "\\shell\\open\\command");
if (GetRegKey(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS) if (GetRegKey(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS)
{ {
char *pos; char *pos = strstr(key, "\"%1\"");
pos = strstr(key, "\"%1\"");
if (pos == NULL) { // No quotes found if (pos == NULL)
pos = strstr(key, "%1"); // Check for %1, without quotes {
if (pos == NULL) // No parameter at all... // No quotes found
// Check for %1, without quotes
pos = strstr(key, "%1");
if (pos == NULL)
{
// No parameter at all...
pos = key+lstrlenA(key)-1; pos = key+lstrlenA(key)-1;
else
*pos = '\0'; // Remove the parameter
} }
else else
*pos = '\0'; // Remove the parameter {
// Remove the parameter
*pos = '\0';
}
}
else
{
// Remove the parameter
*pos = '\0';
}
lstrcatA(pos, " "); lstrcatA(pos, " ");
lstrcatA(pos, document); lstrcatA(pos, document);
@ -1101,12 +1075,39 @@ bool openDoc (const char *document)
} }
} }
else else
{
return true; return true;
}
#else #else
// TODO: implement for Linux and Mac OS X // TODO: implement for Linux and Mac OS X
nlunreferenced(document); nlunreferenced(document);
#endif // NL_OS_WINDOWS #endif // NL_OS_WINDOWS
return false; return false;
} }
bool openURL (const char *url)
{
#ifdef NL_OS_WINDOWS
return openDocWithExtension(url, "htm");
#elif defined(NL_OS_MAC)
return launchProgram("open", url);
#elif defined(NL_OS_UNIX)
return launchProgram("/etc/alternatives/x-www-browser", url);
#else
nlwarning("openURL() is not implemented for this OS");
#endif // NL_OS_WINDOWS
return false;
}
bool openDoc (const char *document)
{
// get extension from document fullpath
string ext = CFile::getExtension(document);
// try to open document
return openDocWithExtension(document, ext.c_str());
}
} // NLMISC } // NLMISC

View file

@ -3913,20 +3913,12 @@ NLMISC_COMMAND(displayActionCounter, "display the action counters", "")
} }
#if defined(NL_OS_WINDOWS)
NLMISC_COMMAND (url, "launch a browser to the specified url", "<url>") NLMISC_COMMAND (url, "launch a browser to the specified url", "<url>")
{ {
if (args.size () != 1) if (args.size () != 1)
return false; return false;
HINSTANCE result = ShellExecute(NULL, "open", args[0].c_str(), NULL,NULL, SW_SHOW); return openURL(args[0].c_str());
if ((intptr_t)result > 32)
return true;
else
{
log.displayNL ("ShellExecute failed %d", (uint32)(intptr_t)result);
return false;
}
} }
NLMISC_COMMAND( reconnect, "Reconnect to the same shard (self Far TP)", "") NLMISC_COMMAND( reconnect, "Reconnect to the same shard (self Far TP)", "")
@ -3949,8 +3941,6 @@ NLMISC_COMMAND( reconnect, "Reconnect to the same shard (self Far TP)", "")
return true; return true;
} }
#endif // !FINAL_VERSION
struct CItemSheetSort struct CItemSheetSort
{ {
const CItemSheet *IS; const CItemSheet *IS;