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

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

помогите с OLE на Delphi [D6, WinME]


SaperXL ©   (2002-08-24 12:18:00) 

В качестве OLE сервера выступает MapInfo. Он поддерживает некоторую объектную модель:
-Сервер
-Карты (OLE связанный объект, в джанном случае карта)
-Переменные (у каждой карты свои)
У каждого объекта соответственно есть свой набор методов (некоторые с параметрами, например
метод Do(s:string), который в зависимости от параметра заствляет изменяться карту -
связанный OLE объект) и свойства, но всё это есть у MapInfo, проблема заключается в том,
чтобы перенести всё это в Delphi. Если бы Я писал на VisualBasic, то было бы так:
Dim mi As Object

Sub Form_Load( )
Set mi = CreateObject("MapInfo.Application")
mi.Do "Set Application Window " & Form1.hwnd
End Sub

Если бы Я писал на Visual C, то сначала Я бы присоединил модуль прилагающийся к MapInfo
(#include MapInfow.h) тем самым дав своему приложению знания о классе DMapInfo и далее

DMapInfo mi;
mi.Do("Set Application Window " + Form1.hwnd)

Обратите внимание в результате каки-то "таинственных" заклинаний в обоих случаях Я получаю
объект (mi) который знает о всех методах поддерживаемых OLE сервером. (Особенно круто на
Басике).

Так вот хотелось бы также получать объект и в Delphi. Через OLEContainer не получается -
он не знает о методах поддерживаемых OLE сервером. Помогите пожалуйста...
Речь шла об OLE Automation, а не об OLE внедрении.


DiamondShark   (2002-08-24 18:29:00) [1]


> А с OLEContainer"ом всё-таки что-то не так: у него же есть
> свойство OLEObject которое должно указывать на OLE объект
> (у нас это mi), а он куда-то указывает, а про интерфейс
> (методы и свойства) объекта ничего не знает


Оно указывает на интерфейс IDispatсh -- базовый интерфейс всех объектов автоматизации.

Variant тоже может содержать ссылку IDispatch, просто компилятор автоматически генерирует код позднего связывания для variant через вызовы IDispatch.GetIDsOfNames и IDispatch.Invoke

Естественно, в этом случае никакого контроля типов на этапе компиляции + overheat на позднее связывание.


Набережных С.   (2002-08-24 16:09:00) [2]

Плюс два пути:
1)Import type librare
2)Ручной перевод заголовочного файла на Pascal


SaperXL   (2002-08-24 15:40:00) [3]

Да, спасибо - помогло очень.
Да Я и не говорю, что Басик круче просто так для примера как в другом языке...
А с OLEContainer"ом всё-таки что-то не так: у него же есть свойство OLEObject которое должно указывать на OLE объект (у нас это mi), а он куда-то указывает, а про интерфейс (методы и свойства) объекта ничего не знает. Ну да ладно - он (OLEContainer) мне всё равно не нужен. Спасибо.


DiamondShark   (2002-08-24 13:20:00) [4]

На дельфе ничуть не хуже чем на васике.

var
mi: variant;
begin
mi := CreateOleObject("MapInfo.Application");
// а дальше совсем как в васике


Наверх

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