最近做一个通用的com组件调用框架,用一个注册好的factory.dll去创建另一个com.dll里面的接口,返回这个接口给脚本语言用;
结果发现如果是delphi写的dll,没有问题,如果是atl实现的dll,则会报TYPE_E_LIBNOTREGISTERED错误,让我十分郁闷,今天下决心解决,于是跟踪看了下atlcom.h里的代码,发现是GetTI这函数在作怪,代码如下所示
ITypeLib* pTypeLib = NULL;
if (InlineIsEqualGUID(CAtlModule::m_libid, *m_plibid) && m_wMajor == 0xFFFF && m_wMinor == 0xFFFF)
{
TCHAR szFilePath[MAX_PATH];
DWORD dwFLen = ::GetModuleFileName(_AtlBaseModule.GetModuleInstance(), szFilePath, MAX_PATH);
if( dwFLen != 0 && dwFLen != MAX_PATH )
{
USES_CONVERSION_EX;