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

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

Добавлено: 21 апр 2008, 09:23
Ренат
Доброго всем времени суток.
Есть желание использовать БД находящиюся на 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
Скажите пожалуйста что я делаю не правильно!
Спасибо.

Добавлено: 21 апр 2008, 09:53
Ренат
Галаткика 8.10

Версия продукта: Support 5.3.14
Версия инструментария: Atlantis 5.3.14

Добавлено: 21 апр 2008, 10:13
edward_K
не пробовал в 810. в 712 так в dpr
exports
Function name 'FUNCTION'
;
верхний регистр обязателен.
регистрация для vip должна быть такая
Function Function(var anytype ) : ???? ; external 'dll.dll' ;
а за соответсвием типов следите сами.
для начала попробуйте без var

Добавлено: 21 апр 2008, 10:28
Евгений

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

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.

Добавлено: 21 апр 2008, 11:56
Ренат
Видимо все дело было в строке
stdcall;
Если ее убрать, то все начинает работать.
Всем большое спасибо за помощь. :cool:

Добавлено: 28 апр 2008, 12:38
Алексей
Если в випе боле менее понятно как подключать ДЛЛ, то как подключить ДЛЛ к Галактике так, чтобы эта функция стала доступной при конфигурировании интерфейсов?

Добавлено: 28 апр 2008, 17:57
edward_K
читайте alter :) , да и тема была про добавление кнопок.

Добавлено: 29 апр 2008, 08:13
Алексей
edward_K это не ответ :)
зачем мне альтер, если достаточно мелкую ЦНФ сделать и там вписать функцию. Вопрос как раз и состоит в том, как заставить галактику подцепить указанную ДЛЛ при запуске.

Добавлено: 29 апр 2008, 11:11
edward_K
:). Для того чтобы свою функцию использовать в cnf вам нужно galnet.exe пересобрать. Через alter вы ее можете вызвать например в каком нибудь событии - типа cmIdle - и запомнить результат в какую нибудь переменную. Ну либ в cmValue50 а в cnf вызывать if(PutCommand(12238),'','')+имя переменной.

Добавлено: 06 май 2008, 05:25
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 ...

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