2009-03-17 3 views
0

Win32에서 주 스레드의 현재 작업 디렉터리는 실행 파일이 시작된 위치로 설정됩니다. 문제는 다른 곳으로 SetCurrentDirectory()을 호출 한 후에도 프로세스가이 초기 시작 디렉토리 (프로세스 탐색기와 같은 도구로 확인할 수 있음)를 참조하는 파일 시스템 개체를 가지고 있다는 것입니다. 즉,이 디렉터는 방법.Win32 현재 디렉터리, 잠금 및 셸 통합

여기 아무도 해킹하지 않는 해결책을 알고 있습니까? 나는 익스플로러 (HKCR \ Directory \ shell 레지스트리 키에 동사 추가)와 통합 된 프로그램으로이 문제를 특별히 실행하고 있는데, 마우스 오른쪽 버튼으로 클릭 한 디렉토리에서 파일을 처리해야하며 불가능한 소스 디렉토리를 제거해야한다. 초기 작업 디렉토리가로 설정되었으므로 마우스 오른쪽 버튼으로 클릭 한 디렉토리를 추측했습니다.

EDIT : "helper launch-from-sane-directory 사용"접근법에 대해 알아 보겠습니다. 그것은 우아하지 않을 수도 있지만 그것은 작동하고 어떤 더러운 해킹이 필요하지 않습니다.

+0

프로세스가 자체가 아닌 디렉토리에 대한 참조를 보유하고 있습니까? –

+0

예, SetCurrentDirectory()와 MessageBox()를 수행하는 간단한 프로그램을 만들었는지 확인하기 위해 디렉토리를 잠근 상태로 유지합니다. ( – snemarch

+0

retag : win32를 제거하고 현재를 제거했습니다. 현재는 현재 쓸모가 없습니다. – George

답변

1

가장 쉬운 해결책은 지정된 디렉토리 (c : \ 등)에서 실행되는 약간의 도우미 프로세스를 생성 한 다음 종료하고 그 일을 수행하도록하는 것일 수 있습니다. 뮤텍스와 동기화되거나 타이머에 두 번 또는 세 번만 다시 시도해야 할 수도 있습니다 ...

다른 생각 : FILE_FLAG_DELETE_ON_CLOSE와 함께 CreateFile()을 사용할 수 있습니다. 그렇다면 모든 사람들이 그것을 버릴 때 FILE_SHARE_DELETE로 열린 경우에만 사라져야합니다.

+0

이 작업은 가능하지만 약간의 불안감이 느껴짐 - 가장 간단한 해결책이 될 수 있습니다. – snemarch

+0

close on delete는 흥미로운 아이디어이지만 CreateFile은 디렉토리를 다루지 않습니다 (FILE_FLAG_BACKUP_SEMANTICS를 사용하지 않는 한 그렇게 할 수 있을지 모르겠지만 SE_BACKUP_NAME 권한이 필요합니다.) – snemarch

+0

아마도 ... 가까운 일에 삭제 사실을 기억했을 때 나는 문서를 단순한 시험에만 보냈습니다 ... –