Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zugriff auf Named Pipe ohne Netzanschluss (https://www.delphipraxis.net/179450-zugriff-auf-named-pipe-ohne-netzanschluss.html)

norwegen60 8. Mär 2014 12:23

Zugriff auf Named Pipe ohne Netzanschluss
 
Hallo zusammen.

ich verwende seit längerem Gerätetreibe z.B. für Kraftanzeigen, über die ich per Named Pipe von einem anderen Programm zugreife. Beide Programme laufen i.d.R. auf demselben Rechner. Das funktioniert unter XP und Win7 so weit auch einwandfrei. Das anlegen erfolgt über
Delphi-Quellcode:
  PipeName :PChar = '\\.\pipe\ForcePipe'+ #0 ;
    fPipe := CreateNamedPipe(PipeName, PIPE_ACCESS_DUPLEX,
     PIPE_TYPE_Message or PIPE_READMODE_Byte or PIPE_WAIT,
     PIPE_UNLIMITED_INSTANCES, 225, 255, NMPWAIT_USE_DEFAULT_WAIT, nil);
    if (fPipe <> INVALID_HANDLE_VALUE) then
      //Warten auf Clientzugriff
      bConnected := ConnectNamedPipe(FPipe, nil);
Jetzt habe ich einen XP-Rechner, der in keinem Netzwerk hängt und da funktioniert der Zugriff nicht. Mit
Delphi-Quellcode:
  pipe := '\\PC01.\pipe\ForcePipe';
  send := 'GETFORCE';

  if CallNamedPipe(PChar(pipe),
    @send[1],   // address of write buffer
    length(send),   // size, in bytes, of write buffer
    @recv[1],   // address of read buffer
    sizeof(recv),   // size, in bytes, of read buffer
    re,   // address of number of bytes read
    3000    // time-out time, in milliseconds
  ) then
  begin
    d := re;
    panel3.caption := recv;
  end
  else
    ShowMessage('Kein Connect zu ' + pipe);
bekomme ich die Meldung "Kein Connect zu \\PC01.\pipe\ForcePipe"
Sobald ich den Rechner mit einem Netz verbinde klappt es.

Was muss ich tun, damit NamedPipe auch bei einem Standalone-Rechner klappt?

Danke
Gerd

Zacherl 8. Mär 2014 13:19

AW: Zugriff auf Named Pipe ohne Netzanschluss
 
Warum verwendest du im unteren Codeschnipsel denn '\\PC01.\pipe\ForcePipe' statt wie oben '\\.\pipe\ForcePipe'? Der PC01 DNS Name wird nur verfügbar sein, wenn du im Netzwerk bist. Der einfache Punkt beschreibt immer den lokalen Host.

himitsu 8. Mär 2014 13:33

AW: Zugriff auf Named Pipe ohne Netzanschluss
 
Der Rechner heißt wirklich "PC01." und nicht nur "PC01"?

Aber ansonsten nannte Zacherl ja schon den Grund.



Zitat:

Delphi-Quellcode:
ShowMessage('Kein Connect zu ' + pipe);

Das ist auch keine Fehlerbehandlung.

Man mag es nicht glauben, aber CallNamedPipe sagt einem, was es für ein Problem gab.



Ach ja, was sind send und recv eigentlich?

jaenicke 8. Mär 2014 14:01

AW: Zugriff auf Named Pipe ohne Netzanschluss
 
Zitat:

Zitat von himitsu (Beitrag 1251215)
Man mag es nicht glauben, aber CallNamedPipe sagt einem, was es für ein Problem gab.

Richtig und konkret siehe Doku:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Zitat:

If the function fails, the return value is zero. To get extended error information, call GetLastError.
Sprich:
Delphi-Quellcode:
if CallNamedPipe(...
    ...
  else
    ShowMessage('Kein Connect zu ' + pipe + ':'#13#10 + SysErrorMessage(GetLastError));

norwegen60 8. Mär 2014 17:28

AW: Zugriff auf Named Pipe ohne Netzanschluss
 
Hallo,

vielen Dank für das schnelle Feedback

Zitat:

Zitat von Zacherl (Beitrag 1251213)
Warum verwendest du im unteren Codeschnipsel denn '\\PC01.\pipe\ForcePipe' statt wie oben '\\.\pipe\ForcePipe'? Der PC01 DNS Name wird nur verfügbar sein, wenn du im Netzwerk bist. Der einfache Punkt beschreibt immer den lokalen Host.

Das mit dem Punkt wusste ich nicht. Ich hatte es mit 127.0.0.1 probiert, aber auch erfolglos. Jetzt mit . funktioniert es
Zitat:

Zitat von himitsu (Beitrag 1251215)
Man mag es nicht glauben, aber CallNamedPipe sagt einem, was es für ein Problem gab.

In den richtigen Treibern habe ich das auch irgendwann implementiert. In der Demo wars noch vereinfacht
Zitat:

Zitat von himitsu (Beitrag 1251215)
Ach ja, was sind send und recv eigentlich?

send enthält den Commandstring
recv den Rückgabewert als String

Problem ist für mich gelöst

Danke
Gerd


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz