Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

Проблеммы при создании 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.046 c
1-1103498206
Артем Владимирович
2004-12-20 02:16
2005.01.02
Отображение Richedit в WebBrowser


1-1103253401
SeZuka
2004-12-17 06:16
2005.01.02
FreeReport 2.3 принтер по умолчанию


14-1102785382
-=Iton=-
2004-12-11 20:16
2005.01.02
Java + БД


14-1102662547
Cosinus
2004-12-10 10:09
2005.01.02
Как разметить диск под FAT32, если он сейчас NTFS? Под ДОС.


4-1100783516
Balkon
2004-11-18 16:11
2005.01.02
Проблема с организацией работы с железкой через Com-порт...