GetLastError() = ERROR_INVALID_PARAMETER bei ReadFile(..???



  • Hi,

    ich hab folgende Stelle in meinem Code:

    int Err01 = GetLastError(); //Err01 = 0
    Success = ReadFile (Pipe->hPipe_Inst, DLLPack, BufSize, &Bytes, &Pipe->oStruct); 
    int Err02 = GetLastError(); //Err02 = 87
    

    Hat jemand eine Idee, welcher Parameter nicht korrekt sein könnte?

    Maffe

    PS:

    //Hier noch die einzelnen Typen.
    int BufSize = 520;
    TDLLPack *DLLPack;
    DWORD Bytes = 0;
    
    typedef struct
    {
      HANDLE hPipe_Inst;
      bool PendingIO;
      int PipeStatus;
      OVERLAPPED oStruct;
    } TPipe;
    
    TPipe *Pipe = new TPipe;
    


  • Hast du das Event in der OVERLAPPED-Struktur erzeugt?



  • Ja, hab ich getan. Vielleicht liegt es an der Art, wie ich die Adresse von oStruct aufrufe.
    Gibt es einen Unterschied zwischen "&Pipe->oStruct" und "&(Pipe->oStruct)"?

    Maffe



  • Maffe001 schrieb:

    Gibt es einen Unterschied zwischen "&Pipe->oStruct" und "&(Pipe->oStruct)"?

    Nein.

    Also mal konkret:
    Welchen Wert hat
    - Pipe->hPipe_Inst
    - DLLPack
    - BufSize

    Wie sieht der CreateFile-Aufruf aus?



  • Zu Pipe->Pipe_Inst:
    Das ist das Handle, das auf die Pipe zeigt. Es ist zur Laufzeit korrekt.

    Zu DLLPack:

    //Typ DLLPack
    typedef struct
    {
      char Msg[512]; //Nachricht
      int Modus; //entscheidet, wie die Nachricht verarbeitet werden soll
      int DLLCount; //zeigt, die wievielte Nachricht von der DLL gesendet worden ist
    } TDLLPack;
    
    //Vorkommen im Code => Ziel der Nachricht aus der DLL
    TDLLPack *DLLPack = new TDLLPack;
    //Danach ReadFile(..
    

    Zu Bytes:
    int Bytes = 520;
    Das entspricht "sizeof (TDLLPack)".

    MFK schrieb:

    Wie sieht der CreateFile-Aufruf aus?

    Ich benutze zur Erstellung der Pipe "CreateNamedPipe".

    Pipe->hPipe_Inst = CreateNamedPipe (Pipe_Name, 
          PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,
          PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT,
          MaxInst, BufSize, BufSize, PIPE_TIMEOUT, NULL);
    


  • Auf welchem OS soll das laufen?



  • NT, 2000, XP

    Momentan schreibe ich unter 2000, aber auf XP hatten wir's auch schon am Laufen.



  • Und Du hast die OVERLAPPED-Struktur tatsächlich komplett initialisiert?

    ZeroMemory(&Pipe->oStruct, sizeof(Pipe->oStruct));
    Pipe->oStruct.hEvent = hEvent;
    


  • Danke, genau das war's.

    Sag mal, King, wann sollte man denn ZeroMemory bei Strukturen anwenden? Ich hatte immer gedacht, dass Strukturen "sich bei der Deklaration selber initialisieren".

    Maffe



  • immer, wenn du die komplette struktur nicht selbst mit werten füllen willst.

    die member haben sonst zufällig werte. (was so gerade im speicher steht)



  • static- und auto-variablen (innerhalb von Funktionen deklariert) werden nicht mit 0 initialisiert, globale schon.


Anmelden zum Antworten