Мне интересно, есть ли более чистый способ написать ( рабочий ) код ниже:
uint uEnum = 0;
PStore.EnumTypes(0, 0, ref uEnum);
System.Reflection.MemberInfo inf = typeof(PSTORECLib.CEnumTypes);
GuidAttribute CEnumGuid =
(GuidAttribute)inf.GetCustomAttributes(typeof(GuidAttribute), false)[0];
Guid tmp = new Guid(CEnumGuid.Value);
IntPtr ppv;
Marshal.QueryInterface((IntPtr)uEnum, ref tmp, out ppv);
PSTORECLib.CEnumTypes EnumPStoreTypes =
(PSTORECLib.CEnumTypes)Marshal.GetObjectForIUnknown(ppv);
//Later
Marshal.Release(ppv);
Когда я попытался вставить IEnumPStoreTypes**
в idl-файл PSTORECLib (т. Е. Когда я использовал исходный IDL-вывод oleview) в вызов PStore.EnumTypes
, dll-вывод tlbimp сказал мне передать ссылку на CEnumTypes
. Функция была довольна этим (вернула S_OK), но не заполнила ссылку. Этот беспорядок в уродливом коде произошел, когда я изменил его, чтобы вместо него принять указатель на long, и сделал то, что я сделал, чтобы экземпляр CEnumTypes ссылался на указатель. Все это кажется мне немного грязным, хотя оно работает . Есть ли более чистый способ сделать это?
Обратите внимание, что строка PSTORECLib.CEnumTypes cen = new PSTORECLib.CEnumTypes();
вызовет исключение COMException "Class Not Registered".