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

Я попытался импортировать 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 ответа

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

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

//...
library Dia2Lib
{
//...
interface IDiaEnumFrameData; // << insert it
//...
}

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

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

TaskSchedulerInterop.cs

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

Другие вопросы по тегам