スキップしてメイン コンテンツへ

 none
win10 1709 EnumEnhMetaFile() でCallback関数 EnhMetaFileProc が呼び出されない RRS feed

  • 質問

  • Win10 1709までの環境では、EnumEnhMetaFile() でCallback関数 EnhMetaFileProcがCallされていましたが、

    Win10 1709ではCallBack関数が呼び出されません。

    EnumEnhMetaFile()の戻り値は 0以外(-1)が帰っています。

    2017年12月18日 10:03

すべての返信

  • もう少し条件を絞り込む必要がありそうです。

    私の環境 (Windows 10, バージョン 1709 ビルド 16299.64、Visual Studio 2015 Update 3) では下記のようなコードで EnhMetaFileProc 関数が呼ばれました。

    int CALLBACK EnhMetaFileProc(HDC hdc, HANDLETABLE* table, CONST ENHMETARECORD* record, int tableEntries, LPARAM lParam)
    {
    	if (record->iType == EMR_EXTCREATEFONTINDIRECTW)
    	{
    		const EMREXTCREATEFONTINDIRECTW* createFontRecord = reinterpret_cast<const EMREXTCREATEFONTINDIRECTW*>(record);
    		MessageBox(NULL, createFontRecord->elfw.elfLogFont.lfFaceName, TEXT("フォント名"), MB_OK);
    	}
    	return true;
    }
    
    // 呼び出し部分
    {
    	RECT rect = { 0,0,10000,10000 };
    	HDC hdc = GetDC(hWnd);
    	HDC hMem = CreateEnhMetaFile(hdc, TEXT("test.emf"), &rect, NULL);
    	{
    		HFONT hFont = CreateFont(32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("メイリオ"));
    		HFONT hOldFont = (HFONT)SelectObject(hMem, hFont);
    		TextOut(hMem, 0, 0, TEXT("abc"), 3);
    		SelectObject(hMem, hOldFont);
    		DeleteObject(hFont);
    	}
    	HENHMETAFILE hEnhMetaFile = CloseEnhMetaFile(hMem);
    	ReleaseDC(hWnd, hdc);
    	if (EnumEnhMetaFile(0, hEnhMetaFile, EnhMetaFileProc, NULL, NULL))
    	{
    		MessageBox(hWnd, TEXT("列挙に成功"), TEXT("確認"), MB_OK);
    	}
    	DeleteEnhMetaFile(hEnhMetaFile);
    }

    どのように、EnumEnhMetaFile を呼び出されていますでしょうか?また、拡張メタファイルの内容をシンプルにしていった場合でも再現しますでしょうか?(もしかするとデータ依存?)

    2017年12月19日 1:40
  • EnumEnhMetaFile() API の 1st Parameter hDC には、「なんの」デバイス コンテキストをセットしているのでしょうか?
    もし「特定のプリンタ デバイス」を前提としているのであれば、それ以外のプリンタ デバイスにした場合にどーなるか、検証してみては?
    (3rd ベンダー製プリンタ ドライバのバグ。。。。なんてもことも考えられるケースだと思うので。)
    2017年12月19日 3:00