Конференция "Corba" » Как создать объект из dll? [Delphi, Windows]
 
  • Smith © (20.06.06 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 © (20.06.06 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 © (21.06.06 08:56) [2]
    :-( 'Недопустимая строка с указанием класса'
  • Smith © (21.06.06 11:58) [3]
    1С'ники код опробовали - из 1С все работает. Устройство откликается.

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

    regsvr32 PT10.dll

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

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

    DllCanUnloadNow

    DllGetClassObject

    DllRegisterServer

    DllUnregisterServer

    Объясните почему на 1С все легко получается? Может какая-то специально заточенная под 1С библиотечка? Буду благодарен за любую помощь.
  • tesseract © (22.06.06 09:14) [4]

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

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

    Компонента 1С является COM- объектом  к которому нужно описание интерфейсов, у 1С их есть. Компоненту можно сделать стандартной OLE, но я этого например не делаю, лень .
  • Smith © (22.06.06 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 © (22.06.06 12:25) [6]
    Ну никак не пойму как PSafeArray правильно заполнить. Подскажите как тупо параметром строку 'blah-blah' передать?
  • tesseract © (22.06.06 13:05) [7]
    получение / вставка
     SafeArrayPutElement(pArray,lIndex,varPut);
     SafeArrayGetElement(pArray,lIndex,varGet);
    // сколько элементов
    result:=pArray.rgsAbound[0].cElements;
  • Smith © (22.06.06 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 © (27.06.06 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 © (27.06.06 09:16) [10]
    2 Smith ©
    Кстати,что за устройство??? А то тут у меня много всего интересного...могу поделиться ;)
  • Smith © (27.06.06 10:59) [11]
    Устройство - портативный сканер(как в супермаркетах почти) который читает штрих-код. В себе держит файлик куда строчки с цифрами под штрихкодами и пишет. К нему есть база которая с компом по COM порту соединяется. Чтобы забрать файл со сканера нужно поставить на базу сканер и 1Ской можно забирать файл. Причем в 1С все работает как написано в документации.
    Перем PT10 Экспорт;
    Если ЗагрузитьВнешнююКомпоненту("PT10.dll")=0 Тогда
    Предупреждение("Компонента не загружена");
    КонецЕсли;
    PT10 = СоздатьОбъект("AddIn.PT10");
    Если PT10.StartServer()=0 Тогда
    Сообщить("Ошибка запуска сервера");
    КонецЕсли
    Если PT10.InFile(InFileName)=0 Тогда
    Сообщить("Ошибка приема файла");
    КонецЕсли



    Причем впроцессе работы этих пары строк еще и в статус бар 1Ски "Соединение с терминалом, Терминал не подключен" хотя в коде этих строк вобще нигде нет. Получается dll'ковские методы туда пишут...
  • tesseract © (27.06.06 14:55) [12]

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

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

    И не сканер у тебя, а терминал сбора данных.
  • Smith © (27.06.06 15:24) [13]
    он самый

    Поподробней пожалуйста про монитор пирта
  • Smith © (27.06.06 15:24) [14]
    порта всмысле
  • tesseract © (28.06.06 13:55) [15]

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

    http://www.HHDsoftware.com
 
Конференция "Corba" » Как создать объект из dll? [Delphi, Windows]
Есть новые Нет новых   [119233   +58][b:0][p:0.004]