2010-06-25 2 views
1

사용자가 지정한 위치에 파일을 저장하는 기능이 있습니다. GetSaveFileName()을 사용하여 다른 이름으로 저장 대화 상자를 표시합니다. 그런 다음 반환 된 경로를 사용하여 해당 위치로 파일을 씁니다. 사용자가 XP 컴퓨터에서 CD-RW 드라이브를 선택할 때 작동하지 않는 것으로 나타났습니다. 를 CD 버너 루트 폴더를 선택할 때GetSaveFileName() XP의 스테이징 영역을 굽는 CD의 경로를 반환하지 않습니다.

  1. GetSaveFileName (에 의해 반환되는 경로) 임시 준비 영역의 경로를 반환 (F :이 같은 과정은 Vista 및 Windows 나는 다음과 같은 관측을했습니다 7에서 제대로 작동합니다 : Win7/Vista에서 필자의 경우).
  2. XP에서는 CD 레코더 루트 폴더를 선택하면 F : \가 경로로 반환됩니다. 그러나 다른 이름으로 저장 대화 상자를 사용하여 하위 폴더를 만들고이 폴더에 파일을 저장하는 경우 (예 : F : \ 폴더) 경로는 임시 폴더의 경로입니다.
  3. XP에서 메모장과 같은 다른 응용 프로그램을 사용하면 F : \의 임시 폴더로 올바르게 리디렉션됩니다.

XP에서는 CD 버너의 루트 폴더에 저장할 때만 문제가 발생합니다. XP에서 메모장과 동일한 기능을 어떻게 수행하고 CreateFile()에 쓸 수있는 경로가 있으므로 임시 폴더로 다른 이름으로 저장을 할 수 있습니까?

+0

'GetSaveFileName'을 사용하는 방법, 특히'OPENFILENAME'에서 사용하는 Flags를 어떻게 코드 예제로 게시 할 수 있습니까? 예를 들어'OFN_NOTESTFILECREATE' 플래그를 사용합니까? – Oleg

+0

대략 다음과 같습니다. OPENFILENAME openFileName; ZeroMemory (& openFileName, sizeof (OPENFILENAME)); openFileName.lStructSize = sizeof (OPENFILENAME); openFileName.Flags = OFN_OVERWRITEPROMPT; openFileName.lpstrFilter = "Zip 파일 (* .zip)"; GetSaveFileName (& openFileName); – Ryand

답변

2

일부 경로에 대해 CD 스테이징 영역을 다시 가져 오는 것은 IShellFolder::GetDisplayNameOf 기능의 "부산물"이라고 생각합니다. 나는 CD 버너의 경우, 만이 준비 영역에 존재하는 파일이나 폴더의 PIDL이 준비 영역을 참조하는 문자열로 변환된다는 것을 발견했습니다. CD에있는 파일이나 폴더의 PIDL (스테이지 영역에 있는지 여부에 관계없이)은 CD를 참조하는 문자열로 변환됩니다. 정의에 따라 루트 폴더가 CD에 있기 때문에 문자열로 다시 가져 오는 CD 경로입니다.

나는이 문제를 직접 처리 할 것을 제안합니다. ICDBurn::GetRecorderDriveLetter 함수를 사용하여 레코더의 드라이브 문자를 가져올 수 있습니다. 그러면 GetSaveFileName()에서 얻은 문자열과 비교하는 것이 간단합니다. CD 버너의 경로를 다시 가져 오는 경우 을 CSIDL_CDBURN_AREA과 함께 사용하여 준비 영역의 경로를 얻을 수 있습니다. 다음은 경로 문자열의 시작 부분에있는 드라이브 문자를 준비 단계의 경로로 바꾸는 것입니다 지역.

+0

고마워, 그 트릭을하는 것처럼 보였다! XP 시스템에서 실행할 때 GetRecorderDriveLetter() 경로를 직접 대체해야합니다. 이 기능은 GetSaveFileName()의 Vista/Windows7 구현에 기본으로 제공됩니다. – Ryand

관련 문제