Почему TlbImp не импортирует этот COM-интерфейс для DIA правильно в .NET? - PullRequest
1 голос
/ 28 февраля 2012

Я попытался импортировать Microsoft DIA SDK для использования с .NET:

call "%VS90COMNTOOLS%\vsvars32.bat"
midl /I "%VSINSTALLDIR%\DIA SDK\include" "%VSINSTALLDIR%\DIA SDK\idl\dia2.idl" /tlb dia2.tlb
tlbimp dia2.tlb

, который, по-видимому, работает правильно по большей части, за исключением того, что по некоторым причинам он не включает некоторые изинтерфейсы (например, IDiaEnumFrameData), в то время как остальные просто отлично.

(Интерфейс отсутствует ни в файле .DLL, ни в файле .TLB - даже если он присутствует в Cи заголовочные файлы.)

Что вызывает это?

Ответы [ 3 ]

1 голос
/ 12 февраля 2015

По сути, я добавил дополнительный метод «взлома MIDL» в определении IDiaDataSource (в DIA SDK\idl\dia2.idl), который принимает все «неиспользуемые» типы перечислений в качестве аргументов.Пока метод находится в конце определения интерфейса (и, конечно, вы его не вызываете), остальные методы vtable будут работать нормально.Вам также необходимо добавить предварительные объявления для других интерфейсов в начале файла.

1 голос
/ 08 декабря 2015

midl.exe отправляет в сгенерированную библиотеку типов только элементы (и их зависимости) из раздела 'library' в описании idl.

Добавьте пропущенный интерфейс в раздел «библиотека», и вы получите то, что хотите

//...
library Dia2Lib
{
//...
interface IDiaEnumFrameData; // << insert it
//...
}
0 голосов
/ 28 февраля 2012

Я не уверен, хотите ли вы попробовать трудный путь, но если у вас есть доступ к IDL, вы можете имитировать интерфейс, используя работу, аналогичную той, которая была сделана в проекте TaskScheduler в Codeproject. (Да, я знаю, что он старый).

TaskSchedulerInterop.cs

http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=2407

...