Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Как создать объект из dll?   Найти похожие ветки 

 
Smith ©   (2006-06-20 17:51) [0]

Купили устройство к нему идет софт и 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 чтоб потом оперировать его методами? Раньше не приходилось работать с внешними функциями :-( Заранее спасибо.


 
umbra ©   (2006-06-20 19:00) [1]

если длл содержит СОМ-сервер, то сначала надо ее зарегистрировать из командной строки (не обязательно, это, в принципе, дожен делать инсталлятор)
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;


 
Smith ©   (2006-06-21 08:56) [2]

:-( "Недопустимая строка с указанием класса"


 
Smith ©   (2006-06-21 11:58) [3]

1С"ники код опробовали - из 1С все работает. Устройство откликается.

Я пытался сделать как предложил уважаемый umbra:

regsvr32 PT10.dll

myserv := CreateOleObject("AddIn.PT10");

Регистрируется но в Дельфи пишет "Недопустимая строка с указанием класса". Посмотрел програмкой какие функции экспортирует dll получается только:

DllCanUnloadNow

DllGetClassObject

DllRegisterServer

DllUnregisterServer

Объясните почему на 1С все легко получается? Может какая-то специально заточенная под 1С библиотечка? Буду благодарен за любую помощь.


 
tesseract ©   (2006-06-22 09:14) [4]


> Объясните почему на 1С все легко получается? Может какая-
> то специально заточенная под 1С библиотечка? Буду благодарен
> за любую помощь.

Не путай COM и OLE.
Используй CreateCOMObject. А ещё лучше выдери описание интерфейса из сервера.

Компонента 1С является COM- объектом  к которому нужно описание интерфейсов, у 1С их есть. Компоненту можно сделать стандартной OLE, но я этого например не делаю, лень .


 
Smith ©   (2006-06-22 12:14) [5]

Пошел таким путем...

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,?????)

Попробовал вроде свойства находит, методы тоже...
А что дальше не знаю. Подскажите как вызвать метод с параметрами и получить результат? Никаких описаний не найду понятных :-(


 
Smith ©   (2006-06-22 12:25) [6]

Ну никак не пойму как PSafeArray правильно заполнить. Подскажите как тупо параметром строку "blah-blah" передать?


 
tesseract ©   (2006-06-22 13:05) [7]

получение / вставка
 SafeArrayPutElement(pArray,lIndex,varPut);
 SafeArrayGetElement(pArray,lIndex,varGet);
// сколько элементов
result:=pArray.rgsAbound[0].cElements;


 
Smith ©   (2006-06-22 16:44) [8]


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


 
tesseract ©   (2006-06-27 00:23) [9]

такой вот вариант извлекает из safearray в variant

function TCustomAddIn.GetNParam(var pArray : PSafeArray; lIndex: Integer ): OleVariant;
var varGet : OleVariant;
begin
  SafeArrayGetElement(pArray,lIndex,varGet);
  result := varGet;
end;


не забывает про vartostr !!!!!


 
GanibalLector ©   (2006-06-27 09:16) [10]

2 Smith ©
Кстати,что за устройство??? А то тут у меня много всего интересного...могу поделиться ;)


 
Smith ©   (2006-06-27 10:59) [11]

Устройство - портативный сканер(как в супермаркетах почти) который читает штрих-код. В себе держит файлик куда строчки с цифрами под штрихкодами и пишет. К нему есть база которая с компом по COM порту соединяется. Чтобы забрать файл со сканера нужно поставить на базу сканер и 1Ской можно забирать файл. Причем в 1С все работает как написано в документации.
Перем PT10 Экспорт;
Если ЗагрузитьВнешнююКомпоненту("PT10.dll")=0 Тогда
Предупреждение("Компонента не загружена");
КонецЕсли;
PT10 = СоздатьОбъект("AddIn.PT10");
Если PT10.StartServer()=0 Тогда
Сообщить("Ошибка запуска сервера");
КонецЕсли
Если PT10.InFile(InFileName)=0 Тогда
Сообщить("Ошибка приема файла");
КонецЕсли


Причем впроцессе работы этих пары строк еще и в статус бар 1Ски "Соединение с терминалом, Терминал не подключен" хотя в коде этих строк вобще нигде нет. Получается dll"ковские методы туда пишут...


 
tesseract ©   (2006-06-27 14:55) [12]


> К нему есть база которая с компом по COM порту соединяется.
>  Чтобы забрать файл со сканера нужно поставить на базу сканер
> и 1Ской можно забирать файл. Причем в 1С все работает как
> написано в документации.

Я бы на твоём месте пробил протокол монитором порта.

И не сканер у тебя, а терминал сбора данных.


 
Smith ©   (2006-06-27 15:24) [13]

он самый

Поподробней пожалуйста про монитор пирта


 
Smith ©   (2006-06-27 15:24) [14]

порта всмысле


 
tesseract ©   (2006-06-28 13:55) [15]


> порта всмысле

http://www.HHDsoftware.com



Страницы: 1 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
2-1226240731
Fresh
2008-11-09 17:25
2008.12.21
Подлый PaintBox


1-1204908815
Воронтсов
2008-03-07 19:53
2008.12.21
работа с TOpenDialog


2-1226510112
art
2008-11-12 20:15
2008.12.21
Помогите переделать задачу из Pascal в Delphi


9-1176310237
Evgraf
2007-04-11 20:50
2008.12.21
Что такое DXUT?


2-1226438665
АлексейН
2008-11-12 00:24
2008.12.21
чтение из столбцов