ICDBIPtr pTemp;
HRESULT hr=pTemp.CreateInstance(CLSID_CDBI);其中CLSID_CDBI,我查找了一下,是在*.tlh中定义的,可是ATL COM 向导生成的文件夹中并没有此文件,请问这是怎么回事?extern "C" const GUID __declspec(selectany) CLSID_CDBI =
{0x69dbdeed,0x9590,0x4f4f,{0x86,0x29,0x68,0x55,0x8d,0x0b,0x8c,0x93}};

解决方案 »

  1.   

    那两个文件是#import预处理指令在编译前根据其指定的类型库位置(可以是.tlb .dll .exe等)获取类型信息,再根据此类型信息生成包装类,CLSID、IID等,并提供如错误处理、智能指针等方便功能。这些功能的实现是通过预编译器生成的*.tlh和*.tli,将原来放#import的地方原封替换为*.tlh文件的内容(相当于将#import "YourDll.dll"换成#include "YourDll.tlh"),而*.tli在*.tlh中被一同包含,因此可以使用ICDBIPtr这个智能指针。
    不过不知楼主怎么做的,#import生成的*.tli和*.tlh不会以上面的形式声明CLSID和IID,而是使用__uuidof操作符来获取CLSID和IID。因为*.tlh和*.tli可能被包含在两个以上的源文件中,如果使用上面的定义方式,则多个模块文件有多个实例,连接时将会发生错误。
    所以,如果你想使用CLSID,对于你上面的代码,极有可能是CoCreateInstance( __uuidof( CDBI ) );而IID极有可能是__uuidof( ICDBI )