EmfToWmfBits api 总是 returns 0
EmfToWmfBits api always returns 0
我想使用 EmfToWmfBits api。首先,我将尝试创建一个图元文件 class,然后将其命名为 api。我认为问题在于我创建 class 的方式。
Metafile myMetafile(szArglist[1]);
这种方式给了我对象 myMetafile,但它不包含任何内容。我的意思是这个对象中的 nativeimage 是 NULL,它应该指向我磁盘上的图元文件。所以稍后当我调用 EmfToWmfBits api 时,它给了我零。
我想问题可能出在图元文件 class 应该采用 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 应该 return 转换文件的长度。 api 的详细信息在这里。
https://docs.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 检索包含指定模块的文件的完全限定路径。
我想使用 EmfToWmfBits api。首先,我将尝试创建一个图元文件 class,然后将其命名为 api。我认为问题在于我创建 class 的方式。
Metafile myMetafile(szArglist[1]);
这种方式给了我对象 myMetafile,但它不包含任何内容。我的意思是这个对象中的 nativeimage 是 NULL,它应该指向我磁盘上的图元文件。所以稍后当我调用 EmfToWmfBits api 时,它给了我零。
我想问题可能出在图元文件 class 应该采用 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 应该 return 转换文件的长度。 api 的详细信息在这里。 https://docs.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 检索包含指定模块的文件的完全限定路径。