遇到一个开IE的问题,在csdn上文了半天,答复均大同小异,他们的做法不是不可行,但却存在很多弊端。无奈,只好肯msdn,再上codeproject等站,终于找到较为可行的解决方案,如下:
#pragma once
class CURL
{
private:
// The default browser
CString m_strBrowser;
public:
void Open(LPCTSTR lpszURL, bool bNewWindow = true)
{
if (bNewWindow)
::ShellExecute(NULL, NULL, GetBrowser(), lpszURL, NULL, SW_SHOWNORMAL);
else
::ShellExecute(NULL, NULL, lpszURL, NULL, NULL, SW_SHOWNORMAL);
}
LPCTSTR GetBrowser(void)
{
// Do we have the default browser yet?
if (m_strBrowser.IsEmpty())
{
// Get the default browser from HKCR/http/shell/open/command
HKEY hKey = NULL;
// Open the registry
if (::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("http//shell//open//command"), 0,
KEY_READ, &hKey) == ERROR_SUCCESS)
{
// Data size
DWORD cbData = 0;
// Get the default value
if (::RegQueryValueEx(hKey, NULL, NULL, NULL, NULL, &cbData) == ERROR_SUCCESS && cbData > 0)
{
// Allocate a suitable buffer
TCHAR* psz = new TCHAR [cbData];
// Success?
if (psz != NULL)
{
if (::RegQueryValueEx(hKey, NULL, NULL,
NULL, (LPBYTE)psz, &cbData) ==
ERROR_SUCCESS)
{
// Success!
m_strBrowser = psz;
}
delete [] psz;
}
}
::RegCloseKey(hKey);
}
// Do we have the browser?
if (m_strBrowser.GetLength() > 0)
{
// Strip the full path from the string
int nStart = m_strBrowser.Find('"');
int nEnd = m_strBrowser.ReverseFind('"');
// Do we have either quote?
// If so, then the path contains spaces
if (nStart >= 0 && nEnd >= 0)
{
// Are they the same?
if (nStart != nEnd)
{
// Get the full path
m_strBrowser = m_strBrowser.Mid(nStart + 1, nEnd - nStart - 1);
}
}
else
{
// We may have a pathname with spaces but
// no quotes (Netscape), e.g.:
// C:/PROGRAM FILES/NETSCAPE/COMMUNICATOR/PROGRAM/NETSCAPE.EXE -h "%1"
// Look for the last backslash
int nIndex = m_strBrowser.ReverseFind('//');
// Success?
if (nIndex > 0)
{
// Look for the next space after the final
// backslash
int nSpace = m_strBrowser.Find(' ', nIndex);
// Do we have a space?
if (nSpace > 0)
m_strBrowser = m_strBrowser.Left(nSpace);
}
}
}
}
// Done
return m_strBrowser;
}
};
作者在优快云询问开IE问题的解决方案,未得到满意答复,后通过查阅MSDN和Codeproject等找到可行方案。代码中定义了CURL类,包含获取默认浏览器和打开URL的方法,还涉及从注册表获取浏览器信息及处理路径字符串。
1150

被折叠的 条评论
为什么被折叠?



