Текущий архив: 2004.01.13;
Скачать: CL | DM;
ВнизРабота с ActiveDesktop через CreateComObject (KOLComObj) Найти похожие ветки
← →
Ал (2003-04-24 13:07) [0]1) Почему при подключении к D6 KOLComObj размер файла уменьшается лишь на 1 кБайт, по сравнению с ComObj (расчитывал, что выигрыш будет побольше);
2) Делал CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop в существенно разных KOL программах на одной и той же машине под Win98.
С помощью IActiveDesktop менял обои.
Одна программа работает, в другой ломается с кодом ошибки, который не описан в API-справке на CreateComObject.
И в той и в другой пробовал подключать и KOLComObj и ComObj - все равно в одной работает, в другой ломается.
Понимаю, что дело во второй программе. Но может кто-то уже сталкивался - подскажете, какие ситуации бывают, с чем может конфликтовать CreateComObject. А так придется искать во второй проге, с чем конфликтует CreateComObject. Трудоемко, так как программы существенно различаются по коду. Знатоки, подскажите!
← →
Boguslaw (2003-04-24 19:43) [1]Object created by CreateComObject should be deleted later I think. Probably this is system unique like semaphor ?
← →
Ал (2003-04-25 15:33) [2]Думаю, что нет, так как в тестовой программе многократно создавал (без удаления) один и тот же объект
ActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
и многократно запускал ее - все работает нормально.
Возможно, утечка памяти - не анализировал. Но это другой вопрос.
А вот в целевой программе, вероятно, конфликт с уже имеющимся кодом. Где и какой - нужно скурпулезно искать и анализировать. Думал, может кто подскажет хотя бы направление. Прога на KOL, поэтому и спрашиваю.
← →
Boguslaw (2003-04-25 18:34) [3]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.
← →
Boguslaw (2003-04-25 19:43) [4]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.
← →
Ал (2003-04-30 11:53) [5]Спасибо, Богуслав!
Действительно - дело в CoInitialize(nil).
Причем вызов CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop в D4 прекрасно срабатывал и без предварительного CoInitialize(nil).
А в D6 действительно нужно сначала CoInitialize(nil), причем в самом начале программы перед другими операторами (согласно справке).
← →
Boguslaw (2003-04-30 16:15) [6]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.
← →
Fantasist. (2003-04-30 22:01) [7]
> Причем вызов CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop
> в D4 прекрасно срабатывал и без предварительного CoInitialize(nil).
Угу. Потому что там вызов CoInitialize происходит в секции initialization какого-то из подключаемых модулей.
← →
Ал (2003-05-02 02:21) [8]To Fantasist
В секции initialization модуля KOLComObj (или ComObj - кому как нравится).
Но не понятно, почему в D4 работает, а в D6 - нет?
Страницы: 1 вся ветка
Текущий архив: 2004.01.13;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.009 c