![]() |
RichEdit - Version ermitteln
Welche RichEdit-Version hab ich ? ... interessiert den Standard-User sicher eher nicht - Aber wenn dann doch / notwendig ?
Info's dazu sind im WWW eher 'mau' oder schwer/wenig aussagefähig zu finden. Gibt's nun nur bis V4 oder doch bis V8 oder noch höher ? Lt. MSDN weder ich da nicht schlau betreff Versionen. ... das ist ähnlich wie bei Erkennung der WIN-Versionen. Ich hab da mal neben WWW-Quellen auch bei den Jedi's rumgesucht und daraus was gebastelt:
Delphi-Quellcode:
Bei mir gibt das unter WIN 8.1 mit jeweils explizit angegebener / ausgeklammerter DLL:
// -----------------------------------------------------------------------------
// !!! https://github.com/dpradov/keynote-nf/issues/530 function CheckRichEditVersion() : integer; var FileName: string; InfoSize, Wnd: DWORD; VerBuf: Pointer; FI: PVSFixedFileInfo; VerSize: DWORD; GLibHandle: THandle; VA, VB : integer; begin result := 0; // try 1st GLibHandle := SafeLoadLibrary('MSFTEDIT.DLL'); // try this first ! if (GLibHandle > 0) and (GLibHandle <= HINSTANCE_ERROR) then GLibHandle := 0; if GLibHandle = 0 then // try this 2nd ... begin GLibHandle := SafeLoadLibrary('RICHED32.DLL'); if (GLibHandle > 0) and (GLibHandle <= HINSTANCE_ERROR) then GLibHandle := 0; end; if GLibHandle = 0 then // try at last ... begin GLibHandle := SafeLoadLibrary('RICHED20.DLL'); if (GLibHandle > 0) and (GLibHandle <= HINSTANCE_ERROR) then GLibHandle := 0; end; if GLibHandle > HINSTANCE_ERROR then // anything found ?! begin FileName := GetModuleName(GLibHandle); InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd); if InfoSize <> 0 then begin GetMem(VerBuf, InfoSize); try if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then begin VA := FI.dwFileVersionMS shr 16; VB := FI.dwFileVersionMS and $FFFF; end; finally FreeMem(VerBuf); end; end; end; case VA of 5: result := VB div 10; 6: begin // V 7.5 ?! case VB of 1..2 : result := 7; // Win 8 3..9 : result := 8; // Win 8.1+ end; end; 10: begin // V 7.5 ?! // ...to be checked for version 7 or 8 !? result := 8; // Win 10.0 ... or 10 ?! end; // WinVersion to be checked before ! 11: result := 5; // OFFICE 2003 12: result := 6; // OFFICE 2007 14: result := 6; // OFFICE 2010 15: result := 8; // OFFICE 2013 end; if GLibHandle > 0 then FreeLibrary(GLibHandle); // release LIB end; - 'MSFTEDIT.DLL' = 8 - 'RICHED32.DLL' = 8 - 'RICHED20.DLL' = 3 Quizfrage: Ist das so richtig mit der Versions-Erkennung und...oder gibt es da noch weitere Dinge zu beachten, die man so im Netz nicht findet ? |
AW: RichEdit - Version ermitteln
Sicherer ist es bestimmt, wenn du stattdessen auf Features/APIs prüfst, welche in bestimmten Versionen existieren/eingeführt/entfernt wurden.
So ist der Code auch bei zukünftigen/unbekannten Versionen noch funktionsfähig. PS: Der einzige Grund die Version kennen zu müssen, den ich mir vorstellen kann, wäre die Verwendung einer API, die es nicht immer gibt, bzw. die in gewissen Versionen kaputt ist. Also warum dann nicht direkt darauf prüfen. :zwinker: Ich erinnere gern an die Defines (IFDEF) zur Erkennung der Compiler-Version, die bei vielen Implementationen abrauchen, sobald ein neues Delphi auf den Markt kommt. :wall: |
AW: RichEdit - Version ermitteln
Ich hab mal auf einem W7-Rechner(64-Bit) nach den drei DLLs gesucht und ein fröhliches Sammelsurium von Dateien mit diesen Namen gefunden. Fileanalyser hat dann noch etwas verwirrendere Informationen beigesteuert. Die Frage ist, ob es den Aufwand lohnt die vorhandenen Dateien zu analysieren und Ihre Möglichkeiten(?) zu prüfen.
Gruß K-H |
AW: RichEdit - Version ermitteln
Bei meinem Delphi wird in der ComCtrls.pas der VCL in
Delphi-Quellcode:
die
procedure TCustomRichEdit.CreateParams(var Params: TCreateParams);
Delphi-Quellcode:
geladen, unabhängig davon, was sonst noch so vorhanden ist.
RichEditModuleName = 'RICHED32.DLL';
Mit der Routine aus dem Eingangspost kann man also prüfen, was vorhanden ist, aber nicht, was vom RichEdit in Delphi genutzt wird. (Es sei denn, das Laden der benötigten DLL wird in anderen Delphiversionen anders gelöst.) Und obige Routine "erwischt" das, was im Suchpfad zu finden ist, dass muss nicht zwingend mit dem übereinstimmen, was ein Programm letztlich nutzt. Oder (um auf den anderen Thread zum Thema zu verweisen - ![]() Man müsste (vermutlich) herausfinden, was tatsächlich genutzt wird und nicht, was vorhanden ist. Bin mir nicht ganz sicher: TJvRichEdit scheint in der globalen Variabel RichEditVersion die genutzte Version anzugeben. Einfach mal in der JvRichEdit.pas die Routine InitRichEditDll anschauen. Eventuell sind daraus weitere Erkenntnisse zu ziehen. Die neueste RTF-Spezifikation, die ich habe finden können, gibt es hier: ![]() |
AW: RichEdit - Version ermitteln
Es sind in einem Programm mehrere Versionen der RichEdit-Komponente vorhanden/geladen.
Welche dein Programm/TRichEdit verwendet, ist aber eine andere Angelegenheit. ClassName im Windows, welche man zum Erstellen einer RichEdit-Kompnente verwenden könnte. RICHEDIT RICHEDITA RICHEDIT20W RICHEDIT20A RICHEDIT30W RICHEDIT30A RICHEDIT41W RICHEDIT41A RICHEDIT50W RICHEDIT50A ... Es ist bei sowas oftmals problemlos möglich verschiedene Versionen gleichzeitig zu verwenden. |
AW: RichEdit - Version ermitteln
Was hast du denn mit dem RichEdit vor? Der TRichEdit von Delphi kann ja zunächst mal immer das gleiche, nämlich verdammt wenig.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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