我的程序需要每隔一定时间枚举正在运行的IE实例,于是在WM_TIMER中执行如下代码:
CoInitialize(NULL);
SHDocVw::IShellWindowsPtr m_spSHWinds;
HRESULT ret=m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
if(m_spSHWinds==NULL)
{
if(debug.Open(L"c:\\debug.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate))
{
CString errCode;
errCode.Format(L"CoCreateInstance failed (%X)\n",ret);
debug.SeekToEnd();
debug.WriteString(errCode);
debug.Close();
}
}
该代码运行正常,但是后来我把程序改为了Win32服务程序(NT Service),于是CreateInstance每次都失败,c:\\debug.txt中的信息如下:
CoCreateInstance failed (80040154)
CoCreateInstance failed (8007000E)
CoCreateInstance failed (8007000E)
CoCreateInstance failed (8007000E)
...
在winerror.h中查到  80040154 对应REGDB_E_CLASSNOTREG,意思是Class not registered,而8007000E对应E_OUTOFMEMORY,意思是Ran out of memory
这是什么原因呢?有办法解决吗?分不够再加

解决方案 »

  1.   

    你看看是不是Service的权限问题。
    在Service的Propertise里有一个Log On TAB,里面可以设置这个Service的启动用户。
    你换成Administrator试试。
      

  2.   

    应该跟这个没有关系。服务的类型为 SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS
    也就是说,服务的登录身份为“本地系统帐户(允许服务与桌面交互)”,因为我的程序有隐藏窗口,需要处理WINDOWS消息循环,所以只能这样。
      

  3.   

    读MSDN中的文章
    Starting an Interactive Client Process in C++
      

  4.   

    仔细读了DentistryDoctor推荐的文章,该文章讲的是window station 和desktop,针对的是从windows服务程序中创建其他进程的问题,也就是SetProcessWindowStation和SetThreadDesktop,这些我已经处理了的,现在我的服务程序能收到windows消息,也能创建有图形界面的进程。但用CreateInstance创建IShellWindows就是不成功,而在普通程序中是可以的,也读了Why Do Certain Win32 Technologies Misbehave in Windows NT Services?(http://www.microsoft.com/msj/0398/service2.aspx),一无所获。请继续指点。
      

  5.   

    IShellWindowsPtr需要一个shell。在服务里面Shell是没有的,因为服务自己没有桌面。你可以在用户启动时运行一个程序来和服务交互。
      

  6.   

    jiangsheng能说的详细一些吗?是不是说在服务中是不能使用IShellWindowsPtr的?或者推荐一些资料也可以。那么在服务程序中还有什么好方法可以枚举当前的IE实例,并获得其IWebBrowser2接口?
      

  7.   

    服务和用户处于不同的桌面,默认配置下服务不能访问到用户桌面的,IShellWindowsPtr只对当前桌面有用,在没桌面的服务里面用当然会出错。