Непонятная ошибка при использовании интерфейса переданного
из другого COM обьекта.
Я пытаюсь создать plugin похожий на DevStudio Add-in.
Внутри основного приложения описал и создал COM обьект Application.
Потом создаю отдельный компонент AddCt.У него есть функция
OnConnection(IApplication* pApp, VARIANT_BOOL bFirstTime,long dwCookie, VARIANT_BOOL* OnConnection);
Вызываю ее из основного приложения и передаю указатель на IApplication.
Внутри AddCt описан и создан компонент Command.У Application есть
указатель ICommand.Внутри OnConnection создается Command и вызывается
функция обьекта Application — SetAddInInfo.B нее передается указатель
на ICommand и строки с названиями методов ICommand.
После этого в основном приложении через обьект Application
можно вызывать функции ICommand.Интерфейс ICommand дуальный.
Поэтому методы можно вызывать без Invoke.
Все работает нормально.
Затем я создаю отдельный компонент Process.
Вызываю его функцию и передаю указатель на ICommand.
Вызываю функции ICommand внутри Process.
Invoke,AddRef,QueryInterface — работают нормально.
Но прямой вызов моей функции вызывает ошибку.
Debug Error !
Program : TradNSP.EXE
Module :
File : i386\chkesp.c
Line : 42
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.
В чем может быть дело?
Re: Непонятная ошибка при использовании интерфейса пер
Здравствуйте koka, Вы писали:
K>Непонятная ошибка при использовании интерфейса переданного K>из другого COM обьекта. K>Я пытаюсь создать plugin похожий на DevStudio Add-in. K>Внутри основного приложения описал и создал COM обьект Application. K>Потом создаю отдельный компонент AddCt.У него есть функция K>OnConnection(IApplication* pApp, VARIANT_BOOL bFirstTime,long dwCookie, VARIANT_BOOL* OnConnection); K>Вызываю ее из основного приложения и передаю указатель на IApplication. K>Внутри AddCt описан и создан компонент Command.У Application есть K>указатель ICommand.Внутри OnConnection создается Command и вызывается K>функция обьекта Application — SetAddInInfo.B нее передается указатель K>на ICommand и строки с названиями методов ICommand. K>После этого в основном приложении через обьект Application K>можно вызывать функции ICommand.Интерфейс ICommand дуальный. K>Поэтому методы можно вызывать без Invoke. K>Все работает нормально. K>Затем я создаю отдельный компонент Process. K>Вызываю его функцию и передаю указатель на ICommand. K>Вызываю функции ICommand внутри Process. K>Invoke,AddRef,QueryInterface — работают нормально. K>Но прямой вызов моей функции вызывает ошибку. K>Debug Error ! K>Program : TradNSP.EXE K>Module : K>File : i386\chkesp.c K>Line : 42 K>The value of ESP was not properly saved across a function call. K>This is usually a result of calling a function declared with one calling K>convention with a function pointer declared with a different calling convention. K>В чем может быть дело?
А ты случайно в версиях заголовочных файлов к своим интерфейсам не запутался?
Не создавал ли копий заголовков с последующими ссылками к ним?
Может надо заново их синхронизировать?
Успехов!
Д.Н.С.
Re: Непонятная ошибка при использовании интерфейса пер
Здравствуйте koka, Вы писали:
KK>Debug Error ! K>Program : TradNSP.EXE K>Module : K>File : i386\chkesp.c K>Line : 42 K>The value of ESP was not properly saved across a function call. K>This is usually a result of calling a function declared with one calling K>convention with a function pointer declared with a different calling convention. K>В чем может быть дело?
Версия 1. Ты скомпилировал и зарегистрировал прокси/стаб, а потом изменил описание интерфейса. Это првело к тому, что методам передаются не правильные аргументы и проверка стека показывает на ошибку. У тебя вроде все типы automation-совместимые. Так что отригистрируй к чертям эту проксю и живи на automation-прокси.
Версия 2. Ты имеешь два описания интерфейсов которые различаются (например, старый #импрот).
Вариант 3. (самый хреновый) Ты прошелся по стеку.
В любом случае методом научного тыка такие вещи ловятся за 1-2 дня. Коментарь функциональность и проверяй.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.