2个无法解析的外部错误

0

先上代码:

box.h

#include <graphics.h>
#include <conio.h>
#include <windows.h>
#include <process.h>
#include <wchar.h>
#include <mmsystem.h>
#pragma comment ( lib, "Winmm.lib" )
//全局变量区

//IMAGE图像指针
IMAGE bj1;							//背景图1
IMAGE bf,BF;						//播放
…………

//函数区

//拷贝图片至image
void cobyimage()
{
	………………
}

//透明贴图
void TMimage(IMAGE* dstimg, int x, int y, IMAGE* srcimg, UINT transparentcolor)
{
	HDC dstDC = GetImageHDC(dstimg);
	HDC srcDC = GetImageHDC(srcimg);
	int w = srcimg->getwidth();
	int h = srcimg->getheight();

	// 使用 Windows GDI 函数实现透明位图
	TransparentBlt(dstDC, x, y, w, h, srcDC, 0, 0, w, h, transparentcolor);
}

//媒体播放
void PlayVideoInWindow(char* pszFileName, HWND hWnd, int x, int y, int iWidth, int iHeight)
{
	char szSetWindowsMci[MAX_PATH] = { 0 };
	char szSetVideoSizeMci[MAX_PATH] = { 0 };
	// 构造mci打开视频命令, 设置视频播放的窗口
	::wsprintf(szSetWindowsMci, "open \"%s\" alias myvideo parent %u style %u", pszFileName, hWnd, WS_CHILD);
	// 构造mci视频播放位置大小命令, 设置视频播放的窗口
	::wsprintf(szSetVideoSizeMci, "put myvideo window at %d %d %d %d", x, y, iWidth, iHeight);
	// 打开视频, 指定窗口
	::mciSendString(szSetWindowsMci, NULL, 0, NULL);
	// 设置视频播放位置及画面大小
	::mciSendString(szSetVideoSizeMci, NULL, 0, NULL);
	// 播放视频
	::mciSendString("play myvideo", NULL, 0, NULL);
}

播放.cpp(main)

#include "box.h"

//主函数
int mian()
{
	initgraph(160, 90);
	_getch();
}

 报错(v2019,win10,debug,x86)

1>E:\CODE\C++\fir媒体播放器\box.h(28,33): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(28,33): message : 尝试匹配参数列表“(IMAGE *, const char [15])”时
1>E:\CODE\C++\fir媒体播放器\box.h(29,39): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(29,39): message : 尝试匹配参数列表“(IMAGE *, const char [20])”时
1>E:\CODE\C++\fir媒体播放器\box.h(30,35): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(30,35): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(31,35): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(31,35): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(32,35): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(32,35): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(33,35): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(33,35): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(34,34): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(34,34): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(35,36): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(35,36): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(36,35): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(36,35): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(37,35): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(37,35): message : 尝试匹配参数列表“(IMAGE *, const char [18])”时
1>E:\CODE\C++\fir媒体播放器\box.h(38,35): error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\easyx.h(264,6): message : 可能是“void loadimage(IMAGE *,LPCTSTR,int,int,bool)”
1>E:\CODE\C++\fir媒体播放器\box.h(38,35): message : 尝试匹配参数列表“(IMAGE *, const char [19])”时
1>E:\CODE\C++\fir媒体播放器\box.h(59,105): error C2664: “int wsprintfW(LPWSTR,LPCWSTR,...)”: 无法将参数 1 从“char [260]”转换为“LPWSTR”
1>E:\CODE\C++\fir媒体播放器\box.h(59,13): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winuser.h(333,1): message : 参见“wsprintfW”的声明
1>E:\CODE\C++\fir媒体播放器\box.h(61,90): error C2664: “int wsprintfW(LPWSTR,LPCWSTR,...)”: 无法将参数 1 从“char [260]”转换为“LPWSTR”
1>E:\CODE\C++\fir媒体播放器\box.h(61,13): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winuser.h(333,1): message : 参见“wsprintfW”的声明
1>E:\CODE\C++\fir媒体播放器\box.h(63,48): error C2664: “MCIERROR mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND)”: 无法将参数 1 从“char [260]”转换为“LPCWSTR”
1>E:\CODE\C++\fir媒体播放器\box.h(63,18): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\mciapi.h(88,1): message : 参见“mciSendStringW”的声明
1>E:\CODE\C++\fir媒体播放器\box.h(65,50): error C2664: “MCIERROR mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND)”: 无法将参数 1 从“char [260]”转换为“LPCWSTR”
1>E:\CODE\C++\fir媒体播放器\box.h(65,18): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\mciapi.h(88,1): message : 参见“mciSendStringW”的声明
1>E:\CODE\C++\fir媒体播放器\box.h(67,47): error C2664: “MCIERROR mciSendStringW(LPCWSTR,LPWSTR,UINT,HWND)”: 无法将参数 1 从“const char [13]”转换为“LPCWSTR”
1>E:\CODE\C++\fir媒体播放器\box.h(67,18): message : 与指向的类型无关;强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\mciapi.h(88,1): message : 参见“mciSendStringW”的声明

昨天重装了系统,装了vc2019和easyx,安装时只勾选了C++开发。

改完后还有:

void PlayVideoInWindow(char* pszFileName, HWND hWnd, int x, int y, int iWidth, int iHeight)
{
	char szSetWindowsMci[260] = { 0 };
	char szSetVideoSizeMci[260] = { 0 };
	// 构造mci打开视频命令, 设置视频播放的窗口
	::wsprintf(szSetWindowsMci, L"open \"%s\" alias myvideo parent %u style %u", pszFileName, hWnd, WS_CHILD);
	// 构造mci视频播放位置大小命令, 设置视频播放的窗口
	::wsprintf(szSetVideoSizeMci, L"put myvideo window at %d %d %d %d", x, y, iWidth, iHeight);
	// 打开视频, 指定窗口
	::mciSendString(szSetWindowsMci, NULL, 0, NULL);
	// 设置视频播放位置及画面大小
	::mciSendString(szSetVideoSizeMci, NULL, 0, NULL);
	// 播放视频
	::mciSendString(L"play myvideo", NULL, 0, NULL);
}

E:(配置一样)

严重性	代码	说明	项目	文件	行	禁止显示状态
错误(活动)	E0167	"char *" 类型的实参与 "LPWSTR" 类型的形参不兼容	fir媒体播放器	E:\CODE\C++\fir媒体播放器\box.h	61	

有四个一样的
ava
Forest

2020-3-9

0

从 2002 年开始,微软的 VC 系列就已经默认编码为 Unicode。你遇到的问题,就是编码不一致造成的。推荐你全部使用 Unicode 字符集。

关于 Unicode 字符集的必要性,请参考:https://codebus.cn/yangw/about-unicode

对于你的程序,需要修改的是:

  1. char 全部改为 wchar_t;
  2. 字符串前面全部加 L,例如 L"play myvideo"。
ava
慢羊羊

2020-3-9

好的,偷懒吧 unicode 改成了未设置,结果……谢谢了! -  Forest  2020-3-10
char szSetWindowsMci[MAX_PATH] = { 0 }; char szSetVideoSizeMci[MAX_PATH] = { 0 }; // 构造mci打开视频命令, 设置视频播放的窗口 ::wsprintf(szSetWindowsMci, L"open \"%s\" alias myvideo parent %u style %u", pszFileName, hWnd, WS_CHILD); // 构造mci视频播放位置大小命令, 设置视频播放的窗口 ::wsprintf(szSetVideoSizeMci, L"put myvideo window at %d %d %d %d", x, y, iWidth, iHeight); // 打开视频, 指定窗口 ::mciSendString(szSetWindowsMci, NULL, 0, NULL); // 设置视频播放位置及画面大小 ::mciSendString(szSetVideoSizeMci, NULL, 0, NULL); 我改完后报错: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动)E0167"char *" 类型的实参与 "LPWSTR" 类型的形参不兼容fir媒体播放器E:\CODE\C++\fir媒体播放器\box.h59 四个全错,怎么办 -  Forest  2020-3-10
@Forest 你这样发在评论区,先不说不合适的问题,就说格式看起来也很难受。一个问题保持一个主题吧。如果是相同的问题,修改你的问题,额外做补充就好。要有别的问题,描述清楚后重新提问就好。 -  慢羊羊  2020-3-10
@慢羊羊 知道了,对不起哈。 -  Forest  2020-3-10
技术讨论社区