Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Создание dll для 1С

#delphi #dll #1с


Есть dll без исходников, для нее есть интерфейс на delphi. Стоит задача подружить
эту библиотеку с 1С. На сколько понял с прочитанного в интернете, на основе интерфейса
можно сделать dll по COM технологии.

Пример интерфейса:

 unit Unit1;
    interface

    uses Windows,
      Messages,
      Classes,
      SysUtils,
      Forms;


type 
    TBonusCountersPrintQuery = packed record
        Card: array[0..15] of char;
    end;

    TListCountersPrint = packed record         
        Lines: array[0..PACKET_COUNTERS_PR_MAX_LINE_COUNT - 1] of TCounterLine;
    end;

    TCounterLine = packed record
        LineNo: word;
        IsLast: byte;
        Num_Counter: word;
        N_Counter: array[0..9] of char;
        Value_Counter: Cardinal;
    end;

type
    THWE_ProcessBonusListCountersPrint = function(vBonusCountersPrintQuery: TBonusCountersPrintQuery;
var vListCountersPrint: TListCountersPrint): Integer; stdcall;

function ProcessBonusListCountersPrint(vBonusCountersPrintQuery: TBonusCountersPrintQuery;
var vListCountersPrint: TListCountersPrint): Integer; stdcall;

implementation

var
    HWE_ProcessBonusListCountersPrint          : THWE_ProcessBonusListCountersPrint;

function init_dynamic(ALibrary: string): Boolean;
begin
  hLib := SafeLoadLibrary(ALibrary);

  Result := (hLib <> 0);

  if Result then
  begin

    @HWE_ProcessBonusListCountersPrint := GetProcAddress(hLib, 'ProcessBonusListCountersPrint');

    Result := Assigned(HWE_ProcessBonusListCountersPrint);
  end;
end;

function ProcessBonusListCountersPrint(vBonusCountersPrintQuery: TBonusCountersPrintQuery;
var vListCountersPrint: TListCountersPrint): Integer;
begin
  result := HW_FAILURE;
  if hLib <> 0 then result := HWE_ProcessBonusListCountersPrint(vBonusCountersPrintQuery,
vListCountersPrint);
end;

initialization

finalization

end.


Как правильно написать такую dll, чтобы функция из примера была доступна из 1С?
    


Ответы

Ответ 1



Ваша библиотека будет связующим звеном между 1C и сторонней библиотекой без исходного кода: 1C -> ВашаБиблиотекаCOM -> СтороняяБиблиотека То, что вы описали - попытка реализовать связь: ВашаComБиблиотека -> СтороняяБиблиотека Осталось реализовать связь между 1C и вашей библиотекой. Чтобы начать разработку библиотеки по технологии COM в Delphi нужно выбрать: File -> New -> Other и там найти ActiveX Library, новый проект будет выглядить приблизительно так: Далее к проекту добавить COM-сервер: File -> New -> Other и найти COM Object, выглядеть в новых версиях Delphi будет как-то так: В старых версиях Delphi так: В полях ClassName (CoClassName) нужно ввести английское название, по которому 1C и будет загружать вашу библиотеку после регистрации в системе, например: MaximLibrary1C Подробнее о пошаговом создании COM-библиотеки можете почитать здесь: http://www.introligator.org/articles/3/78 После написания прослойки (куда вы перенесете свой вышеописанный код) и окончания разработки на целевой машине вашу новую .dll нужно зарегистрировать в системе, как-то так: regsvr32 c:\Library\Project1.dll Конечно, имя проекта лучше задать более вменяемое, а не Project1. На машине с Delphi зарегистрировать можно из среды в меню "Run". Из самой 1C вашу библиотеку после регистрации в системе можно будет загружать как-то так: МояБиблиотека = Новый COMОбъект("MaximLibrary1C"); // вызываем метод в библиотеке МояБиблиотека.1C_ProcessBonusListCountersPrint();

Ответ 2



Попробуйте технологию Native API – собственный интерфейс системного программирования 1С:Предприятия 8. 1CNativeLib - библиотека Delphi для создания внешних компонент (ВК) 1С по технологии Native API. Позволяет заниматься непосредственно функционалом Внешней Компоненты, не отвлекаясь на соблюдение инструкций, предоставленных фирмой 1С. Внешняя компонента NativeAPI на Delphi Инфостарт Внешняя компонента собранная на библиотеке, указанной вше

Ответ 3



Проблема решена. Очень помогла книга "Delphi и 1С - Предприятие. Программирование информационного обмена" Попов С.А. 2007 год.

Комментариев нет:

Отправить комментарий