Visual studio 2010 CoCreateInstance-COM+;注册表数据库检测到系统错误

Visual studio 2010 CoCreateInstance-COM+;注册表数据库检测到系统错误,visual-studio-2010,visual-c++,com,com+,Visual Studio 2010,Visual C++,Com,Com+,在一个小型测试项目中,我有以下代码: HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_ALL, __uuidof( IXMLDOMDocument ), ( void ** ) & m_pDoc); if ( hr != S_OK ) { throw "MSXML DOM Document could not be created"; } 这样编译和运行时不会出现问题。在另一个项目中,相同的代码失败: hr

在一个小型测试项目中,我有以下代码:

HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_ALL, __uuidof( IXMLDOMDocument ), ( void ** ) & m_pDoc);
if ( hr != S_OK )
{
  throw "MSXML DOM Document could not be created";
}
这样编译和运行时不会出现问题。在另一个项目中,相同的代码失败:

hr=0x80110474 COM+注册表数据库检测到系统错误

两个项目都是使用VisualStudio 2010编译的C++。我已经检查并比较了两个项目之间的设置,试图确定可能导致此问题的差异。到目前为止,我看不出为什么测试项目运行而另一个项目失败

编辑-完整示例代码列表:

#include "stdafx.h"
#include <atlbase.h>
#include <atlconv.h>
#include "MsXml.h"
int _tmain(int argc, _TCHAR* argv[])
{
    IXMLDOMDocument* m_pDoc = NULL;
    if(FAILED(CoInitializeEx( 0, COINIT_MULTITHREADED )))
      if(FAILED(CoInitializeEx( 0, COINIT_APARTMENTTHREADED )))
        throw "Could not initialize COM";
    HRESULT hr = CoCreateInstance( CLSID_DOMDocument, NULL, CLSCTX_ALL, __uuidof( IXMLDOMDocument ), ( void ** ) & m_pDoc);
    if ( hr != S_OK )
      throw "MSXML DOM Document could not be created";
    return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括“MsXml.h”
int _tmain(int argc,_TCHAR*argv[]
{
IXMLDOMDocument*m_pDoc=NULL;
if(失败(coinitializex(0,COINIT\u多线程)))
if(失败(coinitializex(0,COINIT_APARTMENTTHREADED)))
抛出“无法初始化COM”;
HRESULT hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_ALL,uuidof(IXMLDOMDocument),(void**)和m_pDoc);
如果(hr!=S_正常)
抛出“无法创建MSXML DOM文档”;
返回0;
}

找到了一个解决方案,虽然不理想,但它解决了问题。我创建了一个新项目,并手动导入了设置。

找到了一个解决方案,尽管并不理想,但它解决了问题。我创建了一个新项目并手动导入了设置。

我在Turbo Delphi中遇到了同样的问题:使用CoCreateInstance()的相同代码在一个项目中工作,在另一个项目中失败,HR=80110474(COMADMIN_E_REGDB_SYSTEMERR)。这是由IDE重写存储在项目设置中的环境变量引起的。因此,它只有在IDE下运行时才会失败(无论调试状态如何)。清理项目设置可以解决问题。

我在Turbo Delphi中也遇到了同样的问题:使用CoCreateInstance()的相同代码在一个项目中工作,在另一个项目中失败,HR=80110474(COMADMIN_E_REGDB_SYSTEMERR)。这是由IDE重写存储在项目设置中的环境变量引起的。因此,它只有在IDE下运行时才会失败(无论调试状态如何)。清理项目设置可以解决此问题。

您是如何使用类ID CLSID_DOMDocument注册组件的?您是如何在这两个项目中引用它的?CLSID_DOMDocument是Microsoft的MSXML包的一部分。并且是使用其安装程序安装的。这是Windows中预装的组件,请确保不要自行安装。这会生成COM+错误的原因无法从代码段中找到。假设那台机器上的注册表状态不佳可能是一个很好的猜测。@Hans-根据描述,代码片段在一个项目中工作,而不是在另一个项目中工作。我怀疑这和一个腐败的注册有任何关系!所讨论的HRESULT是COMADMIN_E_REGDB_SYSTEMERR。腐败与否这个问题几乎肯定与注册表有关。某些情况导致COM基础结构认为此COM对象的注册有问题。您是否在64位系统上运行这些测试?如果是,工作测试和失败测试是否都是32位(或都是64位)?如果不是,则“real”注册表和SysWow64之间的差异可能会导致您的问题。您是如何使用类ID CLSID_DOMDocument注册该组件的?您是如何在这两个项目中引用它的?CLSID_DOMDocument是Microsoft的MSXML包的一部分。并且是使用其安装程序安装的。这是Windows中预装的组件,请确保不要自行安装。这会生成COM+错误的原因无法从代码段中找到。假设那台机器上的注册表状态不佳可能是一个很好的猜测。@Hans-根据描述,代码片段在一个项目中工作,而不是在另一个项目中工作。我怀疑这和一个腐败的注册有任何关系!所讨论的HRESULT是COMADMIN_E_REGDB_SYSTEMERR。腐败与否这个问题几乎肯定与注册表有关。某些情况导致COM基础结构认为此COM对象的注册有问题。您是否在64位系统上运行这些测试?如果是,工作测试和失败测试是否都是32位(或都是64位)?如果不是,那么“real”注册表和SysWow64之间的差异可能会导致您的问题。非常感谢您,我花了整整一个晚上来调试这个问题。在我的情况下,不会打开任何文件对话框。不幸的是,我需要重写一个环境变量来解决Delphi构建脚本中的一个bug。。。就是赢不了。非常感谢你,我花了一整晚的时间来调试这个问题。在我的情况下,不会打开任何文件对话框。不幸的是,我需要重写一个环境变量来解决Delphi构建脚本中的一个bug。。。就是赢不了。