-
Здравствуйте! Работал на 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 удобна в работе? Нет ли смысла поменять ее на более новую версию? На предыдущую не получиться - проект не хочется переделывать. Или может патчи есть?
-
1. var Excel: Variant;
Excel := CreateComObject( ClassID ); Excel.SomeMethod
только про автокомплит придется забыть, и компилятор по рукам не даст, если параметры не так укажешь. Зато в какой-то степени решается вопрос о совместимости версий
-
Делал. Матерится на строку Excel := CreateComObject( ClassID ); таким матом Incompatible types: 'Variant' and 'Object'
По исходникам у меня функция CreateComObject возвращает значение Object. Я уже весь мозг себе переломал. Дошел до стадии, что Делфя 8ая какая-то не такая, потому что в ней просто отсутствуют вещи, которые есть в предыдущих версиях и в последующих, а в ней (по крайней мере у меня) их нет. Я имею в виду импорт библиотек типов, IDispatch, CreateOleObject и еще ряд моментов.
-
Работа с Ёхелем через OLE совсем-совсем не годится ? Она не требует библ-ки типов ..
-
и неужели какой-нибудь ExcelXP.pas от семерки совсем-совсем не подходит?
-
> Работа с Ёхелем через OLE совсем-совсем не годится ? > Она не требует библ-ки типов ..
Имеется в виду CreateOleObject(...)? Не получается - этой функции в исходниках нет вообще, я выше писал.
> и неужели какой-нибудь ExcelXP.pas от семерки совсем-совсем > не подходит?
Нет у меня 7. :( Может кинет мне кто на мыло exel2007.pas? drug2004(at)bk.ru
-
Делфи8 это мертворожденный продукт заточенный под разработку для .NET, я не понял, чего ты там пырхаешься с Win32? выбрось каку.
-
> этой функции в исходниках нет вообще
CreateComObject есть, а CreateOleObject нет ? Не верю. Они рядышком объявнены в ComObj.pas
-
> Делфи8 это мертворожденный продукт заточенный под разработку > для .NET, я не понял, чего ты там пырхаешься с Win32? выбрось > каку.
вот у меня такая мысль давно возникла, но я подумал, может где-то я ошибаюсь? Видимо нет.
> CreateComObject есть, а CreateOleObject нет ? Не верю. > Они рядышком объявнены в ComObj.pas
В том то и дело, что объявлена только CreateComObject! Что подтверждает мои мысли и слова Palladin'а - я мало того, что самостоятельно не смог разобраться (хелп вообще никакой), так еще и ни один(!) пример из инета не пошел. Я ж говорю, всю голову сломал себе. В общем, буду менять версию, буду искать что лучше поставить, но это тема уже другого топика.
-
> В том то и дело, что объявлена только 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;
-
> Ну а что мешает самостоятельно взять да объявить 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!!! Об этом я тоже писал. Не объявляеть же мне и его? Такое впечатление, что эта версия какая-то не такая.
-
> в исходниках нет такого интерфейса IDispatch!!! > Об этом я тоже писал. Не объявляеть же мне и его?
Почему бы и нет ? Хотя бы для пробы ? IDispatch = interface(IUnknown)
['']
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;
-
> > в исходниках нет такого интерфейса 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. В общем ерунда получается, поставлю лучше просто нормальную версию делфей.
-
Поставил Делфи 2007 - после переноса кода ВСЕ работает сразу. Прямо сплошное удовольствие какое-то.
|