AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

RichEdit - Version ermitteln

Ein Thema von TERWI · begonnen am 19. Dez 2017 · letzter Beitrag vom 19. Dez 2017
Antwort Antwort
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#1

RichEdit - Version ermitteln

  Alt 19. Dez 2017, 01:12
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:
// -----------------------------------------------------------------------------
// !!! 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;
Bei mir gibt das unter WIN 8.1 mit jeweils explizit angegebener / ausgeklammerter DLL:
- '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 ?

Geändert von TERWI (19. Dez 2017 um 01:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.129 Beiträge
 
Delphi 12 Athens
 
#2

AW: RichEdit - Version ermitteln

  Alt 19. Dez 2017, 11:08
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.


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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: RichEdit - Version ermitteln

  Alt 19. Dez 2017, 11:39
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.495 Beiträge
 
Delphi 7 Professional
 
#4

AW: RichEdit - Version ermitteln

  Alt 19. Dez 2017, 13:20
Bei meinem Delphi wird in der ComCtrls.pas der VCL in procedure TCustomRichEdit.CreateParams(var Params: TCreateParams); die RichEditModuleName = 'RICHED32.DLL'; geladen, unabhängig davon, was sonst noch so vorhanden ist.

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 - RichEdit: Seiten-Umbruch erkennen/auswerten/drucken): LibreOffice kann durchaus eine andere RichEdit-Version für die Erstellung von RTF-Dateien nutzen (oder einen vollkommen anderen Weg zur Erstellung), als das eigene Programm. Dadurch sind Inkompabilitäten möglich.

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: Microsoft: Word 2007: Rich Text Format (RTF) Specification, version 1.9.1
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.129 Beiträge
 
Delphi 12 Athens
 
#5

AW: RichEdit - Version ermitteln

  Alt 19. Dez 2017, 13:58
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Dez 2017 um 14:04 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.069 Beiträge
 
Delphi 2009 Professional
 
#6

AW: RichEdit - Version ermitteln

  Alt 19. Dez 2017, 20:13
Was hast du denn mit dem RichEdit vor? Der TRichEdit von Delphi kann ja zunächst mal immer das gleiche, nämlich verdammt wenig.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:02 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