Доброго времени суток!
Возникла необходимость создать несколько интерфейсов на VC++. Что я и сделал, основываясь на статье http://www.dtf.ru/articles/read.php?id=44995
В случае, если один интерфейс соответствует одному классу - всё работает нормально, но если я пытаюсь создать один класс с несколькими интерфейсами
| Код | interface __declspec(novtable) IFoo: public IUnknown { public: virtual void __stdcall FooMethod1() = NULL; virtual void __stdcall FooMethod2() = NULL; }
interface __declspec(novtable) IBar: public IUnknown { public: virtual void __stdcall BarMethod1(int i) = NULL; virtual void __stdcall BarMethod2() = NULL; }
|
| Код | class CFooBar: public IFoo, public IBar { public: CFooBar(); ~CFooBar(); void __stdcall FooMethod1(); void __stdcall FooMethod2(); void __stdcall BarMethod1(int i); void __stdcall BarMethod2(); }
extern CFooBar *foobar;
|
И, в последствии вызываю функцию
| Код | void GetFooBar(IBar **ofb) { if (foobar == NULL) { foobar = new CFooBar(); } foobar->QueryInterface(IID_IUnknown,(void**)ofb); }
|
то при попытке обратится к методам интерфейса IBar возникает ошибка
| Код | Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
|
Пробежался отладчиком, и обнаружил, что при обращении к методам IBar, почему то, вызываются методы IFoo. Если в объявлении класса CFooBar поменять местами IFoo и IBar
| Код | class CFooBar: public IBar, public IFoo
|
то интерфейс IBar заработает, IFoo будет вылетать с ошибкой
Методы IUnknown реализованы, __stdcall проставлено для всех функций. |