![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с ActiveDesktop через CreateComObject (KOLComObj)
Ал © (2003-04-24 13:07:00)
1) Почему при подключении к D6 KOLComObj размер файла уменьшается лишь на 1 кБайт, по сравнению с ComObj (расчитывал, что выигрыш будет побольше);
2) Делал CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop в существенно разных KOL программах на одной и той же машине под Win98.
С помощью IActiveDesktop менял обои.
Одна программа работает, в другой ломается с кодом ошибки, который не описан в API-справке на CreateComObject.
И в той и в другой пробовал подключать и KOLComObj и ComObj - все равно в одной работает, в другой ломается.
Понимаю, что дело во второй программе. Но может кто-то уже сталкивался - подскажете, какие ситуации бывают, с чем может конфликтовать CreateComObject. А так придется искать во второй проге, с чем конфликтует CreateComObject. Трудоемко, так как программы существенно различаются по коду. Знатоки, подскажите!
Ал (2003-05-02 02:21:00) [1]
To Fantasist
В секции initialization модуля KOLComObj (или ComObj - кому как нравится).
Но не понятно, почему в D4 работает, а в D6 - нет?
Fantasist. (2003-04-30 22:01:00) [2]
> Причем вызов CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop
> в D4 прекрасно срабатывал и без предварительного CoInitialize(nil).
Угу. Потому что там вызов CoInitialize происходит в секции initialization какого-то из подключаемых модулей.
Boguslaw (2003-04-30 16:15:00) [3]
Good.I couldn"t test it maybe becouse I have Windows XP - it"s not working or ActiveDesktop is not installed or Microsoft drop support for ActiveDesktop in Windows XP - I don"t know.
Ал (2003-04-30 11:53:00) [4]
Спасибо, Богуслав!
Действительно - дело в CoInitialize(nil).
Причем вызов CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop в D4 прекрасно срабатывал и без предварительного CoInitialize(nil).
А в D6 действительно нужно сначала CoInitialize(nil), причем в самом начале программы перед другими операторами (согласно справке).
Boguslaw (2003-04-25 19:43:00) [5]
What about this :
program RegTest2;
uses
Windows,
KOL,KOLComObj,ActiveX,ShlObj;
procedure TurnActiveDesktop(state:Bool);
const
CLSID_ActiveDesktop: TGUID = "{75048700-EF1F-11D0-9888-006097DEACF9}";
var
ie:IActiveDesktop;
opt:TCOMPONENTSOPT;
begin
ie:= CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
opt.dwSize := sizeof(opt);
opt.fActiveDesktop := state;
opt.fEnableComponents := state;
ie.SetDesktopItemOptions(opt,0);
ie.ApplyChanges(AD_APPLY_REFRESH);
end;
begin
CoInitialize(nil);
TurnActiveDesktop(true);
end.
Boguslaw (2003-04-25 18:34:00) [6]
Look at :
http://msdn.microsoft.com/msdnmag/issues/01/05/c/default.aspx
and also
http://www.delphi32.com/info_facts/faq/faq_891.asp
Probably You forget : CoInitialize(nil) at startup or have old Shell library.
Ал (2003-04-25 15:33:00) [7]
Думаю, что нет, так как в тестовой программе многократно создавал (без удаления) один и тот же объект
ActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
и многократно запускал ее - все работает нормально.
Возможно, утечка памяти - не анализировал. Но это другой вопрос.
А вот в целевой программе, вероятно, конфликт с уже имеющимся кодом. Где и какой - нужно скурпулезно искать и анализировать. Думал, может кто подскажет хотя бы направление. Прога на KOL, поэтому и спрашиваю.
Boguslaw (2003-04-24 19:43:00) [8]
Object created by CreateComObject should be deleted later I think. Probably this is system unique like semaphor ?