Связать Гал-ку и внеш. прогу?

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Diman
Постоянный гость
Сообщения: 56
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Волгоград Филиал ОАО "Связьтранснефть" НВ ПТУС отдел ОИТ

Связать Гал-ку и внеш. прогу?

Сообщение Diman »

Задача: связать Гал-ку и внешнюю прогу написанную на Билдере С++.
Внешняя прога должна посылать Гал-ке сообщения (какие-либо сигналы, вызвать в Гал-ке какое-то событие) и Гал-ка должна посылать сообщения внешней проге (возможно при помощи функций содержащихся в dll).
Как кстати подключить функцию из dll в ВИПе (версия Атлантис 3).
Возможно у кого-то есть идеи как это лучше провернуть, буду признателен если вы их изложите.
Кстати нет ли у кого доки по Атлантису версии 3 (Атлантис SDK).
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Связать Гал-ку и внеш. прогу?

Сообщение edward_K »

myfunc.vpp
function GetTimeFile( string ) : time; external 'ed_func.dll';
сие компилить в проекте
в си аналогично
в делфятке так
exports
...
GetTimeFile index 4 name 'GETTIMEFILE' ,
..
;
case имеет значение здесь
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Связать Гал-ку и внеш. прогу?

Сообщение Max_Fin »

1) не забывать об особенностях передачи данных через стек (обязательно указать, что Паскаль)
2) учитывать, что в Галактике применяются только несколько стандартных типов данных, причем особенно - строка "ПАСКАЛЕВСКАЯ"
3) по поводу dll
3.1) пишется обычным образом, с учетом перечисленных особенностей
обязательно обрабатывать внутри dll все исключительные ситуации, иначе Галактика будет "падать"
не знаю как у кого, но я так и не смог добиться чтобы строка, используемая в параметре, возвращалась Галактике, Галка умирает хоть убей, приходилось возвращать функцией. это особенно плохо, когда необходимо вернуть несколько строк
3.2) написать inc
в котором будут описаны фукнции dll, например
function MyFunc(Word, Byte, String): String; external 'mydll.dll';
3.3) соответсвенно подключить в проект Галактики созданный inc-файл, написать интрефейс в Галактике, в котором будут использоваться функции dll
4) по поводу того, что внешяя прога будет посылать сигналы Галактики, тут нужно понять что Вы под этим понимаете, т.к. Галактика сама по себе не может принимать какие-либо сигналы, можно конечно реализовать вызовы опять таки через функции Вашей dll, но только в том случае, если запушен Ваш же интерфейс.

Вот что касается общих рассуждений, если хотите конкретики, то выкладывайте задачу :)
Жду выхода Вселенная 2.12!
Diman
Постоянный гость
Сообщения: 56
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Волгоград Филиал ОАО "Связьтранснефть" НВ ПТУС отдел ОИТ

Re: Связать Гал-ку и внеш. прогу?

Сообщение Diman »

dll выглядит так:

extern "C" int __export TESTDLL(int);

int TESTDLL(int test)
{
ShowMessage(IntToStr(test));
return -test;
}

к галактике подключаем

function TESTDLL(integer):integer; external 'testdll.dll';

При попытке вызова пишет - Функция TESTDLL в testdll.dll не найдена.

Чего неправильного?
dll компилирую под builder 6.0
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Связать Гал-ку и внеш. прогу?

Сообщение Max_Fin »

читаем пункт 1) внимательно
Жду выхода Вселенная 2.12!
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Связать Гал-ку и внеш. прогу?

Сообщение Max_Fin »

extern "C" int __export __pascal TESTDLL(int);
Жду выхода Вселенная 2.12!
Diman
Постоянный гость
Сообщения: 56
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Волгоград Филиал ОАО "Связьтранснефть" НВ ПТУС отдел ОИТ

Re: Связать Гал-ку и внеш. прогу?

Сообщение Diman »

Исходники функции выглядят так:
extern "C" int __pascal __export TESTDLL(int test)
{
return 100;
};

К Галактике подключаю так:
function TESTDLL(longint):longint; external 'project1.dll';

Используем так:
...
create view
var
win1 : longint;
win2 : longint;
...
win2:=TESTDLL(longint(win1));

В результате выводя win2 на экран видим одно и то-же число 10575 :(
Причем пробовали различные варианты возвращаемых типов как в C, так и в VIP.

Какое место кода написанно неправильно?
Help plz
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Re: Связать Гал-ку и внеш. прогу?

Сообщение KATZ »

При вызове внешних функций "Галактика" передает им параметры по соглашению __fastcall (по крайней мере, в версиях 5.85.02, 7.11 и 7.12 это так; возможно, в более ранних версиях было по-другому).

Отсюда следует:

1. При написании собственных DLL на C следует использовать компилятор от Борланда, т. к. __fastcall в Микрософт VC++ работает иначе (использует только 2 регистра, а не 3), и подстроить DLL на VC++ под "Галактику" представляется весьма проблематичным.

2. При использовании соглашения __fastcall Борландовский компилятор автоматически добавляет к имени функции спереди символ "@", поэтому, чтобы "Галактика" видела функцию под оригинальным именем, придется при компоновке использовать DEF-файл и в нем (в секции EXPORTS) переопределить имя функции, например, так:
EXPORTS TESTDLL=@TestDLL

Соответственно, код на C мог бы выглядеть, к примеру, следующим образом:
extern "C" int __fastcall TestDLL(int test)
{
return 100;
};

В VIP-овском коде вроде все правильно.
Ответить