![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблеммы при создании 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
Надо вызвать, по-видимому