Font einbinden mit AddFontMemResourceEx() funktioniert nicht



  • Hallo Leute,

    hab da nach tagelangen Suchen und Versuchen mal ne Frage.

    Ich möchte in eine dialogfeldbasierende Anwendung mit VC++ 6.0 eine Schrift einbinden. Das soll mit AddFontMemResourceEx() funktionieren. Hab da auch vielversprechende Codeschnipsel gefunden.
    Folgendes habe ich gemacht:

    Im Hauptdialog.cpp

    #include <windows.h>
    #include <WinGDI.h>
    
    #pragma comment(lib, "LIB\\gdi32.lib")
    

    Im OnInitDialog:

    HRSRC hRes = FindResource(NULL,MAKEINTRESOURCE(IDR_DIGITAL_DREAM), _T("BIN"));
       PVOID lpFont = LockResource(LoadResource(NULL,hRes)); 
       DWORD dwSize = SizeofResource(NULL,hRes), cFonts = 0; 
       HANDLE hFont = AddFontMemResourceEx(lpFont,dwSize,NULL,&cFonts);
       ASSERT(cFonts > 0); 
       CFont *Font = new CFont(); 
       VERIFY(Font->CreatePointFont(110,_T("DigitalDream6")));
    

    Beim Kompilieren bekomme ich folgende Fehlermeldung:

    error C2065: 'AddFontMemResourceEx' : nichtdeklarierter Bezeichner

    Die o.g. includes scheinen keine Wirkung zu haben (zumal sich an der Fehlermeldung nichts ändert, wenn ich sie weglasse) und ich weiß jetzt nicht mehr weiter.
    Hat vielleicht jemand eine Idee?

    Vielen Dank im Voraus!



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Deine gewünschte Funktion ist erst ab Win 2000 verfügfbar.

    Vor dem Inkludieren von windows.h sollte deshalb

    #define _WIN32_WINNT  0x0500
    

    stehen.
    Ohne jetzt nachgeschaut zu haben:
    0x0500 : Win 2000
    0x0501 : XP
    0x0600 : Vista
    0x0601 : 7
    Bei den letzten beiden könnte ich durchaus daneben liegen, imho sollte man XP zum jetzigen Zeitpunkt aber noch unterstützen.



  • Hallo 0xX

    danke für Deine Antwort.

    Ich benutze XP und habe jetzt vor #include <windows.h> die Zeile

    #define _WIN32_WINNT 0x0501
    

    eingefügt.

    Beim Kompilieren habe ich wieder die gleiche Fehlermeldung:

    error C2065: 'AddFontMemResourceEx' : nichtdeklarierter Bezeichner

    Ist schon merkwürdig. Die Funktion wird doch deklariert?!?
    Verstehen tu ich das nicht.
    Dabei wollte ich NUR ein *.ttf-Font einbinden.



  • Multirevers schrieb:

    VC++ 6.0

    Du bist dooof!



  • Wow, sehr hilfreicher Beitrag hier!



  • Unter der Annahme, daß die Info von 0xX stimmt (habs nicht nachgeprüft):

    Wenn Du bereits

    #define _WIN32_WINNT 0x0501
    

    hast, dann liegt es wohl am veralteten SDK.

    Hast Du die mitgelieferte Standard-PSDK Library von Visual Studio 6 installiert?
    (hat ja den Stand 1998/1999)
    Wenn ja, dann sind darin noch nicht alle neuen Funktionen von Win 2000 (oder Win Me) und später enthalten.

    Hier hast Du 4 Möglichkeiten:
    a) Funktion selbst definieren (Prototyp und LIB-Library neu erzeugen)
    b) Funktion selbst definieren (nur Prototyp) und zur Laufzeit mit LoadLibrary() und GetProcAddress() ausführen.
    c) noch besser: Nimm die PSDK vom Februar 2003 (dies ist die letzte unterstützte Version für VS6.
    d) Oder gleich eine aktuelle VS 2010 verwenden?

    HTH,
    Martin



  • Hallo Martin,

    vielen Dank für Deine Tips!

    zu:
    a) dazu müsste ich den Quellcode haben, oder?
    b) dann muss die gdi.dll immer "mitgeführt" werden, oder?
    c) PSDK von Februar 2003 finde ich zumindest nicht auf die Schnelle
    d) das wäre wohl die technisch sauberste Lösung

    Hmm, dabei wollte ich nur mal eben...

    Oder gibt es noch eine andere Möglichkeit eine Schriftart als Ressource einzubinden, ohne AddFontMemResource()?



  • Multirevers schrieb:

    a) dazu müsste ich den Quellcode haben, oder?

    Nein, diese Library definiert (vereinfacht ausgedrückt) nur die Einsprungpunkte und Parameter für die jeweilige Funktion in der DLL.
    (nicht zu verwechseln mit "klassischen" Libraries wie z.B. die C-Runtimes, da sind Source-Code verfügbar)
    Die besagte Funktion AddFontMemResourceEx() befindet sich in der Windows DLL-Datei "gdi.dll". Wie Du schon herausgefunden hast, erst ab Windows 2000.
    Der Linker benötigt die Library, damit er die richtigen Einsprungpunkte für die Funktion finden und bereitstellen kann.
    Und der Compiler braucht den Funktionsprototypen.

    Multirevers schrieb:

    b) dann muss die gdi.dll immer "mitgeführt" werden, oder?

    Nein, denn GDI.DLL ist in jeder Windows-Installation mit dabei.

    Multirevers schrieb:

    c) PSDK von Februar 2003 finde ich zumindest nicht auf die Schnelle

    ich fürchte, das ist mittlerweile schon zu alt für den Download über Microsoft-Homepage.
    [Nachtrag:]
    In Jochen Kalmbach's Blog sind die Links zu finden: http://blog.kalmbach-software.de/de/2010/09/08/letztes-psdk-fur-vc6/
    Damit kannst Du anscheinend doch noch den PSDK von Februar 2003 runterladen und dann zu einer Datei (wahrscheinlich ISO-Mount Datei?) zusammenfügen.

    Multirevers schrieb:

    d) das wäre wohl die technisch sauberste Lösung

    Ja.

    Multirevers schrieb:

    Oder gibt es noch eine andere Möglichkeit eine Schriftart als Ressource einzubinden, ohne AddFontMemResource()?

    Ich glaube nein, das sieht schon nach dem richtigen Weg aus.
    Eine andere Alternative wäre mit der Funktion AddFontResource() möglich, aber dafür müßte der Font als eine Datei (z.B. im gleichen Verzeichnis wie die Applikation) vorliegen.
    Andere Alternative könnte evtl. DirectX bieten, aber da muß ich mangels Erfahrung passen.

    HTH,
    Martin

    [Nachtrag: Download von PSDK von Februar 2003 doch möglich! 🕶 ]



  • Hallo Martin,

    vielen Dank für Deine sehr ausführlichen Antworten, die eine große Hilfe für mich sind, um einen "Einblick" in die Sache zu bekommen.

    Ich werde die PSDK von 02.2003 installieren und mein schnelles Glück versuchen.
    Obwohl ich den zeitlichen Aufwand der Umstellung scheue, ist diese Aktion hier der Anstoß für mich demnächst von VC6 auf VC2010 umzusteigen.

    Also, noch mal vielen Dank für die tolle Hilfe hier!



  • Tja, war leider ein Schuss in den Ofen, wäre ja auch zu schön gewesen.
    Nach der Erzeugung der Setup-Dateien wird nach dem Ausführen der setup.exe nur die lokale Datei "downlevel.htm" aufgerufen, mit dem veraltetem Hinweis, dass das PSDK Internet Explorer v5.0 oder höher benötigt. Mehr tut sich nicht.



  • Weitere Möglichkeit: für Versionen Win9x hab ich die Schrift ebenfalls als Resource mitgeliefert und sie dann zur Laufzeit in ein Verzeichniss "entpackt" und mit AddFontResource(filename) aufgerufen.



  • Multirevers schrieb:

    Tja, war leider ein Schuss in den Ofen, wäre ja auch zu schön gewesen.
    Nach der Erzeugung der Setup-Dateien wird nach dem Ausführen der setup.exe nur die lokale Datei "downlevel.htm" aufgerufen, mit dem veraltetem Hinweis, dass das PSDK Internet Explorer v5.0 oder höher benötigt. Mehr tut sich nicht.

    Ich habs mal eben getestet:
    Alle (auch die beiden bat- und exe-Dateien!) Dateien heruntergeladen, Gesamtgröße dann insgesamt 339.037.952 Bytes (ca. 340MByte).

    Dann ein Pfad unter C:\P angelegt.
    In der Kommandozeile eingeben: PSDK-FULL.bat C:\P (also das Verzeichnis als Parameter mit angeben)
    Die Dateien werden entpackt, gefühlte 30 Sekunden (bei 3 GHz Core2)
    Im Verzeichnis C:\P befinden sich unzählige Dateien mit insgesamt 363.220.727 Bytes.
    C:\P\Setup.exe aufgerufen, und die Startseite mit den Auswahl- und Installationsmöglichkeiten erscheint.

    Kann es sein, daß Du ein sehr altes Windows hast, auf dem tatsächlich kein Internet Explorer 5 oder höher installiert ist?
    Schon seit Windows 98 SE und seit Windows 2000 hatten sie IE 5 mit an Bord!



  • Hallo Martin,

    danke, dass Du Dich so reinkniest!

    Habe die Setup-Dateien nach Deiner Anleitung nochmal entpackt. Die Größe der *.cab und Setup-Dateien entsprechen auf´s Byte genau Deinen Angaben.
    Beim Starten der Setup.exe erscheint keine Startseite mit den Auswahl- und Installationsmöglichkeiten. ( heul! )
    Nach wie vor wird nur die lokale Datei "downlevel.htm" aufgerufen, mit dem Hinweis, dass das PSDK Internet Explorer v5.0 oder höher benötigt.

    Ich habe
    XP prof. SP3
    IE 8
    VC++ 6.0 mit SP5

    Unter welchen Betriebssystem hast Du es denn getestet? Hmm, ist langsam zum Verzweifeln.



  • Ups, dann liegt es wohl kaum an der PSDK, auch wenn er an sich veraltete Setups usw. hat.

    Mein System ist auch das gleiche wie bei Dir.
    Außer das mit SP5: Für VC sollte man das Service Pack SP6 spendieren (aber das hat, glaub ich, nix mit Deinem Problem zu tun)

    Hast Du die Möglichkeit virtuelle Maschinen anzuwerfen, wie z.B. mit VMware Workstation bzw. Player?



  • Hallo Martin,

    VMware müsste ich erst downloaden. Welchen Lösungsansatz verfolgst Du damit?



  • nun, VMware Workstation ist ein kostenpflichtiges Programm.
    Und der kostenlose VMware Player spielt nur die virtuellen Maschinen ab, die z.B. mit VMware Workstation erstellt wurden.

    Alternative wäre auch Microsofts VirtualPC denkbar, und es gibt noch einige andere.

    Ich wollte einfach nur einen Test ohne Folgeschäden anregen, mit einem frisch installierten Betriebssystem in einer virtuellen Maschine.

    Vielleicht kannst Du auch alternativ Deinen PC mit einem frisch installierten Windows XP ausstatten? Nur mal so ganz zaghaft frag...
    Das bedeutet aber auch eine Neuinstallation aller anderen Software wie z.B. Office, Visual Studio 6, .... 🙄



  • Hi Martin,

    habe VS 6.0 auf einen anderen XP-Rechner installiert.

    Es funktioniert nach wie vor nicht!

    Genau genommen ist es die Enterprise Edition, aber daran wird es doch wohl nicht scheitern, oder?

    Hast Du es auch auf XP getestet?



  • Ich komme in zwei Wochen an VS 2003 ran. Werde es mal installieren und nochmal testen.
    Das freie VC++ 2005 unterstützt wohl kein Programmieren von Dialogfeldern, und ist somit keine Alternative.



  • Ich selbst habe auch die VS 6 Enterprise Edition mit SP6 im Einsatz.
    Windows XP SP3 mit allen aktuellen (automatischen) Updates.
    IE 8 (8.0.6001.18702).

    Ich habe mal in meinen Installations-Notizen nachgesehen (so hatte ich es auch installiert):

    Microsoft Visual Studio 6 Enterprise Edition "SETUP.EXE"
    "Microsoft Virtual Machine for Java aktualisieren"
    Ordner für gemeinsame Dateien C:\Programme\Microsoft Visual Studio\Common (Default-Vorschlag) auswählen
    Benutzerdefiniert, alle Komponenten auswählen, für Visual FoxPro 6.0 den Pfad C:\Programme\Microsoft Visual Studio\VFoxPro98 auswählen
    VM aktualisieren
    -Reboot-
    Umgebungsvariablen für VC++-Dienstprogrammen zur Ausführung von der Befehlszeile aus registrieren
    Neues Datenbank-Format DB6 verwenden
    englische Komponente durch deutsche ersetzen
    alle weiteren: JA
    Windows NT Debug Symbole installieren
    -Reboot-
    MSDN Library Visual Studio 6.0a Edition (German)
    Vollständige Installation wählen
    Verknüpfung auf Desktop
    Weitere Clientdienstprogramme: "InstallShield" installieren
    Zielpfad "C:\Programme\InstallShield\InstallShield für VC6" wählen
    Server-Setups: "Installations-Assistenten für BackOffice starten", "Visual Source Safe Server" und "SNA Server" installieren
    Verknüpfung erstellen: "C:\Programme\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE"
    Microsoft Visual Studio 6 Service Pack 5 "setupsp5.exe"
    Microsoft Visual Studio 6 Service Pack 6 "setupsp6.exe"
    If you are using Visual C/C++, run it at least once before installing the SDK. This will ensure that the environment variables are correctly configured.
    Microsoft MSDN Library Platform SDK Februar 2003
    "C:\Programme\Microsoft SDK 2003-02"
    SDK Catalog: -Windows SDK: -Core SDK (Windows Server 2003)
                               -Internet Development SDK (Version 6.0)
                               -Internet Information Server SDK (Version 5.1)
                               -Microsoft Data Access Components (Version 2.7)
                               -Windows Installer SDK (Version 2.0)
                               -Tablet PC SDK
                               -WMI SDK
    SDK Update Catalog: -Windows Media SDK: Windows Media Services SDK
                        -Debugging Tools for Windows
                        -Configuration Options: Register environment variables
    To register the SDK bin, include, and library directories with Microsoft Visual Studio 6.0, click "Start" -> "Programme" -> "Microsoft Platform SDK February 2003" -> "Visual Studio Registration" -> "Register PSDK Directories with Visual Studio".
    This registration process places the SDK bin, include, and library directories at the beginning of the search paths, which ensures that the latest headers and libraries are used when building applications in the IDE.
    "Extras" -> "Optionen..." -> "Verzeichnisse": "Plattform Win32": Für "Ausführbare Dateien": -"C:\Programme\Microsoft Visual Studio\Common\MSDev98\Bin"
                                                                                                -"C:\Programme\Microsoft Visual Studio\VC98\Bin"
                                                                                                -"C:\Programme\Microsoft Visual Studio\Common\Tools"
                                                                                                -"C:\Programme\Microsoft Visual Studio\Common\Tools\WinNT"
                                                                                                -"C:\WINNT\system32"
                                                                                                -"C:\WINNT"
                                                                                                -"C:\WINNT\system32\wbem"
                                                                     Für "Include-Dateien": -"C:\Programme\Microsoft SDK 2003-02\include"
                                                                                            -"C:\Programme\Microsoft Visual Studio\VC98\MFC\Include"
                                                                                            -"C:\Programme\Microsoft Visual Studio\VC98\ATL\Include"
                                                                                            -"C:\Programme\Microsoft SDK 2003-02\include\Win64\crt"
                                                                                            -"C:\Programme\Microsoft SDK 2003-02\src\crt"  ???
                                                                     Für "Bibliothek-Dateien": -"C:\Programme\Microsoft SDK SDK 2003-02\Lib"
                                                                                               -"C:\Programme\Microsoft Visual Studio\VC98\Lib"
                                                                                               -"C:\Programme\Microsoft Visual Studio\VC98\MFC\Lib"
                                                                     Für "Quellcode-Dateien": -"C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC"
                                                                                              -"C:\Programme\Microsoft Visual Studio\VC98\MFC\Include"
                                                                                              -"C:\Programme\Microsoft Visual Studio\VC98\ATL\Include"
                                                                                              -"C:\Programme\Microsoft Visual Studio\VC98\CRT\SRC"
    KB957924 VB6.0 SP6 kumulatives Update "VB60SP6-KB957924-v2-x86-DEU.msi"
    

    Wichtig ist vor allem auch, daß Du VC mindestens einmal gestartet hast, bevor Du das (originale) PSDK installierst (siehe Text).

    Hast Du es auf einem frisch installierten Windows XP probiert?

    Und es muß immer zuerst die ältere Version von VS installiert werden, bevor eine neuere zusätzlich installiert wird.
    Also z.B. immer zuerst VS 6 installieren, dann z.B. VS 2005, dann VS 2010 usw.

    Ansonsten wüßte ich es nicht weiter, woran es liegen könnte.



  • Multirevers schrieb:

    Das freie VC++ 2005 unterstützt wohl kein Programmieren von Dialogfeldern, und ist somit keine Alternative.

    Wie soll ich das verstehen?
    Meinst Du Programmieren mit MFC?
    Ja, das kann sein. Die aktuelle, kostenlose VS 2010 Express Edition unterstützt kein MFC. Möglicherweise war das auch schon in VS 2005 schon so?


Anmelden zum Antworten