使用#import 命令时如何创建 IDiaDataSource 的实例?

How to create an instance of IDiaDataSource when using the #import command?

我正在尝试在 msdia140.dll 上使用 #import 命令,该命令用于 Debug Interface Access SDK

是的,我知道接口已经有它的头文件,但我想使用智能 COM 指针,因此使用 #import 命令。

我使用的导入命令是:

#import "bin/msdia140.dll" \
    rename("virtual", "Virtual")\
    exclude(               \
      "IStream"            \
    , "ISequentialStream"  \
    , "_LARGE_INTEGER"     \
    , "_ULARGE_INTEGER"    \
    , "tagSTATSTG"         \
    , "_FILETIME"          \
    , "IEnumUnknown")

重命名是因为关键字冲突,排除是为了消除导入名称已存在的类型的警告。

...App::InitInstance() 函数中,我调用了 CoInitialize(NULL);,在 ...App::ExitInstance() 中,我调用了 CoUninitialize();.

现在我正在尝试做等同于:

CComPtr<IDiaDataSource> pSource;
CoCreateInstance( CLSID_DiaSource,
                   NULL,
                   CLSCTX_INPROC_SERVER,
                   __uuidof( IDiaDataSource ),
                  (void **) &pSource);

按照说明 here 中所述,但没有成功。我试过的命令是:

Dia2Lib::IDiaDataSourcePtr dataSource;
dataSource.CreateInstance(__uuidof(Dia2Lib::IDiaDataSource));

但智能指针保持为NULL。我做错了什么?

查看 CreateInstance() 的 return 值。它会告诉你问题所在,或者至少是第一个问题。

我立即看到的一个问题是:

Dia2Lib::IDiaDataSourcePtr dataSource;
dataSource.CreateInstance(__uuidof(Dia2Lib::IDiaDataSource));

应该是:

Dia2Lib::IDiaDataSourcePtr dataSource;
HRESULT hr = dataSource.CreateInstance(__uuidof(Dia2Lib::DiaSource));

您正在使用接口 ID 而不是 coclass 的 CLSID -- 总是会有问题。