2011-11-21 73 views
0

我有一个MFC应用程序,它为应用程序公开了一堆OLE对象,并打开文档。我可以使用应用程序类的GUID连接到服务器(例如:在红宝石窗口中:WIN23OLE.new('{12345678-1234-1234-1234-12345678}')),但是当我尝试使用类名称WIN32OLE.new('MyApp.Application')进行连接时,它总是失败,出现“Invalid Class String”错误( HRESULT错误代码:0x800401f3)。同样的事情发生COM/OLE可以通过GUID连接,但不能通过类字符串连接

MFC应用程序中的OLE初始化没有返回错误,并且一旦通过GUID进行连接,那么它工作正常。

我只是很好奇为什么类字符串方法不工作。有任何想法吗?

回答

2

类字符串被称为ProgID(程序ID的缩写),它实际上只是一个人类可读的ClassID版本。的ProgIDs存储在HKEY_CLASSES_ROOT下的注册表,例如从我的注册表挑选一个随机:

HKEY_CLASSES_ROOT\Microsoft.XMLDOM 

在这个关键有一个名为CLSID的另一个关键:

HKEY_CLASSES_ROOT\Microsoft.XMLDOM\CLSID 

而且里面关键是一个包含ClassID的REG_SZ值:

{2933BF90-7B36-11D2-B20E-00C04F983E60} 

所以基本上它的工作方式是COM将尝试在指定的ProgID下找到注册表中的CLSID。我猜测它不在那里,或者它不知何故无法访问。如果你想弄清楚它,请打开REGEDIT.EXE并查看是否有预期的注册表设置。如果它们不是,那么你的答案是为什么它不起作用(出于某种原因,COM组件的注册不会创建ProgID键)。

如果设置存在,我会建议运行进程监视器(sysinternals.com)并设置一些注册表过滤器,以查看注册表扫描该ProgID时发生了什么。

以下是有关的ProgID多一点信息:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd542719(v=vs.85).aspx

+0

我以为他们只需要在注册表中由COM启动应用程序。或者,应用程序可以在系统启动时向系统注册,然后可用。此程序的安装程序会为关联的DLLS创建注册表项(所有这些都由类字符串/ ProgID工作),但不会为主可执行文件创建。谢谢(你的)信息! –