Связать Гал-ку и внеш. прогу?
Модераторы: m0p3e, edward_K, Модераторы
-
- Постоянный гость
- Сообщения: 56
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Волгоград Филиал ОАО "Связьтранснефть" НВ ПТУС отдел ОИТ
Связать Гал-ку и внеш. прогу?
Задача: связать Гал-ку и внешнюю прогу написанную на Билдере С++.
Внешняя прога должна посылать Гал-ке сообщения (какие-либо сигналы, вызвать в Гал-ке какое-то событие) и Гал-ка должна посылать сообщения внешней проге (возможно при помощи функций содержащихся в dll).
Как кстати подключить функцию из dll в ВИПе (версия Атлантис 3).
Возможно у кого-то есть идеи как это лучше провернуть, буду признателен если вы их изложите.
Кстати нет ли у кого доки по Атлантису версии 3 (Атлантис SDK).
Внешняя прога должна посылать Гал-ке сообщения (какие-либо сигналы, вызвать в Гал-ке какое-то событие) и Гал-ка должна посылать сообщения внешней проге (возможно при помощи функций содержащихся в dll).
Как кстати подключить функцию из dll в ВИПе (версия Атлантис 3).
Возможно у кого-то есть идеи как это лучше провернуть, буду признателен если вы их изложите.
Кстати нет ли у кого доки по Атлантису версии 3 (Атлантис SDK).
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Связать Гал-ку и внеш. прогу?
myfunc.vpp
function GetTimeFile( string ) : time; external 'ed_func.dll';
сие компилить в проекте
в си аналогично
в делфятке так
exports
...
GetTimeFile index 4 name 'GETTIMEFILE' ,
..
;
case имеет значение здесь
function GetTimeFile( string ) : time; external 'ed_func.dll';
сие компилить в проекте
в си аналогично
в делфятке так
exports
...
GetTimeFile index 4 name 'GETTIMEFILE' ,
..
;
case имеет значение здесь
-
- На пенсии
- Сообщения: 797
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: г. Тюмень
- Контактная информация:
Re: Связать Гал-ку и внеш. прогу?
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) учитывать, что в Галактике применяются только несколько стандартных типов данных, причем особенно - строка "ПАСКАЛЕВСКАЯ"
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!
-
- Постоянный гость
- Сообщения: 56
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Волгоград Филиал ОАО "Связьтранснефть" НВ ПТУС отдел ОИТ
Re: Связать Гал-ку и внеш. прогу?
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
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
-
- На пенсии
- Сообщения: 797
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: г. Тюмень
- Контактная информация:
Re: Связать Гал-ку и внеш. прогу?
extern "C" int __export __pascal TESTDLL(int);
Жду выхода Вселенная 2.12!
-
- Постоянный гость
- Сообщения: 56
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Волгоград Филиал ОАО "Связьтранснефть" НВ ПТУС отдел ОИТ
Re: Связать Гал-ку и внеш. прогу?
Исходники функции выглядят так:
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
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
Re: Re: Связать Гал-ку и внеш. прогу?
При вызове внешних функций "Галактика" передает им параметры по соглашению __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-овском коде вроде все правильно.
Отсюда следует:
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-овском коде вроде все правильно.