#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 год.
Комментариев нет:
Отправить комментарий