Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#35
  Alt 3. Jun 2003, 16:52
Zitat von tommie-lie:
Ähh, nur so als Anmerkung, ich habe ihm auch gesagt, daß er lieber eine Abfrage nach Windows-Version (nicht Compiler!!!) machen sollte, aber nachdem es anscheinend auch unter 2k und XP läuft, weiß ich nicht genau, wie gravierend ein auf die Art und Weise verkürzter Rekord sich auswirken wird.
Das habe ich beschrieben. Wenn du den alten Record nochmals kürzt, dann kann das nicht klappen. Und genau das passiert bei D5, wenn man ohne Versionsprüfung kürzt.

Zitat:
Und die Begründung liegt nicht in der Delphi-Version, aber nur indirekt.
Doch, die Begründung liegt in der Delphi-Version, wie du ja auch selbst nun feststellst:

Zitat:
D5 verwendet nämlich mit an Sicherheit grenzender Wahrscheinlichkeit noch die alte Deklaration, während D6 das nicht mehr tut (deswegen hat auch ein Neukompilieren bie mir nichts gebracht). Die neue Deklaration sieht wie folgt aus (Quelle: PSDK, Danke Luckie, sonst hätte ich auch noch das alte *g*):
Code:
typedef struct tagOFN {
// [...]
#if (_WIN32_WINNT >= 0x0500)
  void *        pvReserved;
  DWORD        dwReserved;
  DWORD        FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
(man beachte unbedingt die beiden IFDEFs!!!)
Macht man also die Abfrage nach der Version genauso wie hier in den IFDEFs, dürfte es keine Probleme geben; nie.
Das Problem ist, dass D5 eben diese Variablen nicht kennt. Aus gutem Grund stellt Microsoft daher auch die Konstante OPENFILENAME_SIZE_400 zur Verfügung, die diesem Umstand Rechnung trägt. Sie begrenzt die Recordgröße auf lpTemplateName als Maximum. In Delphi benutzt du dafür die Recordgröße des erweiterten Records (D6/7) und ziehst einen Pointer und zwei DWORDs ab.

Zitat:
Im Prinzip ist es also die reine Unzulänglichkeit Seitens Delphi5, daß MathiasSimmacks selbstkompilierte Version unter Win98 läuft und reiner Zufall, das sie es noch unter NT5 (also Win2k) tut.
Nein, das ist Quatsch! Luckie und ich haben uns über das Problem unterhalten, und auf meine Bitte hin hat er mir den Quelltext der Version 4.0 geschickt. Dieser Quelltext enthielt aber lediglich die Angabe:
ofn.lStructSize := SizeOf(TOpenFilename); Ich denke, du weißt wohl selbst, warum es so funktioniert hat - Es ist der Quellcode! Kompiliert Luckie den mit seinem Delphi 6, dann wird bei ihm das erweiterte Record benutzt, und es funktioniert. Kompiliere ich den selben Quellcode mit meinem Delphi 5, dann wird bei mir das alte Record benutzt. Da aber hier noch nichts gekürzt wurde, funktioniert es logischerweise bei mir auch.

Von Unzulänglichkeiten oder gar Zufällen kann also nicht die Rede sein.
  Mit Zitat antworten Zitat