Fontressourcen erzeugen

fujitsufan

Erfahrenes Mitglied
Hallo,
in meiner Anwendung benötige ich viele verschiedene Schriften.
Hierzu kopiere ich diese in ein temporäres Verzeichnis.
Diese Dateien haben die Endung "*.tbf".
Daraus erzeuge ich die Fontressourcen (Dateien mit Endung "*.fot".) mit der Funktion
C++:
CreateScalableFontResource(0, cUserFotFilePath, ((string)cExecTbfDirPath + (string)ffblk.ff_name).c_str(), NULL)
Das funktioniert auch bestens.

Danach entsteht das Problem:
Die Fontressoucen (Dateien mit Endung "*.fot") kann ich wieder löschen mit
C++:
RemoveDirectory(sEmbdLinkList.strPath.c_str());
Die Kopien der Fonts selber (Dateien mit Endung "*.tbs") kann ich nicht wieder löschen,
vermutlich sind die noch von irgendeinem Prozess in Verwendung.
Muss ich diese Zugriffe noch irgendwie entkoppeln bzw. unterbrechen?
Wenn ja, wie?

Kann mit da jemand weiterhelfen.

Übrigens: C/C++ WinApi

MfG.
fujitsufan
 
Hallo vfl_freak,

vielen Dank für deine Antwort.
Nur verstehe ich deine Kürzel noch nicht, "IMHO".
Kann ich den Prozess erfragen über einen Funktion.
Ein Prozess killen ist aber nicht die feine Art, eben das letzte Mittel.
Meine Frage geht eher dahin zurück ob es eine Funktion gibt, die der o.g. Funktion entgegenwirkt
"CreateScalableFontResource", denn die veranlasst anscheinend, dass irgend eine Instanz auf die Font-Dateien zugreift
und nicht wieder davon ablässt.

Vielen Dank nochmals.

MfG.
fujitsufan
 
Moin,

Nur verstehe ich deine Kürzel noch nicht, "IMHO"
guckst Du hier: https://www.google.de/search?q=imho&ie=utf-8&oe=utf-8&gws_rd=cr&ei=mi5pVtSPPIWtUazrs7AI :)

Kann ich den Prozess erfragen über einen Funktion.
Ein Prozess killen ist aber nicht die feine Art, eben das letzte Mittel
Solange Du nicht weißt, welcher Prozeß es ist, wird es wohl nicht gehen ... andernfalls halt über die Prozeßliste!
Schön ist das sicherlich nicht - und es stellt sich ja auch die Frage, ob es Sinn macht, etwas zu löschen, das aktuell verwendet wird!

Meine Frage geht eher dahin zurück ob es eine Funktion gibt, die der o.g. Funktion entgegenwirkt
WER soll WEM entgegen wirken (was immer Du mit "entgegen wirken" meinst ...) ??

Gruß Klaus
 
Hallo vfl_freak,

Mit der Funktion "CreateScalableFontResource" erlaube ich doch, dass das Betriebssystem auf meine Font-Dateien zugreifen darf bzw. soll.
The CreateScalableFontResource function is used by applications that install TrueType fonts
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183517(v=vs.85).aspx

Mit entgegenwirken meine ich, dass ich den Zugriff vom Betriebssystem auf meine Font-Dateien wieder aufheben kann, also mit einer artverwandten Funktion, die eben der "CreateScalableFontResource" entgegenwirkt.

Wie auch immer,
vielen Dank im voraus.

Ich hoffe ich nerve Dich nicht zu sehr.

MfG.
fujitsufan
 
Hallo fujitsufan,
ich bin mir nicht sicher ob dir das weiterhilft, aber ich habe mal kurz gegoogelt und dir zwei Links rausgeschrieben:

http://stackoverflow.com/questions/...holds-a-lock-on-my-exe-file/18452006#18452006
https://blogs.msdn.microsoft.com/oldnewthing/20120217-00/?p=8283/

Damit könntest du überprüfen, von welchem Prozess die Dateien geblockt werden.
Bzw. du könntest die Dateien auch gewaltsam wieder freigeben, aber ich bin mir nicht sicher ob du das tun solltest ;)...

Gruß Technipion
 
Hallo Technipion,

vielen Dank für die Antwort.
Ich konnte die letzten 3 Tage nicht arbeiten drum melde ich mich erst jetzt.
Bzw. du könntest die Dateien auch gewaltsam wieder freigeben, aber ich bin mir nicht sicher ob du das tun solltest ;)...

Ich probier´s gleich mal aus.
Wenn´s nicht freiwillig geht, dann mit Gewalt.

Mit freundlichen Grüßen
fujitsufan
 
Hallo Technipion,

ich hab´ die Funktion in meinen Quellcode übernommen.
Den
#include<RestartManager.h>
habe ich auch eingefügt und die Header in meinem Projekt hinzugefügt.
Die Header Datei ist auch auf meinem Rechner vorhanden.

Mein Compiler allerdings behauptet, dass ein nicht aufgelöstes externes Symbol vorhanden sei.
Und dies gleich 4 mal. (
Fehler 517 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RmStartSession@12" in Funktion ""int __cdecl FreeProcess(int,wchar_t * *)" (?FreeProcess@@YAHHPAPA_W@Z)". C:\Workspace\WsTab\Branch\WsTab\Embdfont.obj WsTab
)

Mein Quellcode
C++:
int __cdecl FreeProcess(int argc, WCHAR **argv)
{
    DWORD dwSession;
    WCHAR szSessionKey[CCH_RM_SESSION_KEY + 1] = { 0 };
    DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey);
   
    wprintf(L"RmStartSession returned %d\n", dwError);
 
    if (dwError == ERROR_SUCCESS)
    {
        PCWSTR pszFile = argv[1];
        dwError = RmRegisterResources(dwSession, 1, &pszFile, 0, NULL, 0, NULL);
        wprintf(L"RmRegisterResources(%ls) returned %d\n", pszFile, dwError);
 
        if (dwError == ERROR_SUCCESS)
        {
            DWORD dwReason;
            UINT i;
            UINT nProcInfoNeeded;
            UINT nProcInfo = 10;
            RM_PROCESS_INFO rgpi[10];
 
            dwError = RmGetList(dwSession, &nProcInfoNeeded, &nProcInfo, rgpi, &dwReason);
            wprintf(L"RmGetList returned %d\n", dwError);
 
            if (dwError == ERROR_SUCCESS)
            {
                wprintf(L"RmGetList returned %d infos (%d needed)\n", nProcInfo, nProcInfoNeeded);
 
                for (i = 0; i < nProcInfo; i++)
                {
                    wprintf(L"%d.ApplicationType = %d\n", i, rgpi[i].ApplicationType);
                    wprintf(L"%d.strAppName = %ls\n", i, rgpi[i].strAppName);
                    wprintf(L"%d.Process.dwProcessId = %d\n", i, rgpi[i].Process.dwProcessId);
                    HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, rgpi[i].Process.dwProcessId);
 
                    if (hProcess)
                    {
                        FILETIME ftCreate, ftExit, ftKernel, ftUser;
 
                        if (GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser) && CompareFileTime(&rgpi[i].Process.ProcessStartTime, &ftCreate) == 0)
                        {
                            WCHAR sz[MAX_PATH];
                            DWORD cch = MAX_PATH;
                            if (QueryFullProcessImageNameW(hProcess, 0, sz, &cch) && cch <= MAX_PATH)
                            {
                                wprintf(L"  = %ls\n", sz);
                            }
                        }
 
                        CloseHandle(hProcess);
                    }
                }
            }
        }
        RmEndSession(dwSession);
    }
    return 0;
}


Fehlt mir noch was???

Vielen Dank!
fujitsufan
 
Hallo cwriter,

vielen Dank für den Tipp.
Das habe ich bereits in den Projekteinstellungen gemacht.
Anscheinend nicht richtig.

Ich bleib dran.
Jetzt ist erst mal Urlaub angesagt.

Mit freundlichen Grüßen
fujitsufan
 

Neue Beiträge

Zurück