AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?
Thema durchsuchen
Ansicht
Themen-Optionen

ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

Ein Thema von EConvertError · begonnen am 2. Feb 2008 · letzter Beitrag vom 10. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#1

ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 18:16
Hallo!

Beim Versuch dieses Beispiel in eine Delphi-Komponente zu packen, stoße ich schon wieder auf ein Problem.

Ich brauche diese beiden Funktionen (aus dem MSDN kopiert):
Code:
BOOL WINAPI WriteFileEx(
  __in     HANDLE hFile,
  __in_opt LPCVOID lpBuffer,
  __in     DWORD nNumberOfBytesToWrite,
  __inout  LPOVERLAPPED lpOverlapped,
  __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
Code:
BOOL WINAPI ReadFileEx(
  __in      HANDLE hFile,
  __out_opt LPVOID lpBuffer,
  __in      DWORD nNumberOfBytesToRead,
  __inout   LPOVERLAPPED lpOverlapped,
  __in_opt  LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
Delphi-Quellcode:
type
  // TODO: Use classes here in the future (if possible)
  PPipeInstance = ^TPipeInstance;
  TPipeInstance = record
    Overlapped: TOverlapped;
    PipeHandle: THandle;
    chRequest: array[1..BUFSIZE] of Char;
    cbRead: DWord;
    chReply: array[1..BUFSIZE] of Char;
    cbToWrite: DWord;
  end;
...
var
  PPipeInst: PPipeInstance;
  AWrite: Boolean;
...
WriteFileEx(PPipeInst^.PipeHandle, @PPipeInst^.chReply[1], PPipeInst^.cbToWrite, POverlapped(PPipeInst), CompletedWriteMethod);
POverlapped(PPipeInst) schluckt er nicht, weil Delphi ein TOverlapped (_OVERLAPPED) verlangt:
Zitat:
[Pascal Fehler] NamedPipeServer.pas(70): E2010 Inkompatible Typen: '_OVERLAPPED' und 'POverlapped'
MSDN sagt aber eindeutig:
Zitat:
A pointer to an OVERLAPPED data structure...
Jetzt vermute ich einen Fehler in der Windows.pas, weshalb ich dort auch schon TOverlapped in POverlapped geändert habe. Nur schluckt er meinen Code noch immer nicht...
Wo muss man das ändern und ist das auch wirklich ein Fehler in Delphi?

Danke,
Andreas

PS: Bei ReadFileEx() verlangt Delphi wie erwartet ein POverlapped.
Andreas N.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 18:24
Moin Andreas,

Zitat von EConvertError:
Jetzt vermute ich einen Fehler in der Windows.pas, weshalb ich dort auch schon TOverlapped in POverlapped geändert habe.
hast Du die Windows.pas auch neu compiliert? (und vor allem: Vor der Änderung gesichert?)
Wenn nicht, wird immer die alte Unit verwendet.

Also in den Fällen, in denen ich mit mitgelieferten Deklarationen nicht klarkomme, importiere ich mir die Funktionen lieber selbst (statt in den VCL-Sourcen zu ändern)
Das macht dann auch die eventuelle Weitergabe von Sourcen einfacher, da jemand anderes dann nicht auf geänderte Originaldateien angewiesen ist (was jemand, der z.B., eine PE hat auch gar nicht machen könnte.)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#3

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 19:17
Du übergibst doch eindeutig deine eigene Struktur PPipeInst, wo POVERLAPPED verlangt ist.

Ich vermute, dass du eigentlich folgendes nutzen wolltest:

WriteFileEx(PPipeInst^.PipeHandle, @PPipeInst^.chReply[1], PPipeInst^.cbToWrite, PPipeInst.Overlapped, CompletedWriteMethod); Edit:
Habe mir die Funktion angeschaut. Es müsste eigentlich ein Pointer auf OVERLAPPED sein.
Die JEDI-API exportiert es korrekt. Sogar in D2007 ist ein ein CONST.

Ich persönlich ziehe die JEDI Implementation vor.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#4

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 19:45
Zitat:
hast Du die Windows.pas auch neu compiliert? (und vor allem: Vor der Änderung gesichert?)
Wie kompiliert man die neu? DCU-Löschen hat es nicht getan....

Klar, habe ich vor den Änderungen gesichert. Wobei das ist nicht mehr so wichtig, weil ich mir die Funktionen auch noch mal selbst eingebunden habe. So gesehen bräuchte ich auch die JEDI-Header nicht mehr...

Zitat:
Du übergibst doch eindeutig deine eigene Struktur PPipeInst, wo POVERLAPPED verlangt ist.
Jupp, ist auch volle Absicht. Ein PPipeInstance kann man auf POverlapped casten, während man ein POverlapped nicht auf ein TOverlapped casten kann. In der MSDN-Vorlage (siehe Link oben) wird das auch gemacht. Wenn man das MSDN-Beispiel kompiliert funktioniert die Geschichte zumindest. Mal sehen ob ich das auch hinbekomme.

Anscheinend braucht man gar kein gültiges TOverlapped-Record, was bedeutet, dass ich auch einen Pointer auf ein Objekt (mein zukünftiges threadsicheres TNamedPipeClient) übergeben könnte. Das wollte ich mit dem Kommentar "Use classes here in the future" andeuten.

Mal sehen, ob sich meine Speicherzugriffsverletzung in Luft auflöst, oder ob es da noch ein Problem gibt...

Danke,
Andreas

PS: D2007 importiert es richtig? D.h. ich könnte da ein IFDEF einbauen?
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 20:12
ja, bei D2006 ist es ein const, d.h. ein impliziter pointer. da kannst du aber wieder keinen eigenen Pointer übergeben.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#6

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 20:32
Es kann kein CONST sein. Es ist laut Definition ein In/Out Wert, was entweder ein Pointer sein muss oder VAR.

---

Sorry, das Beispiel habe ich übersehen.
Aber darf ich fragen, ob du es verstanden hast? Das Beispiel ist doch sehr typisch für C und damit imho trickreich.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#7

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 20:56
Ja, doch so im Großen und Ganzen verstehe ich doch sehr gut, was die da tun.

Ich bekomme schon die Anfrage des Clients richtig rein. Die Antwort funktioniert noch nicht ganz (bekomme immer '?????' statt 'This is a test reply!'). Die Lösung wird wohl in der Verwendung der richtigen String-Sorte sein...

Die Callbacks funktionieren auch ganz gut, dank des MakeProcInstance-Tricks...

Andreas
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 20:57
bei D2006 IST es ein const. (upsa, ich hab ja gar kein D2007)

PS: const bedeutet pass-by-reference, genauso wie var und out. und es gibt bei diesen drei schlüsselwörtern in delphi keinen unterschied außer der sie repräsentierenden zeichenfolge.
EDIT: Und der Compiler weigert sich, die neuzuweisung eines const-params zu übersetzen. naja.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#9

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 21:04
Ja, Delphi 2006 (Turbo Edition) verwende ich auch.

Mir ist schon klar, was const bedeutet. Aber ich brauche es als Pointer, um diesen C-Trick nachmachen zu können. Und POverlapped ist sicher "korrekter" (weil sinngemäßer) übersetzt.

Ja, wie gesagt mein letztes Problem ist nur mehr, dass ich die Anfrage in ein Array of Char einlese. Da bekomme ich 't',#0,'e',#0,'s',#0,'#0','t',#0 (Der Rest des Buffers natürlich mit #0 gefüllt.). Zurückgesendet wird zurzeit ohne #0 dazwischen, was dann natürlich nicht gut funktioniert ('?????').

Der Client ist (zur Zeit noch!) nicht von mir...
Sonst könnte ich es ja auch anders einlesen.

Grüße,
Andreas
Andreas N.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: ReadFileEx/WriteFileEx verwenden: Fehler in Windows.pas?

  Alt 2. Feb 2008, 21:09
das ist dann wohl unicode...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz