Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Смещение адреса метода в COM


Дмитрий Баранов ©   (2002-10-17 14:07:00) 

Есть у меня dll-ка, содержащая единственный интерфейс, написана на VC/ATL.
Решил добавить в нее новый метод, назовем его Test(). Добавил, пересобрал. В Delphi после каждого изменения интерфейса удаляю и снова импортирую соотв. Type Library (для синхронизации, естественно). При вызове только этого метода из Delphi вываливается AccessViolation по адресу 000000, т.е. видать, адрес этого метода в run-time не вычисляется и равен 0. Где баг - найти не могу.

Может ли быть дело в порядке объявления методов в исходниках? У меня этот метод в .idl имеет dispid 23, а в реализации класса IDE VC++ запихала его на первое место:

=== IDL ===

interface INewsManager : IDispatch
{
[id(1), helpstring("method AddNewNew")] HRESULT AddNewNew([in] BSTR Data, [in] BSTR Header, [in] BSTR Anons, [in] BSTR Txt, [in] BSTR Reserved);

...
[id(23), helpstring("method Test")] HRESULT Test();};


=== Хедер ===

class ATL_NO_VTABLE CNewsManager :
....

// INewsManager
public:
STDMETHOD(Test)();// Здесь - первый.
STDMETHOD(get_RecordCount)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_EOF)(/*[out, retval]*/ BOOL *pVal);


=== _TLB.pas ===


INewsManager = interface(IDispatch)
["{C14A452B-9F84-40E6-BF8E-0613A4B175FB}"]
...


procedure Find(Where: SYSINT; const What: WideString; const Reserved1: WideString;
const Reserved2: WideString); safecall;
procedure Test; safecall;// по порядку - 24 метод!!!
property Data: WideString read Get_Data;


"В чем правда, брат?" :))
Заранее спасибо.


Дмитрий Баранов   (2002-10-18 11:03:00) [1]

Не учите ученого :) Компонент пока не в бизнесе, а потому не надо мне лишних containment`ов и aggreagation"ов, себе дороже :)


Владислав   (2002-10-18 10:57:00) [2]

Нада еще раз перечитать Keplin Sergey (17.10.02 22:49) :))
Удачи.


Дмитрий Баранов   (2002-10-18 10:10:00) [3]

Спасибо, разобрался:)
>>Suntechnic Ты прав. Мистика - пересобрал в ReleaseMinDependency - появился метод, опять переключил режим на Debug - появился и там. И - хрен его знает - при сборке появляется сообщение - "performing registation" - а ни фига не перерегистрируется... Руками Regsvr запускать нада.


Suntechnic   (2002-10-18 03:32:00) [4]

Есть подозрение, что ты просто напросто вызываешь "старый" COM. Т.е. библиотеку типов ты взял новую, а как зарегистрированный сервер в системе у тебя значится старый, ещё без этого метода. Посмотри через OLE Viewer на свой COM. В какую директорию ссылается ProgID и действительно ли ты его пересобрал именно туда. Вообщем покапай в этом направлении, я на такое часто нарывался.


Keplin Sergey   (2002-10-17 22:49:00) [5]

Здесь фишка как раз в добавлении!
Ты не добавляй новый метод,
а создай потомок твоего интерфейса, то бишь новый
и там создай новый метод...
Это самый простой вариант.


Наверх

Титульная страница Поиск, карта сайта Написать письмо