Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.28;
Скачать: CL | DM;

Вниз

Смещение адреса метода в COM   Найти похожие ветки 

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

Есть у меня 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;


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


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

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


 
Suntechnic ©   (2002-10-18 03:32) [2]

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


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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.10.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
3-92347
Sergant
2002-10-06 05:00
2002.10.28
Не могу создать/добавить индекс в Firebird!!!


3-92325
S
2002-10-04 16:39
2002.10.28
Блокировка таблицы!


4-92819
vajo
2002-09-13 14:38
2002.10.28
Копирование каталога


8-92623
Извращенец
2002-07-01 19:36
2002.10.28
О спрайтах


1-92420
Leny
2002-10-17 12:51
2002.10.28
Два вопроса по Excel