【发布时间】:2018-07-05 13:29:15
【问题描述】:
#include <windows.h>
#include <exdisp.h>
class CWebBrowser{
public:
HRESULT hr;
IWebBrowserApp *www;
HRESULT init(){
CLSID clsid;
const IID IID_IEApplication = {0x0002DF05,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
if(www) hr = www->put_Visible(-1);
if(hr!=0 || www==NULL){
QuitBrowser();
hr=CLSIDFromProgID(L"InternetExplorer.Application",&clsid);
if(hr==0) hr=CoCreateInstance(clsid,NULL,CLSCTX_ALL,IID_IEApplication,reinterpret_cast<void**>(&www));
if(hr==0) hr = www->put_Visible(-1);
}
return hr;
}
HRESULT browse(BSTR addr){
VARIANT vEmpty;
VariantInit(&vEmpty);
hr=www->Navigate(addr, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
VariantClear(&vEmpty);
return hr;
}
void QuitBrowser(){
if(www){
www->Quit();
www->Release();
www=NULL;
}
}
CWebBrowser(){
hr=CoInitialize(NULL);
}
~CWebBrowser(){
if(www){
www->Quit();
www->Release();
www=NULL;
}
CoUninitialize();
}
};
我正在调用 init() 函数来检查浏览器是否仍然打开,然后再browse() 另一个网页。
当我第一次运行应用程序时,任务管理器 (iexplorer.exe) 和 (iexplorer.exe *32) 中显示 2 个进程
当我关闭应用程序时,有时进程会关闭,有时不会。
有时 (iexplorer.exe *32) 会关闭,而只有 (iexplorer.exe) 会打开。在这种情况下,当我尝试调用 init() 时,应用程序崩溃了。
使用 CodeBlocks 17.12、Windows 2000 和 IE 11。
【问题讨论】:
-
可能在每次浏览之前都进行初始化会有帮助吗?
-
创建一个新实例。我将无法执行诸如登录网站之类的操作,因为会话将无效。
-
是的,但 AFAIK 之前您可以使用 GetActiveObject 检查/获取正在运行的应用程序实例。如果失败,则根据需要调用 CoCreateInstance
标签: c++ winapi exception codeblocks