Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизПроблеммы при создании COM объекта в консольном приложении Найти похожие ветки
← →
DelphiN! © (2004-12-17 08:36) [0]Пытаюсь выполнить код в консольном приложении :
var
MyObject: IUnknown;
begin
MyObject := CreateComObject(CLSID_ShellLink);
// Но после попытки создания выскакивает динамическая ошибка :
EOLESysError. Небыл произведен вызов CoInitialize
В обычном GUI приложении все работает нормально, в чем дело ?
← →
Внук © (2004-12-17 08:46) [1]>>в чем дело ?
Именно в этом
>>EOLESysError. Небыл произведен вызов CoInitialize
Надо вызвать, по-видимому
← →
Fay © (2004-12-17 08:52) [2]2 Внук © (17.12.04 08:46) [1]
>> Надо вызвать, по-видимому
Да, было бы славно 8)
← →
Fay © (2004-12-17 08:54) [3]Добавь что-нибудь типа этого
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.
← →
DelphiN! © (2004-12-17 09:16) [4]
> [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 09:23) [5]procedure CoUninitialize;
begin
CoInitialize(nil);
CoUninitialize;
end;
Это что? Вы обратили внимание на точку после end в моём примере?
Перед началом работы с COM вызывайте CoInitialize(nil).
После всего - CoUninitialize.
← →
DelphiN! © (2004-12-17 09:24) [6]Все, разобрался, вот рабочий вариант ф-ии :
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 прописана уже была ... и теперь ошибки нет.
И все-же интересно, почему-же ошибка была ?
← →
DelphiN! © (2004-12-17 09:25) [7]
> [5] Fay © (17.12.04 09:23)
Ясно, огромное спасибо !
← →
Fay © (2004-12-17 09:26) [8]Удачи 8)
← →
Fay © (2004-12-17 09:27) [9]Я привёл объявление функций на тот случай, если тебе не нужен модуль ActiveX.
Удачи 8)
← →
Fay © (2004-12-17 09:28) [10]А где CoUninitialize ?
← →
Fay © (2004-12-17 09:29) [11]Ну хоть не по букве на сообщение - уже хорошо 8)
← →
DelphiN! © (2004-12-17 09:32) [12]
> [10] Fay © (17.12.04 09:28)
> А где CoUninitialize ?
А без него не вылетает тоже ... Наверное он вызывается автоматом где-то
← →
Fay © (2004-12-17 09:45) [13]Ага, вы как мой коллега, считающий , что Delphi всегда выделяет память "автоматом" . Метафизика какая-то 8)
← →
DelphiN! © (2004-12-17 10:07) [14]
> [13] Fay © (17.12.04 09:45)
:)) Я имею ввиду что CoUninitialize вызывает какая-то ф-ия, которую я использую, либо же чей-то деструктор ...
← →
Fay © (2004-12-17 10:08) [15]Ну Кришна Вам судья 8)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c