【发布时间】:2021-11-26 17:24:50
【问题描述】:
我有一个 Visual Studio 2019 项目,仅包含一个 .cpp 文件,名为 copyFile.cpp
#undef UNICODE
#include <iostream>
#include <Windows.h>
int main()
{
std::cout << "Hello World!\n";
DWORD ret = CopyFile("xyz.txt", "xyzCopy.txt", FALSE);
printf("\n\t ret: %d, getlasterror(): %d", ret, GetLastError());
return 0;
}
在调试代码时出现问题,越过这一行:
DWORD ret = CopyFile("xyz.txt", "xyzCopy.txt", FALSE);
导致抛出异常。
Exception thrown at 0x76E4B1AF (combase.dll) in copyFile.exe : 0xC0000005: Access violation reading location 0x00000008
然后程序中断。
与此同时,xyzCopy.txt 正在创建中,新的修改日期为空文件,0 KB。
另一方面,如果我通过终端通过./copyFile.exe 运行 .exe,则不会引发异常,并且代码继续执行到以下行。正在创建文件xyzCopy.txt,内容已满(非空),但创建的时间戳与原始文件相同。与调试时的情况对比。
另外,如果CopyFile() 失败,例如因为找不到要复制的源文件,调试工作正常。因此,只有CopyFile() 成功时才会出现问题。
我不知道是什么情况。感谢您的帮助。
【问题讨论】:
-
您是否在正在调试的构建中激活了编译器优化?在使用调试器时,您通常应该只使用没有编译器优化的调试版本,否则调试器中显示的当前行可能会产生误导。
-
您是否运行了防病毒程序?如果是这样,没有它会出现同样的怪事吗?
-
@muyustan:你的代码对我有效,除了我必须添加
#include <string>才能编译代码。我能够使用调试器通过CopyFile调用越界,没有发生任何异常。文件已成功复制。我没有测试你的其余代码。我在 Windows 7 上使用 MS Visual Studio 2017。 -
请提供minimal reproducible example。
GetLastErrorStdStr可以完全删除。您没有以任何有意义的方式使用它,所以请摆脱它。
标签: c++ windows visual-studio winapi visual-studio-2019