Как корректно подключить DLL в vip файле

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

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

Ответить
Ренат
Постоянный обитатель
Сообщения: 194
Зарегистрирован: 12 сен 2007, 16:34
Откуда: Глазов
Контактная информация:

Как корректно подключить DLL в vip файле

Сообщение Ренат »

Доброго всем времени суток.
Есть желание использовать БД находящиюся на MS SQL Server.
В связи с этим решил что это можно будет сделать с исользованием DLL написаных на Delphi.
Написал в Delphi для начала такую DLL-ку

Код: Выделить всё

library checkKontr;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes,
  Dialogs;

{$R *.res}

Function UMNOG_NA_DVA(var x:integer):integer;
export;
stdcall;
begin
  x:=x*2;
  UMNOG_NA_DVA:=1;
end;

exports UMNOG_NA_DVA;
begin
end.
Теперь пишу vip файл и подключаю к нему эту DLL

Код: Выделить всё

Function UMNOG_NA_DVA(LongInt):LongInt; external 'CHECKKONTR.dll#UMNOG_NA_DVA';

interface  for_dll 'Проверка функций работы с DLL';
create view
var num1:LongInt;
    num2:LongInt;
as select * from katmc;

screen dll_call;
fields
  num1,noprotect;
  num2;
buttons
  cmButton1;
<<
  x = .@@@@@@@@@@@   x*2 = .@@@@@@@@@@@@@@@@
  <.Вычислить.>
>>
end; //screen

HandleEvent
  Cmbutton1:{
          Message(string(num1)+'*2='+string(UMNOG_NA_DVA(num1)))
  };
end; //hanlde
end. //interface
При компиляции сообщений об ошибках не выдается.
Но при попытке расчитать выражение по кнопке "Cmbutton1"
выскакивает окно с сообщением

Код: Выделить всё

 Runtime error 216 (rtl: попытка обращения к неверному дескриптору) in CHECKKONTR.dll at 0004c626
Скажите пожалуйста что я делаю не правильно!
Спасибо.
Ренат
Постоянный обитатель
Сообщения: 194
Зарегистрирован: 12 сен 2007, 16:34
Откуда: Глазов
Контактная информация:

Сообщение Ренат »

Галаткика 8.10

Версия продукта: Support 5.3.14
Версия инструментария: Atlantis 5.3.14
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

не пробовал в 810. в 712 так в dpr
exports
Function name 'FUNCTION'
;
верхний регистр обязателен.
регистрация для vip должна быть такая
Function Function(var anytype ) : ???? ; external 'dll.dll' ;
а за соответсвием типов следите сами.
для начала попробуйте без var
Евгений
Посетитель
Сообщения: 41
Зарегистрирован: 25 авг 2005, 09:50

Сообщение Евгений »

Код: Выделить всё

library CheckKontr;

  function UMNOG_NA_DVA(X: Integer): Integer;
  begin
    Result := X*2;
  end;

exports
  UMNOG_NA_DVA index 1 name 'MYFUNC';
  
begin
end.

Код: Выделить всё

function Umnog(Integer): Integer; external 'CheckKontr.dll#MYFUNC';

Interface ExamDll;
  create view;


  procedure MyMain;
  begin
    Message('2*3='+String(Umnog(3)),cmOk);
    Abort;
  end;

  HandleEvent
    cmInit:
      MyMain;
 end;
end.
Ренат
Постоянный обитатель
Сообщения: 194
Зарегистрирован: 12 сен 2007, 16:34
Откуда: Глазов
Контактная информация:

Сообщение Ренат »

Видимо все дело было в строке
stdcall;
Если ее убрать, то все начинает работать.
Всем большое спасибо за помощь. :cool:
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Если в випе боле менее понятно как подключать ДЛЛ, то как подключить ДЛЛ к Галактике так, чтобы эта функция стала доступной при конфигурировании интерфейсов?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

читайте alter :) , да и тема была про добавление кнопок.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

edward_K это не ответ :)
зачем мне альтер, если достаточно мелкую ЦНФ сделать и там вписать функцию. Вопрос как раз и состоит в том, как заставить галактику подцепить указанную ДЛЛ при запуске.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

:). Для того чтобы свою функцию использовать в cnf вам нужно galnet.exe пересобрать. Через alter вы ее можете вызвать например в каком нибудь событии - типа cmIdle - и запомнить результат в какую нибудь переменную. Ну либ в cmValue50 а в cnf вызывать if(PutCommand(12238),'','')+имя переменной.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Исходная функция ни под каким соусом не заработала бы, т.к. для передачи var-параметров vip использует указатели на объекты типа TField, т.е. PField-ы:

Код: Выделить всё


uses
  AtFields;

Function UMNOG_NA_DVA(F: PField): integer; 
begin 
  F.IPut(F.IValue * 2);

  Result := 1; 
end;
...
exports
  UMNOG_NA_DVA name 'UMNOG_NA_DVA';

...

function UMNOG_NA_DVA(var X: integer): integer; external ...
Виталий
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Screw это понятно, что она бы не заработала, т.к. ДЛЛ не подключена к общей системе. вопрос как раз в том и состоит, как подключить разработанную собственную длл в общую систему галактики,чтобы по Ctrl+F4 можно было в окно написать ей функцию и она бы вернула результат, тогда её можно использовать в конфигурировании.
Ответить