起因:操作系统的书中的参考代码(代码在其他的编译器上应该是可以正常运行的)。
问题:
#include<Windows.h>
#include<stdio.h>
struct SHFILEOPSTRUCT {
HWND hwnd;
UINT wfunc;
LPCTSTR pfrom;
LPCTSTR pto;
FILEOP_FLAGS fflags;
BOOL fanyoperationalborted;
LPVOID hnamemapping;
LPCTSTR lpszprogresstitle;
};
int main()
{
int nok;
char strsrc[] = "c:\\dos\0";
char strdst[] = "c:\\temp\0";
char strtitle[] = "file copying";
SHFILEOPSTRUCT fileop;
fileop.hwnd = NULL;
fileop.wfunc = FO_COPY;
fileop.pfrom = strsrc;
fileop.pto = strdst;
fileop.fflags = FOF_ALLOWUNDO;
fileop.hnamemapping = NULL;
fileop.lpszprogresstitle = strtitle;
nok = SHFileOperation(&fileop);
if (nok)
printf("出错: %d\n", nok);
else
{
printf("文件目录操作成功结束!\n");
if (fileop.fanyoperationalborted)
printf("撤销文件操作!\n");
}
}
在visual studio 2017上编译后出现了三个错误:
①C2371 “SHFILEOPSTRUCT”: 重定义;不同的基类型;
②C2664 “int SHFileOperationA(LPSHFILEOPSTRUCTA)”: 无法将参数 1 从“SHFILEOPSTRUCT *”转换为“LPSHFILEOPSTRUCTA”;
③E0167 "SHFILEOPSTRUCT *" 类型的实参与 "LPSHFILEOPSTRUCTA" 类型的形参不兼容;
我依照着https://bbs.csdn.net/topics/392421327?page=1,此连接中的解决方案试了还是不行,也参考了微软的编译错误提示,我找不到问题出现的原因。
typedef struct _SHFILEOPSTRUCTA {
HWND hwnd;
UINT wFunc;
PCZZSTR pFrom;
PCZZSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
PCSTR lpszProgressTitle;
} SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
上述为c++中该结构体的定义。
排错的过程中,我越发的觉得问题都出自那个重名的结构体,所以查找到该源码的结构体https://blog.csdn.net/robot_2/article/details/1530400,依照该结构体更改代码后即可正常运行。
关于重定义,可能系统里已经由申明过这个结构了,你不需要在这里重新定义一遍,去掉它
关于第二和第三个参数问题,是不是把项目的字符集改为多字符集试试
C++Builder类似错误提示,书上例子是什么环境下的。