问题描述及解决:
程序使用word,在启动程序时出错。通过定位,发现
在执行代码
m_comptrActiveDoc = CComQIPtr<_Document>(m_Word.get_ActiveDocument());
后m_comptrActiveDoc = NULL,程序未对m_comptrActiveDoc进行判空直接使用导致程序崩溃。
问题是为什么m_comptrActiveDoc 返回NULL。跟进到CComQIPtr的构造函数,构造函数调用了QueryInterface函数。代码如下
CComQIPtr(_In_opt_IUnknown*lp)throw()
{
if (lp !=NULL)
lp->QueryInterface(*piid,(void **)&p);
}
在QueryInterface调用后p为NULL。
后来通过单独执行以下语句
char *p= NULL;
int nReturn=m_Word.get_ActiveDocument()->QueryInterface(__uuidof(_Document), (void**)&p);
发现nReturn为TYPE_E_CANTLOADLIBRARY。通过google发现,此种问题可能是MSWORD.OLB在注册表中的注册出现问题,导致此问题的一个可能原因是2003,2007安装卸了装,装了卸载。那么要做的事就是重新注册MSWORD.OLB。注册OLB的工具为regtlibv12.exe(C:\Windows\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe)。在cmd下注册命令为:
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe""C:\Program Files\Microsoft Office\Office12\MSWORD.OLB"
成功界面如下
然后QueryInterface命令执行正确了。