방금 LoadLibrary
API 호출을 사용하여로드 된 DLL 파일의 이름이로드되는 동안 이름이 바뀐 놀라운 버그가있었습니다. 분명히 파일에 열린 DLL 핸들을 사용해도 해당 파일의 이름이 바뀌거나 다른 경로로 이동하는 것을 방지하지 못합니다. 그러나 삭제로부터 보호되고 다른 디스크로 이동됩니다. 이 경우 DLL 을 사용하는 프로그램은 계속해서으로 작동합니다. ProcessExplorer는 DLL 경로가 이에 따라 업데이트를 처리 함을 보여줍니다.열린 DLL 핸들이 파일이 이동되지 않도록 보호하지 않는 이유는 무엇입니까?
이 동작은 Windows의 일반 파일 핸들과 다릅니다. 예를 들어 열려있는 std::ifstream
을 동일한 DLL에 유지하면 운영 체제에서 이름 바꾸기를 더 이상 허용하지 않습니다. 나는이 행동을 아주 놀랍고 누군가가 그것에 대해 설명 할 수 있는지 궁금해하고 있었다. 특히 디스크에서 파일을 추적하는 것이 단순히 제 위치에서 잠그는 것보다 어렵다고 생각 했으므로이 문제를 허용하는 이유에 대해 관심을 가질 것입니다. 따라서 OS가이 기능을 적극적으로 지원해야 할 것입니다. 즉,이 기능을 사용하는 케이스가 있어야합니다.
완벽하게 이해할 수 있습니다. 실제로 dll의 파일 핸들은로드 후에 닫히고 메모리 매핑 만 지속됩니다. ['CreateFile']에 대한 옵션으로'FILE_SHARE_DELETE '를 가리키는 것에 감사드립니다. (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx) , 나는 전에 그 옵션을 몰랐다. – ComicSansMS