Конференция "Corba" » Эксель как COM-сервер и tlb обертка к нему
 
  • _drug_ (16.06.09 12:53) [0]
    Здравствуйте!
    Работал на 6ых делфях, после долгого перерыва пришлось вернуться к кодированию, под рукой была Делфя 8ая (хотя в Help/About пишет version 7.1.1446.610? ), поставил. Задача - оформлять отчеты в экселе используя COM. Проблема: я подключаюсь к серверу:


    var
     IExcel: IInterface;
     ClassID: GUID;
    begin
     ClassID := ProgIDToClassID('Excel.Application.12');
     IExcel := CreateComObject( ClassID );



    Чтобы воспользоваться сервером, нужно подключить файл с описанием интерфейса типа bla-bla_tlb.pas. НО!
    Импорта библиотеки типа (Project/Import type library) в моих делфях нет, утилиты tlibimp.exe тоже. Есть только возможность добавить ссылку (Project/Add reference), но после добавления при компиляции выдает ошибку, что не может найти файлы, которые были созданы при добавлении - в общем, я не понял, как пользоваться этой фичей. Я уже весь мозг изломал. Скачал, кое-как нашев, утилиту tlibimp.exe, так она потребовала библиотеки от другой версии делфей, не получилось. Краткое резюме:
    1. Как после создания com-сервера собственно им воспользоваться без tlb файла?
    2. Как можно создать этот tlb файл не имея tlibimp.exe и импорта в самой IDE?
    3. Насколько Делфи 8 удобна в работе? Нет ли смысла поменять ее на более новую версию? На предыдущую не получиться - проект не хочется переделывать. Или может патчи есть?
  • clickmaker © (17.06.09 11:08) [1]
    1.
    var
     Excel: Variant;

    Excel := CreateComObject( ClassID );
    Excel.SomeMethod

    только про автокомплит придется забыть, и компилятор по рукам не даст, если параметры не так укажешь.
    Зато в какой-то степени решается вопрос о совместимости версий
  • _drug_ (17.06.09 12:24) [2]
    Делал. Матерится на строку
    Excel := CreateComObject( ClassID );
    таким матом
    Incompatible types: 'Variant' and 'Object'

    По исходникам у меня функция CreateComObject возвращает значение Object. Я уже весь мозг себе переломал. Дошел до стадии, что Делфя 8ая какая-то не такая, потому что в ней просто отсутствуют вещи, которые есть в предыдущих версиях и в последующих, а в ней (по крайней мере у меня) их нет. Я имею в виду импорт библиотек типов, IDispatch, CreateOleObject и еще ряд моментов.
  • Сергей М. © (17.06.09 19:58) [3]
    Работа с Ёхелем через OLE совсем-совсем не годится ?
    Она не требует библ-ки типов ..
  • clickmaker © (18.06.09 10:54) [4]
    и неужели какой-нибудь ExcelXP.pas от семерки совсем-совсем не подходит?
  • _drug_ (18.06.09 11:43) [5]

    > Работа с Ёхелем через OLE совсем-совсем не годится ?
    > Она не требует библ-ки типов ..

    Имеется в виду CreateOleObject(...)? Не получается - этой функции в исходниках нет вообще, я выше писал.


    > и неужели какой-нибудь ExcelXP.pas от семерки совсем-совсем
    > не подходит?

    Нет у меня 7. :( Может кинет мне кто на мыло exel2007.pas? drug2004(at)bk.ru
  • Palladin © (18.06.09 12:53) [6]
    Делфи8 это мертворожденный продукт заточенный под разработку для .NET, я не понял, чего ты там пырхаешься с Win32? выбрось каку.
  • Сергей М. © (18.06.09 13:59) [7]

    > этой функции в исходниках нет вообще


    CreateComObject есть, а  CreateOleObject нет ? Не верю. Они рядышком объявнены в ComObj.pas
  • _drug_ (19.06.09 07:02) [8]

    > Делфи8 это мертворожденный продукт заточенный под разработку
    > для .NET, я не понял, чего ты там пырхаешься с Win32? выбрось
    > каку.

    вот у меня такая мысль давно возникла, но я подумал, может где-то я ошибаюсь? Видимо нет.

    > CreateComObject есть, а  CreateOleObject нет ? Не верю.
    > Они рядышком объявнены в ComObj.pas

    В том то и дело, что объявлена только CreateComObject! Что подтверждает мои мысли и слова Palladin'а - я мало того, что самостоятельно не смог разобраться (хелп вообще никакой), так еще и ни один(!) пример из инета не пошел. Я ж говорю, всю голову сломал себе.
    В общем, буду менять версию, буду искать что лучше поставить, но это тема уже другого топика.
  • Сергей М. © (19.06.09 08:46) [9]

    > В том то и дело, что объявлена только CreateComObject


    Ну а что мешает самостоятельно взять да объявить CreateOleObject ?
    Там всего-то две строчки кода:

    function CreateOleObject(const ClassName: string): IDispatch;
    var
     ClassID: TCLSID;
    begin
     ClassID := ProgIDToClassID(ClassName);
     OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
       CLSCTX_LOCAL_SERVER, IDispatch, Result));
    end;

  • _drug_ (19.06.09 09:40) [10]

    > Ну а что мешает самостоятельно взять да объявить CreateOleObject
    > ?
    > Там всего-то две строчки кода:
    >
    > function CreateOleObject(const ClassName: string): IDispatch;
    >
    > var
    >  ClassID: TCLSID;
    > begin
    >  ClassID := ProgIDToClassID(ClassName);
    >  OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER
    > or
    >    CLSCTX_LOCAL_SERVER, IDispatch, Result));
    > end;

    В том то и дело, что в исходниках нет такого интерфейса IDispatch!!!
    Об этом я тоже писал. Не объявляеть же мне и его?
    Такое впечатление, что эта версия какая-то не такая.
  • Сергей М. © (19.06.09 11:35) [11]

    > в исходниках нет такого интерфейса IDispatch!!!
    > Об этом я тоже писал. Не объявляеть же мне и его?


    Почему бы и нет ? Хотя бы для пробы ?

     IDispatch = interface(IUnknown)
       ['{00020400-0000-0000-C000-000000000046}']
       function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
       function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
       function GetIDsOfNames(const IID: TGUID; Names: Pointer;
         NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
       function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
         Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
     end;

  • _drug_ (22.06.09 12:35) [12]

    > > в исходниках нет такого интерфейса IDispatch!!!
    > > Об этом я тоже писал. Не объявляеть же мне и его?
    >
    >
    > Почему бы и нет ? Хотя бы для пробы ?

    Я уже снес делфи 8ые, но решил попробовать все-таки:
    Попробовал - похоже на извращение, IUnknown нет, тоже объявил, так компилятор не может из интерфейса его GUID извлечь и в результате ругается на строку:

    OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
      CLSCTX_LOCAL_SERVER, IDispatch, Result));


    Типа IDispatch и GUID несовместимые типы. Я уже в тупую туда подставил GUID, но при вызове функция ругается, что Error: Signature has invalid calling convention = 0x.
    В общем ерунда получается, поставлю лучше просто нормальную версию делфей.
  • _drug_ (24.06.09 09:09) [13]
    Поставил Делфи 2007 - после переноса кода ВСЕ работает сразу. Прямо сплошное удовольствие какое-то.
 
Конференция "Corba" » Эксель как COM-сервер и tlb обертка к нему
Есть новые Нет новых   [118580   +29][b:0][p:0.001]