Есть 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С?
Ответ
Ваша библиотека будет связующим звеном между 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();
Комментариев нет:
Отправить комментарий