• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 615
  • Last Modified:

Shutting down application on pipes message

Hi, I'm trying to use rlibby's TPipeServer/Client components for interprocess communication. In this case I want to shut down the server application upon receiving the message 'QUIT'. This causes problems because the pipeserver component does not seem to handle it very well when it is being destroyed while handling a message. It causes an access violation in ntdll read of address 00000010.

Does anyone have a solution on how to do this, maybe by changing the code on the message recieving end, or by modifying the pipe component?

Also see the related question on how to get the pipes components working.

Im using Delphi 2009 v12.0.3210.17555 and the pipes components of 10.20.2008.
Procedure TForm1.PipeServer1PipeMessage(Sender: TObject; Pipe: HPIPE; Stream: TStream);
var S: AnsiString;
begin
  SetLength(S, Stream.Size);
  Stream.Read(S[1], Length(S));
  if (S = 'QUIT') then
  begin
    PipeServer1.Active := false;
    Close; // causes access violation in pipeserver component!
  end;
end;

Open in new window

0
mrdnote
Asked:
mrdnote
  • 2
2 Solutions
 
Geert GOracle dbaCommented:
give it time to close down, send a close message instead ...

if (S = 'QUIT') then
begin
  PipeServer1.Active := false;
  PostMessage(Handle, WM_CLOSE, 0, 0);
end;
0
 
mrdnoteAuthor Commented:
Thanx Geert. Somehow setting Active to False does something to the message queue, causing it not to process the WM_CLOSE message. If I remove the PipeServer1.Active := false line, the WM_CLOSE is propagated and the form closes, however the access violation remains :(
0
 
Geert GOracle dbaCommented:
what does the stack trace tell you ?
press - Ctrl-F3 to see what originated a procedure.

That could tell you what the cause of the violation is.
Check all procedures in this list to see if they don't access a component which has been freed allready.
You may have to press F7 once, to get a decent stack trace.
0
 
Russell LibbySoftware Engineer, Advisory Commented:

Don't touch the active state in the event handler for the pipe server, because it will cause the message queue to flush when the DoShutdown procedure gets called. Just PostMessage the WM_CLOSE to your handle, and then in the FormClose set the Active state to false.

Regards,
Russell
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now