Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Fonts per Konsole installieren

47 views
Skip to first unread message

Christoph Schneegans

unread,
Nov 4, 2019, 7:46:30 PM11/4/19
to
Hallo allerseits!

Wie kann man Fonts (etwa .ttf oder .otf) per Konsole installieren? Wenn
ich mich ausgehend von [HKEY_CLASSES_ROOT\.ttf] durch die Registry
hangele, stoße ich irgendwann auf fontext.dll, und

dumpbin /exports c:\windows\system32\fontext.dll

aus Visual Studio liefert u.a. diese Ausgabe:

ordinal hint RVA name
2 3 0001F3C0 InstallFontFile

Bin ich da halbwegs auf dem richtigen Weg?

--
<https://schneegans.de/windows/safer/> · SAFER mit Windows

Stefan Kanthak

unread,
Nov 5, 2019, 5:28:46 AM11/5/19
to
"Christoph Schneegans" <chri...@schneegans.de> schrieb:

> Hallo allerseits!
>
> Wie kann man Fonts (etwa .ttf oder .otf) per Konsole installieren?

Mit oder ohne weitere Interaktion?
Kopiere die Dateien nach %SystemRoot%\Fonts\ und starte Windows neu.-)
Falls der Neustart stoert: oeffne dieses Verzeichnis in einem mit
Administrator-Privilegien laufenden Explorer.

> Wenn ich mich ausgehend von [HKEY_CLASSES_ROOT\.ttf] durch die Registry
> hangele, stoße ich irgendwann auf fontext.dll, und

%COMSPEC% /K ASSOC .ttf && FTYPE ttffile

Unter
[HKEY_CLASSES_ROOT\ttffile\Shell]
ist dummerweise kein Kontextmenueeintrag "Install" statisch definiert,
dessen Kommandozeile Du aufrufen koenntest.
Den dynamisch erzeugten Kontextmenueeintrag kannst Du aber per Skript
aufrufen; fuer ein Beispiel siehe
<https://skanthak.homepage.t-online.de/autoplay.html>

> dumpbin /exports c:\windows\system32\fontext.dll
>
> aus Visual Studio liefert u.a. diese Ausgabe:
>
> ordinal hint RVA name
> 2 3 0001F3C0 InstallFontFile
>
> Bin ich da halbwegs auf dem richtigen Weg?

Auf dem Holzweg bzw. in der Sackgasse: FONTEXT.dll und deren
Schnittstellen sind nicht dokumentiert!

Fuehre folgende Kommandos aus und bewundere deren Ausgaben:
FINDSTR.exe /S /M "FontFile" "%ProgramFiles%\Windows Kits\*.lib"
FINDSTR.exe /S "AddFontFile nstallFontFile" "%ProgramFiles%\Windows Kits\*.?"

Damit kannst Du auf MSDN PrivateFontCollection::AddFontFile finden
<https://msdn.microsoft.com/en-us/library/ms534992.aspx> ... und
wegen des Praefix "Private" gleich ignorieren.
ABER: neben PrivateFontCollection findest Du InstalledFontCollection
<https://msdn.microsoft.com/en-us/library/ms534469.aspx>
mit folgendem zielfuehrenden Hinweis:

| Windows GDI+ clients should not use the InstalledFontCollection
| class to install a font to Windows. Instead, use the Windows
| Graphics Device Interface (GDI) AddFontResource function.

<https://msdn.microsoft.com/en-us/library/dd183326.aspx>

| This function installs the font only for the current session.
| When the system restarts, the font will not be present. To have
| the font installed even after restarting the system, the font
| must be listed in the registry.

Weiteres siehe "Font Installation and Deletion"
<https://msdn.microsoft.com/en-us/library/dd144833.aspx>

JFTR: beschwere Dich bei den VOLLIDIOTEN von Microsoft, die den
Begriff "Resource" hier missbrauchen!

Stefan

PS: Microsoft hat vor AEONEN mit diversen Produkten ein Programm
namens FONTINST.exe geliefert: das liest eine FONTINST.ini mit
den Namen der zu installierenden Dateien.

Arno Welzel

unread,
Nov 5, 2019, 8:20:12 AM11/5/19
to
On 05.11.19 11:27, Stefan Kanthak wrote:

[...]
> <https://msdn.microsoft.com/en-us/library/dd183326.aspx>
>
> | This function installs the font only for the current session.
> | When the system restarts, the font will not be present. To have
> | the font installed even after restarting the system, the font
> | must be listed in the registry.
>
> Weiteres siehe "Font Installation and Deletion"
> <https://msdn.microsoft.com/en-us/library/dd144833.aspx>
>
> JFTR: beschwere Dich bei den VOLLIDIOTEN von Microsoft, die den
> Begriff "Resource" hier missbrauchen!

Er wird nicht missbraucht. Ressourcen sind erstmal alle Arten von Daten,
die für die UI einer Anwendung genuttz wird. Das können Dialoge, Menüs,
Bitmaps und eben auch Fonts sein.

> Stefan
>
> PS: Microsoft hat vor AEONEN mit diversen Produkten ein Programm
> namens FONTINST.exe geliefert: das liest eine FONTINST.ini mit
> den Namen der zu installierenden Dateien.

Oder man nimmt ein VBScript:

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\Windows\Font")
Set objFolderItem = objFolder.ParseName("Myfont.ttf")
objFolderItem.InvokeVerb("Install")

Oder mit PowerShell noch simpler - hier muss man die Datei auch nicht
vorher kopieren, das erledigt das Script, womit der Font auch
gleichzeitig installiert wird:

fonts = (New-Object -ComObject Shell.Application).Namespace(0x14)
dir myfont.ttf | %{ $fonts.CopyHere($_.fullname) }


--
Arno Welzel
https://arnowelzel.de

Christoph Schneegans

unread,
Nov 6, 2019, 8:18:42 PM11/6/19
to
Stefan Kanthak schrieb:

> Unter
> [HKEY_CLASSES_ROOT\ttffile\Shell]
> ist dummerweise kein Kontextmenueeintrag "Install" statisch definiert,
> dessen Kommandozeile Du aufrufen koenntest.
> Den dynamisch erzeugten Kontextmenueeintrag kannst Du aber per Skript
> aufrufen; fuer ein Beispiel siehe
> <https://skanthak.homepage.t-online.de/autoplay.html>

Ich hab's nun in PowerShell so umgesetzt:

function Install-Font( [System.IO.FileInfo] $FontFile ) {
$item = ( New-Object -ComObject 'Shell.Application' ).NameSpace(
$FontFile.Directory.FullName
).ParseName(
$FontFile.Name
);
$item.Verbs() | ForEach-Object {
if( $_.Name -eq 'Install for &all users' ) {
$_.DoIt();
}
}
}

Aufruf etwa so:

Install-Font( Get-Item 'C:\Users\Chris\Downloads\OpenSans-ExtraBold.ttf' )

Das einfachere

$item.InvokeVerb( 'Install for &all users' )

tut aus irgendwelchen Gründen nicht, auch nicht ohne '&'.

'Install for all users' läuft unmittelbar, wenn PowerShell als
Administrator ausgeführt wird, und fordert ansonsten per UAC-Dialog die
nötigen Rechte an. Der Font steht dann unmittelbar zur Verfügung,
auch in bereits zuvor gestarteten Anwendungen. So soll's sein. :-)

Christoph Schneegans

unread,
Nov 6, 2019, 8:37:01 PM11/6/19
to
Arno Welzel schrieb:

> Oder mit PowerShell noch simpler - hier muss man die Datei auch nicht
> vorher kopieren, das erledigt das Script, womit der Font auch
> gleichzeitig installiert wird:
>
> fonts = (New-Object -ComObject Shell.Application).Namespace(0x14)
> dir myfont.ttf | %{ $fonts.CopyHere($_.fullname) }

Hast du das getestet? Nach der Installation funktioniert der Font bspw.
in LibreOffice Writer nicht korrekt – man kann den Font zwar auswählen,
aber er produziert keine sichtbaren Glyphen. Und nach dem nächsten
Windows-Neustart ist der Font wieder verschwunden…

--
<https://schneegans.de/windows/no-8.3/> · Windows ohne PROGRA~1

Arno Welzel

unread,
Nov 7, 2019, 5:12:35 AM11/7/19
to
On 07.11.19 02:36, Christoph Schneegans wrote:

> Arno Welzel schrieb:
>
>> Oder mit PowerShell noch simpler - hier muss man die Datei auch nicht
>> vorher kopieren, das erledigt das Script, womit der Font auch
>> gleichzeitig installiert wird:
>>
>> fonts = (New-Object -ComObject Shell.Application).Namespace(0x14)
>> dir myfont.ttf | %{ $fonts.CopyHere($_.fullname) }
>
> Hast du das getestet? Nach der Installation funktioniert der Font bspw.

Nein.
0 new messages