We zijn bezig met een project voor school waarin we gebruik maken van XML. De bedoeling is dat we 2 applicaties maken die informatie uitwisselen met elkaar over sockets en waarbij gebruik wordt gemaakt van XML.
Nu heb ik een server draaien die tijdens het hele programma luistert of er wat binnenkomt op de TCPServer.
Dat werkt gewoon goed. Ik krijg ook een string waarin een XML document staat.
Alleen vervolgens wil ik die string parsen in een XMLDocument. Maar zodra ik de active property van het XMLDocument op True zet krijg ik een error (CoInitialize).
Ik kom er echt niet uit. Kan iemand mij hier mee helpen.
Dit is de code:
Nu heb ik een server draaien die tijdens het hele programma luistert of er wat binnenkomt op de TCPServer.
Dat werkt gewoon goed. Ik krijg ook een string waarin een XML document staat.
Alleen vervolgens wil ik die string parsen in een XMLDocument. Maar zodra ik de active property van het XMLDocument op True zet krijg ik een error (CoInitialize).
Ik kom er echt niet uit. Kan iemand mij hier mee helpen.
Dit is de code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
| uses Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, Sockets, ScktComp, XMLDoc, XMLDom, MSXMLDom, XMLIntf; type TClientDataThread = class(TThread) public ListBuffer: TStringList; constructor Create(CreateSuspended: Boolean); procedure Terminate; end; TXMLServer = class private TCPServer: TTcpServer; procedure TCPServerAccept(Sender: TObject; ClientSocket: TCustomIpClient); public constructor Create(Port: String); destructor Destroy; override; end; { TClientDataThread } constructor TClientDataThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); FreeOnTerminate := True; ListBuffer := TStringList.Create; end; procedure TClientDataThread.Terminate; begin ListBuffer.Free; inherited; end; { TXMLServer } constructor TXMLServer.Create(Port: String); begin TCPServer := TTcpServer.Create(nil); TCPServer.OnAccept := TCPServerAccept; TCPServer.LocalPort := '999'; TCPServer.Active := True; end; destructor TXMLServer.Destroy; begin TCPServer.Free; inherited Destroy; end; procedure TXMLServer.TCPServerAccept(Sender: TObject; ClientSocket: TCustomIpClient); var ReceivedText: String; DataThread: TClientDataThread; RootNode: String; XMLHandling: TXMLHandling; XMLDocument: TXMLDocument; begin // Create Thread DataThread := TClientDataThread.Create(True); ReceivedText := ClientSocket.Receiveln; while ReceivedText <> '' do begin // Er is data ontvangen // Verwerk de string die ontvangen is naar een XML Document XMLDocument := TXMLDocument.Create(nil); try with XMLDocument do begin XML. Add(ReceivedText); Active := True; // Bepaal RootNode RootNode := DocumentElement.LocalName; end; XMLHandling := TXMLHandling.Create(ClientSocket.RemoteHost, '999'); try if RootNode = 'RequestVluchtInfo' then begin XMLHandling.SendReplyVluchtInfo(XMLDocument); //SetRequestVluchtInfoReceived(True); end; finally XMLHandling.Free; end; finally XMLDocument.Free; end; DataThread.ListBuffer.Add(ReceivedText); ReceivedText := ClientSocket.Receiveln; end; // Call Resume which will execute and synch the ListBuffer with the TargetList DataThread.Resume; end; |