BackupRead Windows函数中的Exe崩溃

时间:2016-07-22 11:45:51

标签: c++ windows file winapi backup

以下是我的C ++代码我试图备份文件,包括安全信息。我使用了Backup read,但每当调用代码时,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"

1 个答案:

答案 0 :(得分:1)

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

  

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

您应该将指针传递给指向它的指针,该指针指向null,而不是空值。 (LPVOIDvoid*LPVOID**表示void**

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

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

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