IDispatch

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

IDispatch

Сообщение Eugenio » 12.11.2004 (Пт) 8:46

Скажите мне, Мегачелы Которые Знают,
что, собственно, нужно, чтобы объект реализовывал IDispatch -
я почему-то считал, что когда создаешь ActiveX dll, это автоматом происходит
Есть ли у меня вопрос? У меня всегда есть вопрос

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.11.2004 (Пт) 9:12

Совершенно верно, ActiveX COM - это в первую очередь реализация именно IDispatch, а не только IUnknown, что имеет место в чистом COM. А в чем дело?

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 9:40

И происходит это при создании ActiveX dll, автоматом, так? Я вот это хочу знать точно.
И еще второй вопрос: регистрация автоматом происходит?
Чего-то у меня прога, вызывающая этот объект,
затыкается.
Я впрочем, зарегал его и вручную (regsvr32) и поглядел в реестр - есть такая запись! И один фиг. А прога такая, что ей требуется IDispatch
Есть ли у меня вопрос? У меня всегда есть вопрос

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.11.2004 (Пт) 10:51

Видимо, ей требуется не только IDispatch, возможно, что-то еще. Ну там, neutral threading apartment или еще какой экзотики в том же духе...
Регистрация происходит автоматом при компиляции. Если же переносишь на другую машину - будь добр, regsvr32.

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 11:07

Спасибо. С самим ActiveX'ом понятно. А вот в threading model'ях я ни в зуб пока что ногой.
А можно, вообще, отлаживать работу ActiveX прям при вызове объекта сторонней прогой?
Как, вобще, отлаживать COM-сервер?
Написанная специально для его проверки прога показывает, что все ОК - объект создается, действия выполняет..
(только что накатал проектик, с одной (1) процедуркой, которая говорит ему "Сделай то-то")
Последний раз редактировалось Eugenio 12.11.2004 (Пт) 11:13, всего редактировалось 1 раз.
Есть ли у меня вопрос? У меня всегда есть вопрос

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.11.2004 (Пт) 11:12

Так, давай сначала определимся, что у тебя.

Это in-process server или out-of-process? Проще говоря, это dll или ехе?

Далее, это что именно - COM, DCOM, COM+ - что? А то можно долго гадать.

Какие именно требования предъявляет твоя прога к этому компоненту? Крайне желательно цитирование документации.

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 12.11.2004 (Пт) 11:14

Eugenio писал(а):Спасибо. С самим ActiveX'ом понятно. А вот в threading model'ях я ни в зуб пока что ногой.
А можно, вообще, отлаживать работу ActiveX прям при вызове объекта сторонней прогой?
Как, вобще, отлаживать COM-сервер?
Написанная специально для его проверки прога показывает, что все ОК - объект создается, действия выполняет..



Твой ActiveX

Project Prop -> Debugging - > StartProgram [путь к специально для его проверки прога ]

Далее как обычно

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 11:14

Это in-process, dll
2 CodeMaster. И можно будет увидеть, что там между сторонней прогой и этой dll-кой происходит?
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 11:19

Конечно, документация и мне крайне была бы желательна :x
Эта прога - 1С. Спецы покруче меня говорят, что она взаимодействует с com-объектами только так (IDispatch). А у меня об этом сведений - только из 3-х рук.
Обращение на ее встроенном языке я вписал там, куда надо. А она затыкается на вызове объекта
Последний раз редактировалось Eugenio 12.11.2004 (Пт) 11:36, всего редактировалось 3 раз(а).
Есть ли у меня вопрос? У меня всегда есть вопрос

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 12.11.2004 (Пт) 11:21

Eugenio писал(а):Это in-process, dll
2 CodeMaster. И можно будет увидеть, что там между сторонней прогой и этой dll-кой происходит?


Да.
Иногда проще сделать DebugLog в виде файла.

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 11:29

Спасибо! Теперь не надо будет вспомогательные проекты проверочные делать.
Но с этой 1С оно, пожалуй, не выйдет :( . При запуске этой проги, в качестве параметров я могу передать тольку путь к базе данных и т.п.,
она сама не запустит ту часть кода своего прикладного решения, которая юзает ActiveX.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 11:34

2 Ennor.
COM
Com+, я, ежли честно, не знаю толком что такое - какой-то доп интерфейс там предусмотрен?
Есть ли у меня вопрос? У меня всегда есть вопрос

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 12.11.2004 (Пт) 11:40

Eugenio писал(а):2 Ennor.
Com+, я, ежли честно, не знаю толком что такое - какой-то доп интерфейс там предусмотрен?


Проще говоря.

СOM = YourApp -> DLL

COM+= YourApp -> NotYourApp -> DLL
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 12.11.2004 (Пт) 11:42

Eugenio писал(а):Спасибо! Теперь не надо будет вспомогательные проекты проверочные делать.
Но с этой 1С оно, пожалуй, не выйдет :( . При запуске этой проги, в качестве параметров я могу передать тольку путь к базе данных и т.п.,
она сама не запустит ту часть кода своего прикладного решения, которая юзает ActiveX.


для 1с есть технология "Внешних компонент" от 1С
есть и другие изощеренные способы но не на VB

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 12:02

про технологию мне известно, но не все в ней понятно.
Есть ли у меня вопрос? У меня всегда есть вопрос

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 12.11.2004 (Пт) 12:16

Eugenio писал(а):про технологию мне известно, но не все в ней понятно.


там все просто как телефон из двух банок соед. веревкой , кроме того там есть примеры на VB6.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.11.2004 (Пт) 17:40

Чтобы отлаживать компонент "вживую", надо задать в Project -> Properties -> Debugging "Wait for components to be created" (так оно и стоит по умолчанию).
После чего запускаешь проект, цепляешься к нему 1С-ом, и смотришь что где происходит... Никаких параметров коммандной строки никому передавать не надо.

2Ennor: не "neutral threading", а "free threading".


Ещё добавлю, что создать в VB компонент без поддержки IDispatch стоит большого труда - я пытался, и бросил :-) Так что в твоём компоненте эта поддержка определённо есть.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.11.2004 (Пт) 17:49

Почему, всё очень просто :)
Нафиг PutMem4 нулями в vTable на места всех методов IDispatch :mrgreen:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.11.2004 (Пт) 17:53

GSerg писал(а):Почему, всё очень просто :)
Нафиг PutMem4 нулями в vTable на места всех методов IDispatch :mrgreen:
Откуда? Из Class_Initialize?
Там уже поздно - клиенту передали указатель на IDispatch.

Я даже писал свою QueryInterface и патчил VTable, вставляя её туда, - и всё равно, VB её время от времени перезаписывает правильной :shock:
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 17:55

codemaster писал(а):там все просто как телефон из двух банок соед. веревкой , кроме того там есть примеры на VB6.

Вообще-то, с этим нельзя не согласиться:-)
Простых расширений я уже настряпал (один объект, <= 10 методов ). Но я не понимаю вот чего:
если я там хочу реализовать несколько объектов, то у меня должен быть один центральный (с которым прога будет общаться через IInitDone) и все прочие, которые должны реализовывать ILanguageExtender, так или не так?
Можешь смеяться, но возню с нынешним COM-server'ом специально для 1С, я затеял вот от этого непонимания - некому было мне, тупому, объяснить, чё да как.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 17:57

GSerg писал(а):Почему, всё очень просто :)
Нафиг PutMem4 нулями в vTable на места всех методов IDispatch :mrgreen:
:lol:
tyomitch писал(а):]Так что в твоём компоненте эта поддержка определённо есть.

Да я с отчаяния и не только на отсутствие IDisp грешить был готов :)
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.11.2004 (Пт) 18:03

tyomitch писал(а):Чтобы отлаживать компонент "вживую", надо задать в Project -> Properties -> Debugging "Wait for components to be created" (так оно и стоит по умолчанию).
После чего запускаешь проект, цепляешься к нему 1С-ом, и смотришь что где происходит... Никаких параметров коммандной строки никому передавать не надо.

Понял. Я обычно просто писал доп. модуль, откуда и плющил всяко объекты, не подозревая про настройки debugger'а.
Есть ли у меня вопрос? У меня всегда есть вопрос

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 16.11.2004 (Вт) 19:05

tyomitch писал(а):Чтобы отлаживать компонент "вживую", надо задать в Project -> Properties -> Debugging "Wait for components to be created" (так оно и стоит по умолчанию).
После чего запускаешь проект, цепляешься к нему 1С-ом, и смотришь что где происходит... Никаких параметров коммандной строки никому передавать не надо.

tyomitch, извини,
вот эту тему продолжить хочется: что значит "цепляешься" - создаешь там объект из компонента? - При этом ничегошеньки не происходит, при запущенном debugger'е!!
Есть ли у меня вопрос? У меня всегда есть вопрос

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.11.2004 (Вт) 19:41

Откуда ты знаешь, что не происходит? ;-)
Поставь брякпойнт, где тебе нужно - тогда увидишь, что произойдёт.
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 16.11.2004 (Вт) 19:46

Не настоко уж я туп :)
Там брякпойнтов у меня больше, чем кода было! :(
Причем, именно в тех местах, к-рые она НЕ МОГЛА обойти, судя по тому, что происходит в самой 1С
Есть ли у меня вопрос? У меня всегда есть вопрос

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.11.2004 (Вт) 19:49

Ну тогда не знаю... У всех остальных работает :-)
Ты уверен, что твой объект создаётся? Попробуй подцепиться другим экземпляром VB.
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 16.11.2004 (Вт) 20:00

Так не получится - там специфичная вешь, ей требуется 1С as object, а компонент её получает, когда его 1С вызывает. Я-то размечтался, что смогу поглядеть, чего там эта безумная прога творит... :(
Объект-то создается - там начинают происходить задуманные вещи, но не совсем те :) .
Есть ли у меня вопрос? У меня всегда есть вопрос

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.11.2004 (Вт) 20:42

Я 1С никогда вживую не видел, но уверяю тебя, что если из VB объект создаётся, то должен создаваться и оттуда.
Проверь клиентский код - вдруг там опечатка какая?
Изображение

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 17.11.2004 (Ср) 8:57

tyomitch писал(а):Проверь клиентский код - вдруг там опечатка какая?

Там негде опечататься так, чтобы брякпойнты не сработали (если они должны): одна строка
Код: Выделить всё
ExtObject = CreateObject("AddIn.HV")
инициирует диалог проги с объектом через этот ихний интерфейс ILanguageExtender - выполнение кучи процедур, в которых у меня бряки и стоят. В доке сказано, что если эти процедуры не выполняются - объект сразу выгружается. А он создается и работает, но в отладчике ни фига не происходит!
Есть ли у меня вопрос? У меня всегда есть вопрос

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.11.2004 (Ср) 11:45

Ты точно нажал f5 перед запуском 1С? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 14

    TopList