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