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
- BufSizeWie 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.