Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Win 10 : add/remove Font Resource (https://www.delphipraxis.net/194521-win-10-add-remove-font-resource.html)

creehawk 2. Dez 2017 16:20

Win 10 : add/remove Font Resource
 
Moin Moin.

Für ein Editierprogramm verwende ich eine besondere Schriftart. Diese wird beim Start aus einer Ressource gelesen, anschließend gesetzt und beim Beenden des Programms wieder entfernt.

Delphi-Quellcode:
//in Form.Create
....

   C4Font := 'D:\Games\C4\C4S.ttf';

    FontRes := TResourceStream.Create(hInstance, 'TTF', Pchar('CityFont'));
    FontRes.SaveToFile(C4Font);
    FontRes.Free;
    FontInt :=AddFontResource(PChar(C4Font));
    If FontInt > 0 then SendMessage(Application.Handle, WM_FONTCHANGE, 0, 0);
    If FontInt = 0 then
         MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Schriftenfehler', MB_OK or MB_ICONERROR);
....
// in Form.OnDestroy
....
    RemoveFontResource(PChar(CityFont));
    SendMessage(Application.Handle, WM_FONTCHANGE, 0, 0);
   If DeleteFile(C4Font) = false then   
         MessageBox(0, PChar(SysErrorMessage(GetLastError)), 'Löschfehler', MB_OK or MB_ICONERROR);
....
Soweit so schön, klappt(e) anstandslos. Also bisher, in diesem Fall mit Delphi7 und in Win7.

In Delphi 10.2 und Win10 geht das auch korrekt vor sich, dacht ich jedenfalls. Der Font wird zur Laufzeit verwendet,jedoch wird die TTF Datei nach dem Programmende nicht mehr gelöscht wie vorgesehen. Fehlermeldung : Zugriff verweigert

Eine Löschung im Explorer funktioniert ebenfalls nicht mit der bekannten "Aktion kann nicht beendet werden, weil die Datei im System geöffnet ist." Meldung. Zum Zeitpunkt des Löschaufrufs in Delphi/Explorer war keine Anwendung am laufen, schon gar nicht eine die diese Schrift verwendet.

Okay, einfach mal neu gestartet, direkt in den Explorer um die TTF Datei zu löschen - wieder "Aktion kann nicht....." usw. Jetzt mit "Unlocker" ans Werk. Und auch der kann die Datei erst - dann allerdings erfolgreich - nach einem Neustart löschen, gibt allerdings nicht aus wer denn die Datei im System noch verwendet. Jetzt mal kernig das Verzeichnis gelöscht in dem sich die TTF Datei befindet. Kein Problem. Alles weg.

Was kann das sein?

creehawk

Das Problem besteht auf insgesamt 20 Win10Home Rechnern, darunter auch nagelneue (Vanilla) ohne irgendwelche Programme.

jbg 2. Dez 2017 16:48

AW: Win 10 : add/remove Font Resource
 
Das Problem wirst du auch unter einem Vollständig ge-update-tetem Window 7 haben. Delphi älter als XE hat übrigens auch das Problem, wenn man keinen Workaround oder IDEFixPack installiert hat.

Zitat:

Nach der Installation dieses Sicherheitsupdates können Schriftarten, die in einem anderen Verzeichnis als dem Standardverzeichnis für Schriften (%windir%\fonts\) installiert wurden, nicht verändert werden, wenn sie in eine aktive Sitzung geladen werden. Versuche, diese Schriftarten zu ändern, zu ersetzen oder zu löschen, werden blockiert, und die Meldung "Datei wird verwendet" wird angezeigt.
Quelle


Du kannst aber anstatt AddFontResource die Funktion AddFontMemResourceEx verwenden. Dann musst du auch keine Datei anlegen, die du wieder löschen musst.

Delphi-Quellcode:
var
  FontsCount: DWORD;
begin
  ...
  FontRes := TResourceStream.Create(hInstance, 'TTF', 'CityFont');
  try
    FontInt := AddFontMemResourceEx(FontRes.Memory, FontRes.Size, nil, @FontsCount);
  finally
    FontRes.Free;
  end;
end;
RemoveFontMemResource ist nur notwendig, wenn du zwischenzeitlich die Schriftart entfernen willst. Wenn der Prozess beendet wird, werden alle Mem-Fonts ebenfalls entladen.

creehawk 2. Dez 2017 17:53

AW: Win 10 : add/remove Font Resource
 
Vielen Dank für die flotte Antwort.

Ein Windows Problem also, schon seit Win7, obwohl ich eigentlich immer angenommen hatte vollständig geupdatete Win7 Rechner zu haben.

Die Lösung werden wir mal einbauen, und wenn das - wie ich annehme - läuft, dürfen 28 Programme ändern...

creehawk

Und ich habe dann auch die Quelle (Kernelmodustreiber) mir angesehen
Wie bitteschön kommst du jetzt darauf dort zu suchen? Allwissend? Zufall? Vorgehnsweise?

jbg 2. Dez 2017 18:22

AW: Win 10 : add/remove Font Resource
 
Zitat:

Zitat von creehawk (Beitrag 1387776)
Ein Windows Problem also

Kein "Problem", ein Sicherheitsupdate, dass das Überschreiben von fremdgeladenen Font-Dateien unterbindet, indem das System die Datei sperrt.

Zitat:

Wie bitteschön kommst du jetzt darauf dort zu suchen? Allwissend? Zufall? Vorgehnsweise?
Natürlich "Allwissend". Da ich den Patch in IDE Fix Pack eingebaut (und auch bei XE den Alternativ-Code beigesteuert) habe, was ursprünglich eine Performance Optimierung war, weiß ich vom AddFontResource Problem. Und dann einfach mal bei Google danach suchen und man bekommt die Seite mehr oder weniger per Zufall.
Microsoft hat aber auch die Doku zu AddFontResource(Ex) um einen Paragraphen erweitert, der das "Problem" erklärt.


EDIT:
Am Notebook zu tippen bringt so viele Rechtschreibfehler mit sich.

himitsu 3. Dez 2017 19:21

AW: Win 10 : add/remove Font Resource
 
AddFontResourceEx + FR_PRIVATE
und schon deinstalliert Windows den Font automatisch.

Font im eigenen Programmverzeichnis und beim Beenden des Programms schmeißt Windows den Font aus dem Speicher.

Fukiszo 15. Jan 2018 12:59

AW: Win 10 : add/remove Font Resource
 
so rufe ich die API auf um einer visuellen komponente eine bestimmte font zuzuordnen.
in diesem beispiel "MS Sans Serif"

vielleicht hilft's in anderen projekten aber nicht unbedingt in deinem.

Beispiel:

var hFont: Integer;

{ Create Font Handle }
hFont := CreateFont(-13, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif');
{ set Font }
if hFont <> 0 then
begin
SendMessage( WasSollFontBekommen, WM_SETFONT, hFont, 0);
end;

...code...
wenn fertig

DeleteObject(hFont);

himitsu 15. Jan 2018 13:24

AW: Win 10 : add/remove Font Resource
 
Nein, hilft nicht.
Hatte nicht schon jemand als Tipp gegeben dir alles richtig durchzulesen?

Es geht hier um Font-Ressourcen und nicht um Fonts,
also das Laden/Registrieren einer FONT-Datei und nicht um das Zuweisen eines bereits geladenen Fonts.

Fukiszo 16. Jan 2018 21:10

AW: Win 10 : add/remove Font Resource
 
dann schau hier mal rein:

https://github.com/flaith-nycd/pascal-fontmaker/

das ist ein projekt wo man fonts laden bearbeiten speichern kann.

himitsu 17. Jan 2018 00:18

AW: Win 10 : add/remove Font Resource
 
Sorry, ich geb's auf.

* es geht nicht um das Erstellen eines Font-Objekts aus einem bereits geladenen Font
* es geht um das Laden anschliesende und Benutzen eines Font-Datei/Resource
nicht um das Bearbeiten des Fonts

* außerdem sind PixelFonts nicht mehr Stand der Zeit und maximal für kleine/pixelige gute lesbare Schriften geeignet
besser sind Vektor-Fonts, vorallem bei den immer hochauflösenderen Displays
* und k.A. was FTH für Font-Formate sind ... aber ich glaub kaum, dass Windows/Delphi damit was anfangen kann
FTH scheint zum Programm Bei Google suchenFileMaker zu gehören ... sonst war nichts zu finden


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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