使用VS2005的ATL向导生成了一个简单的windows service程序,其中创建了若干线程完成操作IE的一些事务,使用IWebBrowser2接口,但是发现调用完成Navigate2之后,并没有IE窗口显示出来,真是奇怪,同样的代码如果是MFC对话框程序就可以,但是像windows service这种没有界面的程序难道就不可以吗?期待高手解答。
已经使用put_Visible(VARIANT_TRUE)了,调用Navigate2函数以及之前所有函数的返回值都是s_ok,可是就是不显示IE的界面。另外,在windows的任务管理器中已经看见Iexplore进程已经启动。哪位大侠遇见过类似问题,给指条明路吧,多谢。

解决方案 »

  1.   

    IE的很多设置是用户相关的,而服务的用户是内置的SYSTEM,不能调用用户相关的Shell函数。
      

  2.   

    服务中使用winhttp是不被支持的
    IE是基于winhttp的
      

  3.   


    请问,有别的办法解决么?需要在win service程序中实现类似这样的需求,
    只要能操纵网页就可以,比如打开google进行搜索。
      

  4.   


    再请问,使用createprocess这种方法,如何完成诸如“判断网页是否已经打开”这种操作?
    (之前使用IWebBrowser2时,使用了IConnectionPoint的Advise方法建立了通知链接,可以从IDispatch:: Invoke 得到通知)
      

  5.   

    纠正一下蒋老大的笔误:winhttp是专用于服务的(比如IIS),IE使用的是wininet,这个API会读取用户配置数据,而且需要存在桌面环境,因此不适合SYSTEM帐户使用。
      

  6.   


    请问,在windows service程序中,哪种方法可以实现对IE的控制呢?
      

  7.   


    单独启动一个线程,模拟Explorer用户。
      

  8.   


    我现在是独立的线程,使用_beginthreadex创建。
    请问:如何模拟Explorer用户呢?任务管理器显示的用户有SYSTEM、LOCAL SERVICE、还有当前登录的用户(admin)。
      

  9.   

    窗口的问题看来是这样了:
    不是没有显示,而是显示在另外的桌面上,我想由于运行windows service的是SYSTEM用户的缘故吧。
    在vista下如果运行,会得到一个通知,点击后会进入一个界面只有刚刚被打开的IE窗口,估计就是“SYSTEM”用户的窗口了。
    这个问题先这样吧。
    --------------------------------------------------------------
    目前有一个更棘手且怪异的问题:
    代码顺序如下:
    1、我在自己创建的线程中createwindow了一个窗口,
    2、接着调用
    CComPtr<IWebBrowser2> pWB;
        hr = pWB.CoCreateInstance(L"InternetExplorer.Application");
    3、
    然后一些代码完成对DIID_DWebBrowserEvents2接口的“链接”4、
    接下来创建一个循环:
    while(ture)
    {
        WaitForMultipleObjects(2, hArr, TRUE, INFINITE))
       ......    while ((GetMessage(&msg, 0, 0, 0))) 
        {
            if (msg.message == WM_MYQUIT) //自定义消息
            {
                break;
            }
        
            ::TranslateMessage(&msg); 
            ::DispatchMessage(&msg); 
        } 
    }目的是,想在收到WM_MYQUIT消息时,退出循环,等待event被触发,然后重新进入循环。例如:当浏览到特定网页后,发送WM_MYQUIT,退出循环,等待...请问:
    (问题一)
    整个流程看似正常,但是,每次第四次退出循环后,第五次进入循环,当调用Navigate2成功后,并等待IDISPATCH的invoke被回调时(在invoke函数中,我会调用postmessage函数向窗口发送消息),这时总是出现异常,断点在::DispatchMessage(&msg); 这句代码,真是奇怪?有哪位兄台见过这种情况么?每次都是第五次,真郁闷。
    补充:
    发送消息使用postmessage函数,第一个参数为我在上面自己创建的窗口的句柄。(问题二),对于等待网页打开完成,我试过几种方法(例如在主循环中使用WaitFor...函数,但是线程就此挂起),所以,似乎必须创建一个窗口来获取消息
    如果这的必须这样,谁能解释一下我自己创建的窗口和被打开的IE的窗口有什么关系?如果有其他方法可以不用创建窗口,请不吝赐教,多谢多谢。
      

  10.   

    WaitForMultipleObjects(2, hArr, TRUE, INFINITE)) 
    这句已经阻塞线程了,后面的消息循环代码执行不到,应该使用MsgWaitForMultiObjects,在等待信号时也可以处理消息循环。
      

  11.   

    嗯,一会儿试一下。
    不过现在的现象并非线程被阻塞不运行,而是第五轮调用WaitFor...函数成功后,进入while ((GetMessage(&msg, 0, 0, 0))) 循环,刚刚开始循环两三个消息后,收到一个1024消息,也就是WM_USER,这时,执行到::DispatchMessage(&msg); 这句代码,就异常了...不管怎样,谢谢你关注。
      

  12.   

    WM_USER消息会被COM调用用到,看来是有其他线程正在向本线程发起COM调用,所以应该是组件响应出问题了。
      

  13.   

    指的是IDispatch的invoke中自己实现的处理么?