Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблеммы при создании COM объекта в консольном приложении [Win2k, WinXP]


DelphiN! ©   (2004-12-17 08:36:00) 

Пытаюсь выполнить код в консольном приложении :
var
 MyObject: IUnknown;
begin
 MyObject := CreateComObject(CLSID_ShellLink);
// Но после попытки создания выскакивает динамическая ошибка :
EOLESysError. Небыл произведен вызов CoInitialize

В обычном GUI приложении все работает нормально, в чем дело ?


Fay   (2004-12-17 10:08:00) [1]

Ну Кришна Вам судья 8)


DelphiN!   (2004-12-17 10:07:00) [2]


>  [13] Fay ©   (17.12.04 09:45)


:)) Я имею ввиду что CoUninitialize вызывает какая-то ф-ия, которую я использую, либо же чей-то деструктор ...


Fay   (2004-12-17 09:45:00) [3]

Ага, вы как мой коллега, считающий , что Delphi всегда выделяет память "автоматом" . Метафизика какая-то 8)


DelphiN!   (2004-12-17 09:32:00) [4]


>  [10] Fay ©   (17.12.04 09:28)
> А где CoUninitialize ?


А без него не вылетает тоже ... Наверное он вызывается автоматом где-то


Fay   (2004-12-17 09:29:00) [5]

Ну хоть не по букве на сообщение - уже хорошо  8)


Fay   (2004-12-17 09:28:00) [6]

А где CoUninitialize ?


Fay   (2004-12-17 09:27:00) [7]

Я привёл объявление функций на тот случай, если тебе не нужен модуль ActiveX.
Удачи 8)


Fay   (2004-12-17 09:26:00) [8]

Удачи 8)


DelphiN!   (2004-12-17 09:25:00) [9]


>  [5] Fay ©   (17.12.04 09:23)

Ясно, огромное спасибо !


DelphiN!   (2004-12-17 09:24:00) [10]

Все, разобрался, вот рабочий вариант ф-ии :

procedure CreateLink(FileName,ShortCutName:String);
var
 MyObject: IUnknown;
 MyIcon: IShellLink;
 MyPFile: IPersistFile;
 WFileName: WideString;
begin
     CoInitialize(nil);

 MyObject := CreateComObject(CLSID_ShellLink);
 MyIcon := MyObject as IShellLink;
 MyPFile := MyObject as IPersistFile;
 with MyIcon do
 begin
   SetPath(PChar(FileName));
   SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
 end;
 WFileName := ShortCutName;
 MyPFile.Save(PWChar(WFileName), False);
end;

CoInitialize оказывается в модуле ActiveX прописана уже была ... и теперь ошибки нет.

И все-же интересно, почему-же ошибка была ?


Fay   (2004-12-17 09:23:00) [11]

procedure CoUninitialize;
begin
CoInitialize(nil);
CoUninitialize;
end;

Это что? Вы обратили внимание на точку после end в моём примере?
Перед началом работы с COM вызывайте  CoInitialize(nil).
После всего -  CoUninitialize.


DelphiN!   (2004-12-17 09:16:00) [12]


>  [3] Fay ©   (17.12.04 08:54)
> Добавь что-нибудь типа этого
> const
>  ole32 = 'ole32.dll';
>
> function CoInitialize(pvReserved : Pointer) : HResult; stdcall;
> external ole32 name 'CoInitialize';
>
> procedure CoUninitialize; stdcall; external ole32 name 'CoUninitialize';
> .....
> begin
>  CoInitialize(nil);
> ....
>  CoUninitialize;
> end.


Теперь после выполнения :

const
ole32 = 'ole32.dll';

function CoInitialize(pvReserved : Pointer) : HResult; stdcall; external ole32 name 'CoInitialize';

...

procedure CreateLink(FileName,ShortCutName:String);

procedure CoUninitialize;
begin
CoInitialize(nil);
CoUninitialize;
end;

var
 MyObject: IUnknown;
 MyIcon: IShellLink;
 MyPFile: IPersistFile;
 WFileName: WideString;
begin
 CoUninitialize;
 MyObject := CreateComObject(CLSID_ShellLink);
 MyIcon := MyObject as IShellLink;
 MyPFile := MyObject as IPersistFile;
 with MyIcon do
 begin
   SetPath(PChar(FileName));
   SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
 end;
 WFileName := ShortCutName;
 MyPFile.Save(PWChar(WFileName), False);
end;

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

EStakOverflow in module ole32.dll at 0003CC2F. Stack overflow

Далее выскакивает окно с асеиблерным кодом приложения, и ошибка ... AV ...

Что делать теперь ?


Fay   (2004-12-17 08:54:00) [13]

Добавь что-нибудь типа этого
const
 ole32 = 'ole32.dll';

function CoInitialize(pvReserved : Pointer) : HResult; stdcall; external ole32 name 'CoInitialize';

procedure CoUninitialize; stdcall; external ole32 name 'CoUninitialize';
.....
begin
 CoInitialize(nil);
....
 CoUninitialize;
end.


Fay   (2004-12-17 08:52:00) [14]

2 Внук ©   (17.12.04 08:46) [1]
>> Надо вызвать, по-видимому
Да, было бы славно 8)


Внук   (2004-12-17 08:46:00) [15]

>>в чем дело ?
Именно в этом
>>EOLESysError. Небыл произведен вызов CoInitialize
Надо вызвать, по-видимому


Наверх

Титульная страница Поиск, карта сайта Написать письмо