Страница 1 из 1

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

Добавлено: 31 мар 2005, 15:47
Diman
Задача: связать Гал-ку и внешнюю прогу написанную на Билдере С++.
Внешняя прога должна посылать Гал-ке сообщения (какие-либо сигналы, вызвать в Гал-ке какое-то событие) и Гал-ка должна посылать сообщения внешней проге (возможно при помощи функций содержащихся в dll).
Как кстати подключить функцию из dll в ВИПе (версия Атлантис 3).
Возможно у кого-то есть идеи как это лучше провернуть, буду признателен если вы их изложите.
Кстати нет ли у кого доки по Атлантису версии 3 (Атлантис SDK).

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

Добавлено: 31 мар 2005, 20:00
edward_K
myfunc.vpp
function GetTimeFile( string ) : time; external 'ed_func.dll';
сие компилить в проекте
в си аналогично
в делфятке так
exports
...
GetTimeFile index 4 name 'GETTIMEFILE' ,
..
;
case имеет значение здесь

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

Добавлено: 31 мар 2005, 21:05
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, но только в том случае, если запушен Ваш же интерфейс.

Вот что касается общих рассуждений, если хотите конкретики, то выкладывайте задачу :)

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

Добавлено: 04 апр 2005, 16:58
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

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

Добавлено: 04 апр 2005, 19:12
Max_Fin
читаем пункт 1) внимательно

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

Добавлено: 04 апр 2005, 20:03
Max_Fin
extern "C" int __export __pascal TESTDLL(int);

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

Добавлено: 12 апр 2005, 17:18
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

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

Добавлено: 20 апр 2005, 11:41
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-овском коде вроде все правильно.