[Delphi] XML opslaan geeft een Exception

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Kan iemand mij misschien vertellen wat dit inhoudt:
Afbeeldingslocatie: http://www.endoria.net/upload/?bekijk=1719064561

Ik krijg deze zodra ik een functie aanroep waarin hij een XMLDocument (MSXML) opmaakt. Het vreemde is echter dat het wel goed gaat als ik die functie achter bijvoorbeeld een OnClick van een Button hang, maar het gaat dus mis zodra hij het vanuit een andere functie doet.

De Exception treedt op bij de XMLDocument.Active := True.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Probeer dit eens:

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
code:
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;

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Dat gaat idd werken denk ik, maar waarom deze fout? Moet ik misschien eerst CoInitialize(nil) voor het openen aanroepen, of is dat alleen in threads nodig?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Zover ik kan begrijpen, kun je geen Automation Calls maken, als windows al bezig is met het afhandelen van een andere message [dmv SendMessage]

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?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Nee, het opmaken van de XML gebeurd niet in een thread.

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

Ik had dit artikel gelezen.

Hierin hebben ze het over input-synchronous calls, en hiermee bedoelen ze volgens mij calls dmv SendMessage.

|:( Zie nu dat ik het verkeerd gelezen heb..

Maar wanneer gaat het bij jouw fout.. Dus in reactie op welk event roep je XMLDocument.Active := True aan?

[edit]
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.
Wat bedoelen ze hier nu met 'such'? Je zou toch zeggen input-synchronous calls ofniet?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb dus een procedure gemaakt die de opmaak van de XML verzorgt. Werkt perfect, ook als ik deze gewoon in andere events stop.

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."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Overigens zit het programma wel in de tray, maar weet niet of dat er mee te maken heeft. Las toevallig in dat MS article dat dat ook met de tray te maken heeft.

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

Behalve in een procedure die eerst een ListView veranderd en dan die procedure voor de XML opmaak aanroept..
Maar wanneer wordt die procedure aangeroepen? Die procedure aanroep moet toch in een event staan oid?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Vanuit een procedure met een message directive bedenk ik me nu:
code:
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."


Verwijderd

Is dat een windows message?

Quote uit het msdn artikel
STATUS
This behavior is by design.
:)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Dat is een zelf gedefineerd message (WM_APP + 101) die ik stuur vanuit een andere instancie van mijn programma, zodat deze actie kan ondernemen.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Doet je dat mbv PostMessage of SendMessage?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
SendMessage, omdat ik met PostMessage het probleem had dat hij soms bleef hangen.

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

Dat is dus het probleem denk ik..

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..

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
PostMessage wacht op een antwoord ofzo, bepaalde spy-ware (en andere software?) stuurde niks terug, dus beelf ie hangen. SendMessage stuurt een bericht en gaat weer verder.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Eh, dat is dus precies andersom..

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Oja, sorry. Het is al laat. :)

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

:) duurde effe maar nu snap ik wat je bedoelt.

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 :Z

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Slaap lekker, ik ga ook pitten.

Bedankt voor je tips :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Oud topic, maar toch een oplossing.

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:
code:
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."

Pagina: 1