Я пытаюсь объединить несколько API-интерфейсов для облегчения печати XPS. Поскольку шрифты True Type иногда ограничены тем, как их можно использовать, рекомендуется запросить у ОС (Windows) лицензию, связанную со шрифтом. Запрещенный метод, который я нашел для этого, выглядит так:
HDC hDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);
// logfont is a valid instance of LOGFONTW
HGDIOBJ hfont = ::CreateFontIndirect(&logfont);
if (!SelectObject(hDC, hfont))
return;
ULONG privstatus = 0;
LONG ttStatus;
ttStatus = TTGetEmbeddingType(hDC, &privstatus);
На этом этапе ttStatus должен быть E_NONE
если TTGetEmbeddingType
удалось, и Privstatus должен быть одним из {EMBED_PREVIEWPRINT, EMBED_EDITABLE, EMBED_INSTALLABLE, EMBED_NOEMBEDDING}
, У меня был этот пример, работающий в пятницу. Сегодня, когда я запускаю мой исполняемый файл TTGetEmbeddingType, возвращается 0x0A (E_NOTATRUETYPEFONT)
вместо E_NONE
, Wat? Я что-то упускаю из-за способности ОС определять, можно ли встроить шрифт?
Текст сообщения об ошибке, который вы цитировали («Среда невернапринадлежит к ERROR_BAD_ENVIRONMENT
системный код ошибки, который имеет числовое значение 10 (0x0A). Тем не мение, TTGetEmbeddingType()
не возвращает системный код ошибки. TTGetEmbeddingType()
документация состояния:
В случае успеха возвращает E_NONE.
Эта функция считывает привилегии встраивания, хранящиеся в шрифте, и передает привилегии в pulPrivStatus.
В противном случае возвращает код ошибки, описанный в Сообщения об ошибках встраивания.
Если вы посмотрите на фактические определения в T2embapi.h
, возвращаемое значение 0x000A
является E_NOTATRUETYPEFONT
Указанный шрифт не является шрифтом TrueType.
Других решений пока нет …