Форум: "Основная";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
ВнизСмещение адреса метода в 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c