"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Als je het XMLDocument wil opmaken, roep dan een functie aan die een message post naar jezelf mbv PostMessage;
Als je die message ontvangt open je het document.
Dus zoiets
1
2
3
4
5
6
7
8
9
| procedure TMyForm.OpenXMLDocument; begin PostMessage(Handle, CM_OpenXMLDocument, 0, 0); end; procedure TMyForm.CMOpenXMLDocument(var Message: TMessage); begin XMLDocument.Active := True; end; |
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Als je dan een message naar jezelf verstuurt [dmv PostMessage], weet je zeker dat windows daar niet mee bezig is.
Maar begrijp ik nou goed, dat je die fout in een thread krijgt?
Overigens werkt het perfect als je SendMessage gebruikt!
Maar wat zijn dat voor calls dan? Ik snap niet echt het probleem.
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Hierin hebben ze het over input-synchronous calls, en hiermee bedoelen ze volgens mij calls dmv SendMessage.
Maar wanneer gaat het bij jouw fout.. Dus in reactie op welk event roep je XMLDocument.Active := True aan?
[edit]
Wat bedoelen ze hier nu met 'such'? Je zou toch zeggen input-synchronous calls ofniet?Automation clients are required by COM to process input-synchronous calls without interruption, and therefore are prevented from making outgoing Automation calls while processing such messages.
Behalve in een procedure die eerst een ListView veranderd en dan die procedure voor de XML opmaak aanroept, ik heb namelijk ondekt dat als de form waar het omgaat, hidden is dan gaat het wel goed. Daarom heb ik het gevoel dat het met die ListView te maken heeft. Maar het aanroepen van de XML procedure zit verder niet in een Begin/End Update ofzo.
"The shell stopped unexpectedly and Explorer.exe was restarted."
Ik kan er morgen wel es dieper op in gaan, door een aparte app te maken die deze fout ook maakt ofzo.
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Maar wanneer wordt die procedure aangeroepen? Die procedure aanroep moet toch in een event staan oid?Behalve in een procedure die eerst een ListView veranderd en dan die procedure voor de XML opmaak aanroept..
1
2
3
| procedure message
procedure1
procedure XML opslaan |
Dat kan het probleem zijn idd, maar waarom is dat een probleem.
"The shell stopped unexpectedly and Explorer.exe was restarted."
"The shell stopped unexpectedly and Explorer.exe was restarted."
Edit: maar ik kan het nu wel weer gebruiken, omdat ik nu ook nog een FindWindow check doe alvorens het bericht te sturen van de 2de instancie.
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Maar dat hij soms blijft hangen op een PostMessage [als de handle vd destination window niet bestaat, neem ik aan] vind ik wel apart; die kende ik nog niet..
"The shell stopped unexpectedly and Explorer.exe was restarted."
Maar ik gebruik dus SendMessage, had het dus al veranderd.
Maar het neemt het probleem niet weg zoals ik heb beschreven aan het begin van dit topic. Is overigens wel gefixt door een PostMessage te doen.
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Je deed een SendMessage van de ene applicatie naar de andere, maar die SendMessage bleef hangen; dus doe je nu een PostMessage. Dit zou eigenlijk geen probleem moeten geven - mbt XMLDocument.Active := True - maar dat doet het wel, en door nog een PostMessage te doen, werkt het wel...
Wat je misschien zou kunnen proberen is voor die XMLDocument.Active := True, de API InSendMessage aanroepen.
Dan weet je tenminste zeker of je toevallig toch via een SendMessage wordt aangeroepen.
BTW ik ga nu
Bedankt voor je tips
"The shell stopped unexpectedly and Explorer.exe was restarted."
De contructor van TXMLDocument blijkt reintroduce te zijn. Doordat ik XMLDocument.Create(MainForm) deed gebruikt hij de Create van TComponent.
Het is voldoende op XMLDocument.Create(nil) te doen, maar dan wel CoInitialize(nil) e.d. erna gebruiken!
De constructor van TXMLDocument:
1
2
3
4
5
| constructor TXMLDocument.Create(const AFileName: DOMString); begin inherited Create(nil); FFileName := AFileName; end; |
Thanks Dennis.
"The shell stopped unexpectedly and Explorer.exe was restarted."