Как работать с OLE объектом

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Джентельмен
постоялец
Сообщения: 162
Зарегистрирован: 16.10.2005 10:47:26
Откуда: Украина Донбасс Краматорск
Контактная информация:

Как работать с OLE объектом

Сообщение Джентельмен »

есть вот у меня OLE объект... под Windows... а что с ним делать? как мне из Lazarus к нему подключитса и использовать все его методы, свойства и т. д. ???
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Пока никак :( . Почему? Ответ можно найти здесь http://freepascal.ru/forum/viewtopic.php?t=2339
Последний раз редактировалось SAK 22.09.2007 18:33:59, всего редактировалось 1 раз.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Попробовал указанный компонент. EXE-шники приложенные для проверки работают, а вот после компиляции этих же примеров в Lazarus 0.9.22 (FPC 2.0.4) незначительно изменённых:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  OC: TMgOleController;
begin
  OC := TMgOleController.Create;
  OC.CreateOleObject('Word.Application');
  OC.SetProperty('Visible',[True]);
  OC.Free; // <<<<< - исключение
end;{ TForm1 }

приводит к исключению на указанной строке. Причину пока не выяснил.
GigoVich
новенький
Сообщения: 99
Зарегистрирован: 07.11.2005 01:05:02
Откуда: г. Москва
Контактная информация:

Сообщение GigoVich »

:wink: В 2.1.4 чё нить поменяли в этом плане?
cepreu
новенький
Сообщения: 24
Зарегистрирован: 01.05.2007 13:20:15
Откуда: г.Киев

Сообщение cepreu »

SAK писал(а):Попробовал указанный компонент. EXE-шники приложенные для проверки работают, а вот после компиляции этих же примеров в Lazarus 0.9.22 (FPC 2.0.4) незначительно изменённых:Код:

procedure TForm1.Button1Click(Sender: TObject);
var
OC: TMgOleController;
begin
OC := TMgOleController.Create;
OC.CreateOleObject('Word.Application');
OC.SetProperty('Visible',[True]);
OC.Free; // <<<<< - исключение
end;{ TForm1 }


приводит к исключению на указанной строке. Причину пока не выяснил.



Запускай Exe-шник не в среде Lazarus а под системой
таже проблема была, вроде с отладчиком не дружит
AAlexA
незнакомец
Сообщения: 4
Зарегистрирован: 29.07.2008 10:18:52

Сообщение AAlexA »

А пример вызова методов есть?
Беру пример из архива, меняб ворд на Excel.Application.
OC := TMgOleController.Create;

Код: Выделить всё

OC1 := TMgOleController.Create;
  OC.CreateOleObject('Excel.Application');
  OC.CallFunction('Add',[EmptyStr,0]);<-----
  OC.SetProperty('Visible',[True]);

Пустой Эксель создаётся, при попыткее вызвать метод в помеченной строке в рантайме исключение.
И ешё при компиляции Lazarus 0.9.24 ругается
MgOle2Auto.pas(103,16) Error: function header doesn't match the forward declaration "TMgOleController.GetActiveOleObjectByClassID(TGuid):IDispatch;Register"

Или поработать с OLE невозможно никаким способом?
'WorkBooK.Add', Application.WorkBooK.Add не помогают
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Сообщение yuray »

AAlexA писал(а):Или поработать с OLE невозможно никаким способом?


Можно. Смотри здесь
anreal
незнакомец
Сообщения: 1
Зарегистрирован: 11.08.2008 14:27:34

Сообщение anreal »

yuray писал(а):Можно. Смотри здесь

Там только для ворда, а с екселем как работать?
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Сообщение yuray »

Автор WordDll планирует создать ExсelDll.dll. Но что мешает Вам сделать это самостоятельно. Исходники WordDll открыты, можно по аналогии и для Excel разработать подобную dll.
AAlexA
незнакомец
Сообщения: 4
Зарегистрирован: 29.07.2008 10:18:52

Сообщение AAlexA »

Создать ДЛЛ не проблема, всё дело в лицензионной чистоте. Наличее лицензии на Делфи, в которой будет компилироватся ДЛЛ, снимает сам вопрос о работе с OLE-обектом.
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение GrayEddy »

Возьмите Turbo Delphi Explorer, скомпилируйте dll.
Все, проблем нет.
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Сообщение yuray »

GrayEddy писал(а):Возьмите Turbo Delphi Explorer, скомпилируйте dll.
Все, проблем нет.


Да, проблем нет если бы не спортивный интерес.
Почему эту длл нельзя компильнуть в Lazarusе? Вот в чем вопрос.
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

Я так понял в версии 0.9.26 уже настроили работу с OLE.
Вот только проблемка с русскими буквами.
Когда используем dll скомпилированную в Delphi то такая инструкция работает отлично

Код: Выделить всё

Wrd := CreateOleObject('Word.Application');
Wrd.Documents.Add;
Wrd.Selection.TypeText(UTF8ToAnsi('Лазарус')); 

т.е. благодаря UTF8ToAnsi получаем в документе нормальный русский текст, но когда делаем тоже самое просто через Lazarus, получается абракадабра, а с английскими буквами все в порядке...
кто знает в чем дело?

Добавлено спустя 2 часа 18 минут 4 секунды:
Ура!!! Разобрался! Изучил модуль ComObj и там синим по белому написано "we can't pass pascal ansistrings to COM routines so we've to convert them
to/from widestring. This array contains the mapping to do so" - короче говоря надо использовать WideString.
И тогджа правильный код будет выглядеть так:

Код: Выделить всё

var s: widestring;
...
s := Utf8ToAnsi('Лазарус это классно');
Wrd := CreateOleObject('Word.Application');
Wrd.Documents.Add;
Wrd.Selection.TypeText(s); 

Потому как по умолчанию идёт просто string.

Уверен, что многие это и так понимали, но я сразу не догнал... Так что написал это для таких же непонятливых :D
ViruZ
постоялец
Сообщения: 175
Зарегистрирован: 30.05.2005 17:41:12
Откуда: Украина
Контактная информация:

Сообщение ViruZ »

Наткнулся на грабли при попытке переноса функций из WordDll - создал тестовый пример - форма с Button, в обработчике OnClick код:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
  s:=Utf8ToAnsi('Тест ворда из Лазаруса');
  Wrd := CreateOleObject('Word.Application');

 Wrd.Visible := true;   //<==грабли тут
 Wrd.Documents.Add;
 Wrd.Selection.Font.Size := 20;
 Wrd.Selection.TypeText(s);
 Wrd.ActiveDocument.SaveAs('c:\test.doc');
 Wrd.ActiveDocument.Close;
 Wrd.Quit;
end;

Если указанную строчку закомментировать, все работает. Пока еще не возможно присваивать значения свойствам или как это понимать?
Изменил обработчик

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
begin
 s:=Utf8ToAnsi('Тест ворда из Лазаруса');
 Wrd := CreateOleObject('Word.Application');
 Wrd.Documents.Add;
 Wrd.Selection.Font.Size := 20;//<==теперь грабли тут
 Wrd.Selection.TypeText(s);
 Wrd.ActiveDocument.SaveAs('c:\test.doc');
 Wrd.ActiveDocument.Close;
 Wrd.Quit;
end;


Каким образом можно присвоить значение свойству обьекта? Или пока еще подождать, когда работа с OLE-обьектами будет полностью реализована и продолжать разработку DLL&
Ответить