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