Entwickler-Ecke

Windows API - TNPipeServer in Konsolenanwendung


LittleBen - Mo 27.08.12 16:04
Titel: TNPipeServer in Konsolenanwendung
Hallo, hier bin ich schon wieder :P
Habe mir die Komponente NPipe (http://code.google.com/p/theunknownones/source/browse/trunk#trunk%2FComponents%2FNPipe) aus Komfortgründen heruntergeladen. In einer normalen Anwendung, also mit Formular, funktioniert das Kommunizieren zwischen Client und Server wunderbar. Doch sobald ich den gleichen (selben) Code in einer Konsolenanwendung (oder DLL) benutze, funktioniert nüschts mehr...Kann ja eigentlich nicht daran liegen, dass kein Handle vorhanden ist, da Pipes ja Handle unabhängig sind?
Mein Code:

Delphi-Quelltext
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:
program Console_Server;

{$APPTYPE CONSOLE}

uses
  Windows,
  Classes,
  Messages,
  SysUtils,
  NPipe_Server,
  NPipe_Types;

var NPipeServer: TNPipeServer;

type
  TIncomingData = class(TObject)
  private
    FIncomingData: TNP_OnIncomingData;
  public
    constructor Create;
    procedure NPipeServerIncomingData(Sender: TObject; Data: TMemoryStream; var Reply: TMemoryStream);
  end;

{$R *.res}

procedure TIncomingData.NPipeServerIncomingData(Sender: TObject; Data: TMemoryStream; var Reply: TMemoryStream);
var sl: TStrings;
begin
 WriteLn('Funktioniert');
 sl:=TStringList.Create;
 sl.Add('Done');
 sl.SaveToStream(Reply);
 sl.Free;
end;

constructor TIncomingData.Create;
begin
 inherited;
 @FIncomingData:= @TIncomingData.NPipeServerIncomingData;
end;

procedure MainProc;
var IncomingData: TIncomingData;
    Msg: TMsg;
begin
 IncomingData:= TIncomingData.Create;
 NPipeServer:= TNPipeServer.Create(nil);
 NPipeServer.OnIncomingData:= IncomingData.NPipeServerIncomingData;
 NPipeServer.PipeName:= 'Crotonic';
 NPipeServer.LocalAccessOnly:= true;
 NPipeServer.Timeout:= 50;
 NPipeServer.Active:= true;

 while GetMessage(Msg, 000do
 begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end;

 NPipeServer.Free;
 IncomingData.Free;
end;

begin
 MainProc;
end.


bummi - Di 28.08.12 00:23

Ich war in dieser Ecke noch nie unterwegs, aber laut http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx
könnte das HWND IMHO doch ein Problem darstellen