Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Общие вопросы Ирбис64 :  ИРБИС Irbis
 
Внешние функции
Пользователь: ivikis (IP-адрес скрыт)
Дата: 11, January, 2016 16:13

Не хватает опыта чтобы разобраться с вызовом функции из внешних DLL:
"Внешние функции должны ОБЯЗАТЕЛЬНО иметь следующую структуру:
(Pascal) test_function1(buf1,buf2: Pchar; bufsize: integer): integer;"
Подмогните живым примером написания простейшей функции, пожалуйста.

Re: Внешние функции
Пользователь: ivikis (IP-адрес скрыт)
Дата: 12, January, 2016 10:52

В документации читаю:

------------------------------------------------------------------
Структура форматного выхода:
&unifor('+8 <имя_DLL>,<имя_функции>,<передаваемые_данные>')

Примеры:
&unifor('+8test_dll,test_function1,',v200^a) - (в вызываемую функцию передается заглавие)
------------------------------------------------------------------

Создается впечатление, что пример не очень соответствует структуре (размещение кавычек и запятых). Прошу помощи !!!

Re: Внешние функции
Пользователь: Gena (IP-адрес скрыт)
Дата: 12, January, 2016 12:21

Пример вполне соответствует структуре, так как запятая перед "v200" не входит в передаваемые в юнифор данные - она относится к предварительному форматированию.

Пример ДЛЛ

Re: Внешние функции
Пользователь: ivikis (IP-адрес скрыт)
Дата: 12, January, 2016 12:50

Все получилось !!! Огромное спасибо за помощь.

Re: Внешние функции
Пользователь: levaleva (IP-адрес скрыт)
Дата: 09, January, 2019 08:33

А нельзя ли пример DLL на Cи? Очень бы помогло!

Re: Внешние функции
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 09, January, 2019 11:10

levaleva написал(а):
-------------------------------------------------------
> А нельзя ли пример DLL на Cи? Очень бы помогло!

Экспортируемая функция на чистом C выглядит примерно так:

__declspec(dllexport) int __cdecl TestFunction1 (char *buf1, char *buf2, int size)
{
    strcpy_s(buf2, size, buf1);
    strcat_s(buf2, size, " -> ");
    strcat_s(buf2, size, "TestFunction1");

    return 1;
}

Естественно, содержимое функции у Вас может отличаться. Как вызвать такую функцию:
&uf('+8IrbisExtension,TestFunction1,',v200^a)

Вот как это выглядит в GenPft64.exe:

http://irbis.gpntb.ru/file.php?29,file=18129

В прикрепленном файле IrbisExtension.zip проект для Visual Studio 2017 Community Edition (собирать только в режиме Win32!) и готовая DLL с экспортированной вышеозначенной функцией. Всё самое интересное см. в файле dllmain.c.



Редактировано 1 раз. Последний раз 09.01.2019 11:11 пользователем amironov73.

Вложения: IrbisExtension.png (30KB)   IrbisExtension.zip (8.9KB)  
Re: Внешние функции
Пользователь: levaleva (IP-адрес скрыт)
Дата: 09, January, 2019 11:35

Спасибо большое! Но у меня возникли проблемы с воспроизводимостью на самых ранних этапах. копирую dll в корневой каталог, запускаю GenPft64.exe, копирую unifor... и ничего.

Re: Внешние функции
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 09, January, 2019 11:46

levaleva написал(а):
-------------------------------------------------------
> Спасибо большое! Но у меня возникли проблемы с
> воспроизводимостью на самых ранних этапах. копирую
> dll в корневой каталог, запускаю GenPft64.exe,
> копирую unifor... и ничего.

Попробуйте установить Visual Studio 2017 runtime.

Кроме того, GenPft64.exe приступает к форматированию лишь тогда, когда открыта какая-нибудь база данных и выбрана одна из записей. До тех пор форматирование просто не запускается.

Re: Внешние функции
Пользователь: levaleva (IP-адрес скрыт)
Дата: 09, January, 2019 13:06

> Кроме того, GenPft64.exe приступает к
> форматированию лишь тогда, когда открыта
> какая-нибудь база данных и выбрана одна из
> записей. До тех пор форматирование просто не
> запускается.

Ну все не настолько плохо, база запись, выбраны. VS 2017 runtime установил, перезагрузил компьютер... и ничего.

При этом &uf('+8ex64,md5_string,password') из [irbis.gpntb.ru] отлично выполняется.

Re: Внешние функции
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 09, January, 2019 14:27

levaleva написал(а):
-------------------------------------------------------
> Ну все не настолько плохо, база запись, выбраны.
> VS 2017 runtime установил, перезагрузил
> компьютер... и ничего.

Какая операционная система?

Re: Внешние функции
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 09, January, 2019 14:56

Кажется, я понял свою ошибку. Я вложил в архив DLL, собранную для отладки, и она может успешно работать лишь на машинах, где установлена соответствующая версия Visual Studio. Распространять нужно DLL, собранные в конфигурации "x86-Release", тогда они должны запускаться даже на WinXP (однако, Visual Studio Redistributable package устанавливать на машинах конечных пользователей всё равно придётся).

http://irbis.gpntb.ru/file.php?29,file=18132



Редактировано 1 раз. Последний раз 09.01.2019 14:57 пользователем amironov73.

Вложения: IrbisExtension.zip (7.4KB)   WinXP.png (20.4KB)  
Re: Внешние функции
Пользователь: levaleva (IP-адрес скрыт)
Дата: 09, January, 2019 19:05

>>Распространять нужно DLL, собранные в конфигурации "x86-Release"
Несомненно, это очень важная деталь.

Во-первых, ваша dll заработала в unifor'e, во-вторых, проект вполне открылся и откомпилировался в VS 2013 (при соблюдении правила "x86-Release", конечно).

Изначально, я для чистоты опенсорса решил быстренько накидать всё в dev c++, но похоже проще перенести функцию в VS, чем договариваться с компилятором tdm-gcc.

Re: Внешние функции
Пользователь: levaleva (IP-адрес скрыт)
Дата: 05, February, 2019 13:41

Собственно, ради чего всё затевалось:
[irbis.gpntb.ru]



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.