Windows를 종료하는 데 사용할 수있는 MFC 응용 프로그램에서 작업하고 있습니다. 이렇게하면 Windows는 물론 WM_QUERYENDSESSION 및 WM_ENDSESSION을 모든 응용 프로그램에 보냅니다. 그러나 문제는 일부 소멸자의 일부인 내 응용 프로그램이 실행 중에 사용 된 특정 파일 (CFile :: Remove 포함)을 삭제한다는 것입니다. 응용 프로그램이 Windows에 의해 닫힐 때 소멸자가 호출된다고 믿을만한 이유가 있습니다.파일 작업 함수는 반환되지만 Windows가 종료 될 때 실제로 커밋되지 않습니다.
그러나 Windows가 다시 시작되면 삭제할 것으로 예상되는 파일이 계속 존재 함을 알게됩니다. 이것은 프로그램의 실행이 동일 할 때조차 일관되게 발생하지 않습니다 (테스트를위한 스크립트가 있습니다). 이것은 두 가지 중 하나가 발생하고 있다고 생각하게 만듭니다. a) 소멸자가 계속 호출되지 않았거나 b) Remove 함수가 반환되지만 Windows가 종료되기 전에 파일이 실제로 삭제되지 않습니다.
내가 지금까지 발견 한 유일한 해결 방법은 내 프로그램이 중지 된 후 약 10 초 동안 시스템을 종료 할 때 파일이 제대로 삭제된다는 것입니다. 이것은 내가 b)가 그럴 수 있다고 믿게합니다.
누군가가이 문제를 해결할 수 있기를 바랍니다. 여기
감사 모트
Mort, 스택 오버플로 환영합니다. 코드를 게시 할 때 솔루션을 제안하면 더 많은 진전이 이루어질 수 있습니다. 어떤 경우라도 실제로 실행되는 코드 경로가 실제로 유효한지 확인하기 위해 로깅 메커니즘 (또는 ETW 포인트)을 갖고 있습니까? CFile :: Remove는 DeleteFile을 호출하고 실패 할 경우 예외를 throw 할 수 있습니다. (내 말 뜻을보기 위해 소스를 살펴보십시오.) 프로그램이 잡히지 않는 예외에서 종료 될 수 있습니까? – selbie
답장을 보내 주셔서 감사합니다. 우선, 나는 CFile :: Remove에 의해 던져진 예외를 다룬다. 그러나 나는 이것이 실제로 일어나는 것을 아직 보지 못했다. – Mort
또한 로깅을 추가했습니다. 다른 두 가지 동일한 실행, 즉 파일이 삭제 된 위치와 그렇지 않은 위치를 비교하면 후자의 경우 로그 파일이 끝까지 잘리는 것을 볼 수 있습니다. 예. 두 로그 파일은 특정 지점까지 동일하며, 그 다음에 파일이 삭제되지 않은 인스턴스의 로그가 중지됩니다 (이 경우 관련 개체의 소멸자는 기록되지 않습니다). 따라서 소멸자가 호출되는지 또는 제거 함수가 성공하거나 실패 하는지를 알 수는 없습니다. – Mort