Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
9-1094802793
WondeRu
2004-09-10 11:53
2005.01.02
Какие видеокарты для OpenGL 2.0?


14-1102768867
Редкий гость
2004-12-11 15:41
2005.01.02
в Билдере OpenDialog -> FileName возвращает


14-1103175166
Чеширский_Кот
2004-12-16 08:32
2005.01.02
Я плакалЪ: ШАЛТАИ НАРОДОВ МИРА


3-1102403008
Mitrofan
2004-12-07 10:03
2005.01.02
Чем подключаться к Sybase


1-1103273196
hooch
2004-12-17 11:46
2005.01.02
Форма в качестве фрейма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский