Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

Как создать объект из 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 вся ветка

Форум: "Corba";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.043 c
15-1224514064
GrayFace
2008-10-20 18:47
2008.12.21
Как проследить, какие программы гоняют пакеты?


2-1226410134
***mikle***
2008-11-11 16:28
2008.12.21
сбивается указатель


3-1211369795
Leo
2008-05-21 15:36
2008.12.21
Использование переменной внутри запроса.


2-1226327058
Andrey_ka
2008-11-10 17:24
2008.12.21
работа с памятью


15-1224158164
axis_of_evil
2008-10-16 15:56
2008.12.21
право на downgrade ..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский