Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Пт Апр 02, 2010 12:36 pm Заголовок сообщения: C++ Builder и MapInfo |
|
|
Доброго времени дня! Пытаюсь написать приложение в C++ Builder, которое бы использовало интегрированную картографию MapInfo.
Проанализировав примеры, реализованные на Delphi, сначала необходимо создать ОЛЕ объект
Variant a=CreateOleObject("MapInfo.Application");
При выполнении, эта строчка проходит нормально, а как проверить правильность ее выполнения?
В дальнейшем необходимо использовать метод a.DO... , но в c++ builder такого нет, и никаких комментариев по реализации в с++ builder нет, помогите с реализацией выполения кода MapBasic из под C++ Builder 6.0
Заранее спасибо. |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Пт Апр 02, 2010 2:28 pm Заголовок сообщения: |
|
|
1) Если код:
Variant a=CreateOleObject("MapInfo.Application");
выполнился без ошибки и в переменной a есть значение, то значит все хорошо.
2) Почему вы думаете, что в c++ builder так
a.DO('')
нельзя? Пробовали? |
|
Вернуться к началу |
|
|
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Пт Апр 02, 2010 2:36 pm Заголовок сообщения: |
|
|
Переменная "а" принимает значение {{ }}, это нормально?
a.do пробовал, хотел сделать по аналогии с примером для Delphi, но что-то никак не получилось... Билдер пишет "Member Identifier Expected", видимо он распознает do как структуру do...while
К примеру реализация команд MapBasic, так она выглядит в Delphi (из примера):
procedure TKDMapInfoServer.ExecuteCommandMapBasic(Command:string;const Args: array of const);
begind
a.do(Format(Command,Args));
end;
может быть какие-то доп.библиотеки нужны? |
|
Вернуться к началу |
|
|
Arhara
Зарегистрирован: 18.02.2009 Сообщения: 400 Откуда: Moscow, RF
|
Добавлено: Сб Апр 03, 2010 2:35 am Заголовок сообщения: |
|
|
А должна иметь вид тестовой строки "Mapinfo Professional"
Mapinfo устанавливает себя как OLE-Сервер.
Прежде чем говорить о подпрограммах, надо выяснить происходит ли вообще обращение к Mapinfo.
Самый простой случай, что возвращает команда
a.Eval("2*2")
И прежде чем создавать объект MapInfo, который плохо управляем, попробуйте подключиться к активной запущенной ранее копии Mapinfo командой аналогичной
GetObject(,"MapInfo.Application")
К тому же, видимо именно для этих случаев, для Do есть аналог RunCommand
Код: |
Sub Do(command As String)
Member of MapInfo.MapInfoApplication
Sub RunCommand(command As String)
Member of MapInfo.MapInfoApplication
|
|
|
Вернуться к началу |
|
|
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Сб Апр 03, 2010 2:11 pm Заголовок сообщения: |
|
|
В обоих случаях a.RunCommand или a.Eval, RunCommand и Eval is not a member of Variant - Так выдает c++ builder при компиляции.
и вариант GetObject( , "MapInfo.Application") напрямую в билдере не проходит, он пишет Expression Syntax... Использую при открытом MapInfo GetActiveOleObject. Верный вариант? В вариантную переменную "а" записывается тоже выражение {{}} как и при CreateOleObject при закрытом MapInfo. c Eval и RunCommand не ясно. |
|
Вернуться к началу |
|
|
Serj
Зарегистрирован: 25.08.2006 Сообщения: 50
|
Добавлено: Сб Апр 03, 2010 4:47 pm Заголовок сообщения: |
|
|
Все проще пареной репы:
1. Project -> Import Type Library...
Если в списке есть объект MapInfo - замечательно, если нет - говорим Add... и добавляем из папки, где лежит MapInfo либо файл MAPINFOW.TLB, а если его нет, то сам exe-юк (это зависит от версии)
2. Install - не обязательно, достаточно Create Unit. если не указано другое, то в папку CBuilder6\Imports\ положит интерфейсы и классы для доступа к MapInfo.
3. Хе! Не забываем header-ы подключить в свой проект! |
|
Вернуться к началу |
|
|
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Сб Апр 03, 2010 6:39 pm Заголовок сообщения: |
|
|
Serj писал(а): |
Все проще пареной репы:
1. Project -> Import Type Library...
|
Да, так и делал, только когда жму на клавишу Create Unit или Install, то в папке борланда в подкаталоге Import создается файл MapInfo_TLB.cpp, MapInfo_TLB.h, но никак не MapInfoW.h как во всех примерах.
Сделав #include "MapInfo_TLB.h" и прописав тип
DMapInfo a;
в этом случае возникает ошибка при компиляции, пишется
cannot create instance of abstract class 'DMapInfo'
class 'DMapInfo' is abstract because of '__stdcall IDispatch:GetTypeInfoCount(unsigned int *) = 0'
опять что-то не так |
|
Вернуться к началу |
|
|
Serj
Зарегистрирован: 25.08.2006 Сообщения: 50
|
Добавлено: Сб Апр 03, 2010 8:02 pm Заголовок сообщения: |
|
|
А в сами файлы заглянуть лень?
Пользовать надо DMapInfoDisp...
Ну, и в проект рожденные cpp не забыть подключить! |
|
Вернуться к началу |
|
|
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Сб Апр 03, 2010 8:44 pm Заголовок сообщения: |
|
|
Serj писал(а): |
А в сами файлы заглянуть лень?
Пользовать надо DMapInfoDisp...
Ну, и в проект рожденные cpp не забыть подключить! |
Спасибо за нужный ответ!
Где бы найти описалово операторов по дальнейшей работе с MapInfo из-под билдера, отсутствует CreateDispatch для запуска MapInfo, хотя в user guide по mapbasic 10 присутствует. |
|
Вернуться к началу |
|
|
Serj
Зарегистрирован: 25.08.2006 Сообщения: 50
|
Добавлено: Сб Апр 03, 2010 9:04 pm Заголовок сообщения: |
|
|
Users Guide описывает общие подходы, а дальше надо исходить от своего компилятора, и своего понимания... Опять же, заглянуть в рожденные файлы, справку по Builder поюзать... Лень матушка - уже не двигатель прогресса, а его полная остановка... )))
Ну хотя бы так...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
if (!mapinfo.IsBound()) {
if (mapinfo.Bind(WideString("MapInfo.Application")) != S_OK) {
MessageDlg("Ошибка соединения с MapInfo!!!", mtError, TMsgDlgButtons() << mbOK, 0);
Application->Terminate();
return;
}
AnsiString param = "Set Application Window ";
param += (unsigned int) Handle;
mapinfo.Do(WideString(param));
}
}
Там только рано или поздно возникнет вопрос, когда запущено несколько приложений MapInfo... Вот тут уже сложности, решаемые, но не так просто... ;))) |
|
Вернуться к началу |
|
|
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Сб Апр 03, 2010 9:16 pm Заголовок сообщения: |
|
|
Вау! Большое прибольшое спасибо! Трудности возникли, как впервые столкнулся с задачей написания приложения для MapInfo. Еще раз спасибо за необходимый толчок!! |
|
Вернуться к началу |
|
|
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Вс Апр 25, 2010 12:28 pm Заголовок сообщения: |
|
|
А если сервер, т.е. MapInfo находится на другом компе, то как с помощью CreateOleObject подсоедениться к нему по средством локальной сети или интернета?
Можно ли в CreateOleObject(server.Project3) дописать ip адрес чтоб соединиться по локалке? |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Пн Апр 26, 2010 5:53 pm Заголовок сообщения: |
|
|
Вообще-то никак. |
|
Вернуться к началу |
|
|
sitesv
Зарегистрирован: 02.04.2010 Сообщения: 9
|
Добавлено: Пн Апр 26, 2010 7:26 pm Заголовок сообщения: |
|
|
Андрей Могильный писал(а): |
Вообще-то никак. |
т.е. mapinfo, т.е. сервер должен обязательно находиться на машине, на которой есть клиентское приложение? |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Пн Апр 26, 2010 9:55 pm Заголовок сообщения: |
|
|
Да, это технология COM. Есть конечно еще и DCOM (Distributed COM), но не уверен, что MapInfo сможет в ней работать, в документации ничего про это нет. |
|
Вернуться к началу |
|
|
|