Вагиф Абилов (object) wrote,
Вагиф Абилов
object

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

Похоже, ночные бдения дали результат. Программа перстала грохаться. И если дело было в том, что я предполагаю, то четыре вечера были пущены псу под хвост из-за последней версии 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 библиотеки.

Суки! Суки! Суки! Четыре долгих вечера убил.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments