【问题标题】:Exe crashes in BackupRead Windows functionBackupRead Windows 函数中的 Exe 崩溃
【发布时间】:2016-11-26 07:26:48
【问题描述】:

以下是我尝试备份文件的 C++ 代码,包括安全信息。我使用了备份读取,但每当调用代码时,exe 就会崩溃。

char buff[225280];
DWORD numberOfBytesToRead = 225280;
DWORD dwBytesRead=0, dwBytesWritten, dwBytesRead2=0;
BOOL bProcessSecurity = TRUE;
LPWSTR sourceBackupFile = L"E:\\myFolder\\backup.txt";
HANDLE source = CreateFile(sourceBackupFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Check for errors
if (source == INVALID_HANDLE_VALUE) {
 cout<<"The Handle is Invalid:"<<GetLastError()<<endl;
}
else
{
    cout<< "\n The source file is in E:\\myFolder\\backup.txt" <<endl ;
}
LPDWORD numberofbytedsreadinreadFile = 0;

cout << "Point Of Crash" << endl;
if (!BackupRead(
        source,
         &buff,
        numberOfBytesToRead,
        numberofbytedsreadinreadFile,
        FALSE,
        TRUE,
        NULL
        ))
     {

         cout << "Backup Read Failed with the error::" << GetLastError() << endl ;

     }

它会在崩溃前打印出来

The source file is in E:\\myFolder\\backup.txt
"Point of Crash"

【问题讨论】:

  • 崩溃前会打印什么?无效的句柄,或有效的源文件?您不应该尝试使用无效句柄做任何事情。
  • 它会打印“Point of Crash”,然后才不会崩溃。我只是试图打开手柄,我没有用它做任何事情。之后我关闭了手柄。我想这不是问题,因为它在那之前就坏了
  • 句柄用作BackupRead的参数。您的程序应根据您的源代码在崩溃点之前打印其中一个 couts。
  • 抱歉,我编辑了它在崩溃前打印的问题“源文件位于 E:\\myFolder\\backup.txt”和“崩溃点”
  • 刚刚注意到您调用了 CreateFile。你想读backup.txt,还是写信给它?

标签: c++ windows file winapi backup


【解决方案1】:

您将NULL 作为最后一个参数传递给BackupRead,根据docs,这显然是无效的。

lpContext [out] 指向变量的指针,该变量接收指向 BackupRead 用于维护上下文的内部数据结构 备份操作期间的信息。您必须设置变量 在第一次调用 BackupRead 之前由 lpContext 指向 NULL 对于指定的文件或目录。该函数为 数据结构,然后将变量设置为指向该数据结构 结构体。您不得更改 lpContext 或它的变量 指向对 BackupRead 的调用之间。释放所使用的内存 数据结构,调用 BackupRead 并将 bAbort 参数设置为 备份操作完成时为 TRUE。

你应该传递一个指向它的指针,它指向空值,而不是空值。 (LPVOIDvoid*LPVOID** 表示 void**

numberofbytedsreadinreadFile 相同:您应该将参数传递给现有变量,而不是空指针,它是一个输出参数。

 void* backupContext = NULL;
 int   numberOfBytesRead = 0;
 cout << "Point Of Crash" << endl;
 if (!BackupRead(
                source,
                 &buff,
                numberOfBytesToRead,
                &numberOfBytesRead,
                FALSE,
                TRUE,
                &backupContext 
                ))

如果你得到一个无效的句柄,你也应该从这个方法返回而不是继续。

【讨论】:

  • 我已经设置了 void* backupContext = NULL;你提到的它仍然在崩溃。
  • 这意味着您的其他参数之一仍然是错误的。例如source,正如我在 cmets 中询问的那样。
  • 句柄是有效的,因为我没有收到任何错误。
  • 还有一个我以前没有注意到的空指针。请仔细阅读文档。
  • 你说的是BackupRead
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多