Главная страница
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.025 c
1-92592
jen_bond
2002-10-17 08:52
2002.10.28
MainMenu 2000/Xp


1-92511
"Ujin
2002-10-18 14:56
2002.10.28
Сотню раз видел, а как надо... :( Как услать письмо с аттачментом


7-92773
Mashinist
2002-08-16 10:34
2002.10.28
Фай по модему


3-92348
Akorolev10
2002-10-07 09:37
2002.10.28
D7 DbExpress for MS Sql 7/2000 !!!


14-92698
Undert
2002-10-07 23:47
2002.10.28
Не упустите возможность быть в первых номерах .....