2016-03-28 57 views
0

我正試圖將兩個API結合在一起以促進XPS打印。由於True Type字體有時會限制它們的使用方式,因此建議您向操作系統(Windows)查詢與字體關聯的許可證。我發現做這件事的方法禁止看起來是這樣的:C++ LogFont嵌入到XPS

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。笏?我是否缺少一些有關操作系統確定字體是否可以嵌入的能力的基礎知識?

+1

你還有別的事情正在進行。這是一個非常基本的錯誤,說明你的應用程序或環境嚴重受損。無論如何,我不相信錯誤是正確的。它甚至沒有被列爲功能家族可以返回的錯誤之一。 –

回答

3

您引用的錯誤消息文本(「環境不正確」)屬於ERROR_BAD_ENVIRONMENT系統錯誤代碼,其數值爲10(0x0A)。但是,TTGetEmbeddingType()不會返回系統錯誤代碼。 TTGetEmbeddingType() documentation指出:

如果成功,則返回E_NONE。

該函數讀取存儲在字體中的嵌入權限並將權限傳遞給pulPrivStatus。

否則,返回Embedding-Function Error Messages中描述的錯誤代碼。

如果您在T2embapi.h看看實際的定義中,0x000A返回值是E_NOTATRUETYPEFONT

指定的字體不是TrueType字體。

+0

正在使用的字體是Courier New,Arial和OCR-A/B的變體。如果我簡單地忽略TTGetEmbeddingType的返回值,並且通常將它們嵌入到我的XPS文檔中而無需投訴。 –

+0

@ g.d.d.c:顯然'TTGetEmbeddingType()'不認爲字體是TrueType字體。也許'CreateFontIndirect()'沒有返回你認爲它的字體(你的例子沒有驗證結果)。 –

+0

這就是我的困惑(因此,問題)來自何處。在48小時前,我測試的樣本正在工作,但現在它們不是,但如果我簡單地忽略似乎是錯誤的返回值,程序會成功完成文檔創建。我已經查看了源代碼的變化(沒有任何相關的變化),仔細檢查沒有更新發生,等等.XPS文檔中的字體_work_。 –