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

时间:2016-09-11 17:21:00

标签: c++ com

我尝试在#import msdia140.dll上使用#import命令。

是的,我知道接口已有一个头文件,但我想使用智能COM指针,因此使用#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);

现在我试图做相当于:

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

如说明Debug Interface Access SDK中所述,但没有成功。我试过的命令是:

NULL

但智能指针仍为using System; using System.Windows; using System.Windows.Controls; public static class Filter { public static readonly DependencyProperty ByProperty = DependencyProperty.RegisterAttached( "By", typeof(Predicate<object>), typeof(Filter), new PropertyMetadata(default(Predicate<object>), OnByChanged)); public static void SetBy(ItemsControl element, Predicate<object> value) { element.SetValue(ByProperty, value); } public static Predicate<object> GetBy(ItemsControl element) { return (Predicate<object>)element.GetValue(ByProperty); } private static void OnByChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is ItemsControl itemsControl && itemsControl.Items.CanFilter) { itemsControl.Items.Filter = (Predicate<object>)e.NewValue; } } } 。我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

我看到的一个问题是:

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

应该是:

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

您正在使用接口ID而不是coclass的CLSID - 这将永远是一个问题。