Image

Categories:

Неужели докопался?

Похоже, ночные бдения дали результат. Программа перстала грохаться. И если дело было в том, что я предполагаю, то четыре вечера были пущены псу под хвост из-за последней версии IDL-компилятора, которая неверно генерировала указатель на vtable в случае (согласен, экзотическом), когда наследуемый интерфейс пустой - т.е. не добавлет новых методов. Все это, конечно, сущее блядство, но появляется шанс успеть доделать.


Имеем следующие интерфейсы:

interface IBase : IDispatch
{
HRESULT Method_1();
...
HRESULT Method_n();
}

interface IDerived : IBase
{
}

IDerived не содержит методов. Зачем нужен такой? Для красоты дизайна, если в двух словах. В общем, нужен был. Все это компилировалось в proxy/stub DLL и работало как часы в течении пяти лет.

До той поры, пока я не перекомпилировал все это под Visual Studio 2003. После этого при попытке вызвать любой метод IDerived клиент рушился с access violation.

Единственное, что помогло: вставить пустой метод в IDerived:

interface IDerived : IBase
{
HRESULT __noop__();
}

Теперь MIDL корректно генерирует код proxy/stub библиотеки.

Суки! Суки! Суки! Четыре долгих вечера убил.