-
Купили устройство к нему идет софт и dll'ка. К dll'ки идет описание для программистов 1Сников следующего содержания: Для работы с методами и атрибутами компоненты необходимо создать объект "AddIn.PT10".
Пример текста для глобального модуля:
Перем PT10 Экспорт;
Если ЗагрузитьВнешнююКомпоненту("PT10.dll")=0 Тогда
Предупреждение("Компонента не загружена");
КонецЕсли;
PT10 = СоздатьОбъект("AddIn.PT10");
3. Атрибуты компоненты.
InPath, ПутьПриема - директория на PC для приема файлов с терминала. Должен быть проинициализирован до применения методов компоненты. Значение по умолчанию - C:\PT10\In. Значение сохраняется при завершении работы с объектом компоненты.
OutPath, ПутьПосылки - директория на PC для отправки файлов на терминал. Должен быть проинициализирован до применения методов компоненты. Значение по умолчанию - C:\PT10\Out. Значение сохраняется при завершении работы с объектом компоненты.
Port, Порт - номер COM порта PC, через который производится обмен с терминалом. Должен быть проинициализирован до применения методов компоненты. Значение по умолчанию - 1. Значение сохраняется при завершении работы с объектом компоненты.
Baud, Бод - скорость обмена через COM порт. Должен быть проинициализирован до применения методов компоненты. Значение по умолчанию - 115200. Возможные значения - 2400, 4800, 9600, 19200, 38400, 57600, 115200. Значение сохраняется при завершении работы с объектом компоненты.
SelectedFile, ВыбранныйФайл - содержит имя (без пути) файла, выбранного методами компоненты SelectInFile,ВыбратьБазуЗагрузки и SelectOutFile,ВыбратьБазуВыгрузки.
3. Методы компоненты.
Запустить работу сервера обмена по COM порту
int StartServer()
int ЗапуститьСервер()
Параметр - нет;
Возвращаемое значение :
в случае успеха - 1, при ошибке - 0.
Пример использования :
Если PT10.StartServer()=0 Тогда
Сообщить("Ошибка запуска сервера");
КонецЕсли А програмку для работы с устройством нужно написать на Delphi. Подскажите как работать с этой dll'кой. Как создать этот объект AddIn.PT10 чтоб потом оперировать его методами? Раньше не приходилось работать с внешними функциями :-( Заранее спасибо.
-
если длл содержит СОМ-сервер, то сначала надо ее зарегистрировать из командной строки (не обязательно, это, в принципе, дожен делать инсталлятор) regsvr32 my.dll Из делфи использовать примерно так: var
myserv : Variant;
flag : integer;
myserv := CreateOleObject('AddIn.PT10');
if VarIsEmpty(myserv) then
ShowMessage('Не удалось создать объект')
else
begin
myserv.InPath := 'C:\In';
myserv.OutPath := 'c:\Out';
myserv.Port := 1;
myserv.Baud := 9600;
flag := myserv.StartSever;
if flag = 0 then
ShowMessage('Не удалось запустить сервер');
end;
if flag = 1 then
myserv.StopSever;
myserv := Unassigned;
-
:-( 'Недопустимая строка с указанием класса'
-
1С'ники код опробовали - из 1С все работает. Устройство откликается.
Я пытался сделать как предложил уважаемый umbra:
regsvr32 PT10.dll
myserv := CreateOleObject('AddIn.PT10');
Регистрируется но в Дельфи пишет 'Недопустимая строка с указанием класса'. Посмотрел програмкой какие функции экспортирует dll получается только:
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
Объясните почему на 1С все легко получается? Может какая-то специально заточенная под 1С библиотечка? Буду благодарен за любую помощь.
-
> Объясните почему на 1С все легко получается? Может какая- > то специально заточенная под 1С библиотечка? Буду благодарен > за любую помощь.
Не путай COM и OLE. Используй CreateCOMObject. А ещё лучше выдери описание интерфейса из сервера.
Компонента 1С является COM- объектом к которому нужно описание интерфейсов, у 1С их есть. Компоненту можно сделать стандартной OLE, но я этого например не делаю, лень .
-
Пошел таким путем...
var
V: OleVariant;
R,R2: HResult;
LE: ILanguageExtender;
i,j: Integer;
S: string;
Vv: PSafeArray;
Obj:Variant;
begin
R := CoCreateInstance(CLASS_AddIn, nil, CLSCTX_INPROC_SERVER,
IID_ILanguageExtender, LE);
if Succeeded(R) then
try
LE.FindProp('Port', i);
V:=1;
LE.SetPropVal(i, V);
LE.FindProp('Baud', i);
V:=115200;
LE.SetPropVal(i, V);
LE.FindProp('InPath', i);
V:='C:\PT10';
LE.SetPropVal(i, V);
LE.FindProp('OutPath', i);
V:='C:\PT10';
LE.SetPropVal(i, V);
LE.FindMethod('StartServer',i);
LE.CallAsFunc(i,?????)
Попробовал вроде свойства находит, методы тоже... А что дальше не знаю. Подскажите как вызвать метод с параметрами и получить результат? Никаких описаний не найду понятных :-(
-
Ну никак не пойму как PSafeArray правильно заполнить. Подскажите как тупо параметром строку 'blah-blah' передать?
-
получение / вставка SafeArrayPutElement(pArray,lIndex,varPut); SafeArrayGetElement(pArray,lIndex,varGet); // сколько элементов result:=pArray.rgsAbound[0].cElements;
-
var
V: OleVariant;
R,R2: HResult;
LE: ILanguageExtender;
i,j: Integer;
S: variant;
str:string;
idx:array[0..0] of integer;
sab: SafeArrayBound;
psa: PSafeArray;
begin
R := CoCreateInstance(CLASS_AddIn, nil, CLSCTX_INPROC_SERVER,
IID_ILanguageExtender, LE);
sab.cElements := 1;
sab.lLbound := 0;
PSA := SafeArrayCreate(VT_VARIANT, 1, sab);
idx[0] := 0;
str:='C:\PT10\';
s:=str;
SafeArrayPutElement(PSA, idx, s);
SafeArrayGetElement(PSA, idx, s);
str:=s;
ShowMessage(str);
str пустое значение. Люди добрые подскажите как правильно писать\читать из SaveArray
-
такой вот вариант извлекает из safearray в variant
function TCustomAddIn.GetNParam(var pArray : PSafeArray; lIndex: Integer ): OleVariant;
var varGet : OleVariant;
begin
SafeArrayGetElement(pArray,lIndex,varGet);
result := varGet;
end;
не забывает про vartostr !!!!!
-
2 Smith © Кстати,что за устройство??? А то тут у меня много всего интересного...могу поделиться ;)
-
Устройство - портативный сканер(как в супермаркетах почти) который читает штрих-код. В себе держит файлик куда строчки с цифрами под штрихкодами и пишет. К нему есть база которая с компом по COM порту соединяется. Чтобы забрать файл со сканера нужно поставить на базу сканер и 1Ской можно забирать файл. Причем в 1С все работает как написано в документации. Перем PT10 Экспорт;
Если ЗагрузитьВнешнююКомпоненту("PT10.dll")=0 Тогда
Предупреждение("Компонента не загружена");
КонецЕсли;
PT10 = СоздатьОбъект("AddIn.PT10");
Если PT10.StartServer()=0 Тогда
Сообщить("Ошибка запуска сервера");
КонецЕсли
Если PT10.InFile(InFileName)=0 Тогда
Сообщить("Ошибка приема файла");
КонецЕсли
Причем впроцессе работы этих пары строк еще и в статус бар 1Ски "Соединение с терминалом, Терминал не подключен" хотя в коде этих строк вобще нигде нет. Получается dll'ковские методы туда пишут...
-
> К нему есть база которая с компом по COM порту соединяется. > Чтобы забрать файл со сканера нужно поставить на базу сканер > и 1Ской можно забирать файл. Причем в 1С все работает как > написано в документации.
Я бы на твоём месте пробил протокол монитором порта.
И не сканер у тебя, а терминал сбора данных.
-
он самый
Поподробней пожалуйста про монитор пирта
-
порта всмысле
-
|