2016-07-22 16 views
0

Das Unten ist mein C++ - Code Ich habe versucht, eine Datei einschließlich der Sicherheitsinformationen zu sichern. Ich habe Backup gelesen, aber immer wenn der Code aufgerufen wird, wird die EXE abgestürzt.Exe stürzt in BackupRead ab Windows-Funktion

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 ; 

    } 

Er druckt diese vor

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

Was wird vor dem Absturz gedruckt? ungültiger Handle oder gültige Quelldatei? Sie sollten nichts mit einem ungültigen Handle versuchen. – Dutow

+0

wird "Point of Crash" ausgedruckt, bevor nichts anderes zum Absturz gebracht wird. Ich habe gerade versucht, den Griff zu öffnen, und ich habe es für nichts verwendet. Ich schloss den Griff danach. Ich denke, es ist kein Problem, da es vorher bricht – mano

+0

Das Handle wird als Parameter für BackupRead verwendet. Ihr Programm sollte einen der Couts vor dem Crash basierend auf Ihrem Quellcode drucken. – Dutow

Antwort

1

abstürzt Sie bestanden NULL als letzten Parameter zu BackupRead, die dem docs eindeutig ungültig Acording ist.

lpContext [out] Zeiger auf eine Variable, die einen Zeiger auf eine interne Datenstruktur von Backup verwendet empfangen, um Kontextinformationen während einer Sicherungsoperation aufrechtzuerhalten. Sie müssen die Variable , auf die lpContext verweist, vor dem ersten Aufruf von BackupRead für die angegebene Datei oder das angegebene Verzeichnis auf NULL setzen. Die Funktion weist Speicher für die Datenstruktur zu und legt dann die Variable so fest, dass sie auf die Struktur verweist. Sie dürfen lpContext oder die Variable, die auf Aufrufe zwischen BackupRead verweist, nicht ändern. Um den von der Datenstruktur belegten Speicher freizugeben, rufen Sie BackupRead mit dem Parameter bBort auf TRUE auf, wenn der Sicherungsvorgang abgeschlossen ist.

Sie sollten einen Zeiger auf einen Zeiger auf es übergeben, der auf Null zeigt, kein Nullwert. (LPVOID ist void*, LPVOID** bedeutet void**)

Same mit numberofbytedsreadinreadFile: Sie einen Parameter an eine vorhandene Variable übergeben sollte, nicht ein Nullzeiger ist es ein out-Parameter.

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

Sie sollten auch von dieser Methode zurückkehren, wenn Sie ein ungültiges Handle anstelle von fortfahren erhielten.

+0

Ich habe den void gesetzt * backupContext = NULL; was du erwähnt hast, es stürzt noch. – mano

+0

Das bedeutet, dass einer Ihrer anderen Parameter immer noch falsch ist. Zum Beispiel 'source', wie ich in Kommentaren gefragt habe. – Dutow

+0

Das Handle ist gültig, da ich darin keinen Fehler bekommen habe. – mano