c++ - EmfToWmfBits api 总是返回 0

标签 c++ winapi metafile

我想使用 EmfToWmfBits api。首先,我将尝试创建一个图元文件类,然后调用此 api。我认为问题出在我创建类(class)的方式上。

 Metafile myMetafile(szArglist[1]);

这种方式为我提供了对象 myMetafile,但它不包含任何内容。我的意思是这个对象中的 nativeimage 是 NULL,它应该指向我磁盘上的图元文件。所以稍后当我调用 EmfToWmfBits api 时,它给我零。

我想问题可能是 Metafile 类应该采用 wchar 字符串。磁盘上的文件名不是wchar?我试过这样。

 Metafile myMetafile(L"bird.emf");

还有这个。

 Metafile myMetafile(L"鸟.emf");

我确定 emf 文件与 exe 位于同一目录中。但都失败了。

这是我使用的代码。

#include <iostream>
#include <stdio.h>
#include <WINDOWS.H>
#include <shellapi.h>
#include <gdiplus.h>

#pragma comment(lib,"gdiplus.lib")
#pragma comment(lib, "shell32.lib")

using namespace Gdiplus;


int main(int argc, char **argv)
{
    UINT size1 = 0;
    int argcount;
    LPWSTR* szArglist;

    if (argc < 2) {
        std::cout << "Please input a file name" << std::endl;
        return 0;
    }


    szArglist = CommandLineToArgvW(GetCommandLineW(), &argcount);
    Metafile myMetafile(szArglist[1]);
    LocalFree(szArglist);
    HENHMETAFILE hEmf = myMetafile.GetHENHMETAFILE();
    size1 = Metafile::EmfToWmfBits(
        hEmf,
        0,
        NULL,
        MM_ANISOTROPIC,
        EmfToWmfBitsFlagsEmbedEmf);
    std::cout << size1 << std::endl;

}

通常,这个 EmfToWmfBits api 应该返回转换文件的长度。这个 api 的详细信息在这里。 https://learn.microsoft.com/en-us/windows/win32/api/gdiplusheaders/nf-gdiplusheaders-metafile-emftowmfbits 如果有人能在这里帮助我,我将不胜感激。

最佳答案

您需要初始化 GDI+。

The GdiplusStartup function initializes Windows GDI+. Call GdiplusStartup before making any other GDI+ calls, and call GdiplusShutdown when you have finished using GDI+.

添加:

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

这是修改后的代码,仅供引用。

#include <iostream>
#include <stdio.h>
#include <WINDOWS.H>
#include <shellapi.h>
#include <gdiplus.h>
#include <Shlwapi.h>

#pragma comment (lib,"Shlwapi.lib")
#pragma comment(lib,"gdiplus.lib")
#pragma comment(lib, "shell32.lib")

using namespace Gdiplus;

int main(int argc, char **argv)
{
    UINT size1 = 0;
    WCHAR path[MAX_PATH];

    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    GetModuleFileNameW(NULL, path, MAX_PATH);
    PathRemoveFileSpecW(path);
    PathAppendW(path, L"temp.emf");
    Metafile myMetafile(path);

    HENHMETAFILE hEmf = myMetafile.GetHENHMETAFILE();
    size1 = Metafile::EmfToWmfBits(
        hEmf,
        0,
        NULL,
        MM_ANISOTROPIC,
        EmfToWmfBitsFlagsEmbedEmf);
    std::cout << size1 << std::endl;
    GdiplusShutdown(gdiplusToken);
    return 0;
}

我使用 GetModuleFileNameW检索包含指定模块的文件的完全限定路径。

关于c++ - EmfToWmfBits api 总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57847769/

相关文章:

c++ - 查找数组重复单元的最简单方法是什么?

c++ - 错误:在 CComVariant::Copy 中迭代 CComSafeArray 时出现 "bad variable type"

c++ - 在 Boost 序列化中展平嵌套的命名值对

c - windows应用程序开发: a nebie's dilemna! EXE和安装的.exe版本?

c - Windows API 是如何工作的?

windows - GetFinalPathNameByHandle 对于设备句柄失败

delphi - 将图形复制到屏幕尺寸之外的 TMetaFileCanvas

c++ - XMVECTOR 类型的函数参数传递

c# - 在没有预览的情况下打印本地报告 - 超出流大小或 GDI+ C# 中发生一般错误