우리의 응용 프로그램을 테스트하는 동안 ShGetFolderPath를 사용하여 AppData 경로를 반환하면 폴더가 테스트 용 PC에 있어도 함수가 nil을 반환합니다. 개발 PC에서 ShGetFolderPath는 오류없이 AppData 경로를 반환합니다.폴더가 일부 비스타 PC에있을 때 ShGetFolderPath가 nil을 반환하는 이유
개발 PC와 테스트 PC에서 Vista가 실행 중입니다. CSIDL_LOCAL_APPDATA 경로가 성공적으로 반환 된 개발 시스템에서
function GetShellFolder(ID: Cardinal; Create: Boolean = False): string;
// This function is a superset of SHGetSpecialFolderPath, included with
// earlier versions of the Shell. On systems preceeding those including
// Shell32.dll version 5.0 (Windows Millennium Edition (Windows Me) and
// Windows 2000), SHGetFolderPath was obtained through SHFolder.dll,
// distributed with Microsoft Internet Explorer 4.0 and later versions.
// Takes the CSIDL of a folder and returns the path or 'Could not determine
// folder path' if it does not exist. Creates the folder if it does not
// exist if Create is true.
var
Res: HResult;
Path: array [ 0 .. Max_Path ] of Char;
begin
if Create then
ID := ID or csidl_Flag_Create;
Res := ShGetFolderPath(0, ID, 0, shgfp_Type_Current, Path);
if S_OK <> Res then
begin
Result := 'Could not determine folder path';
raise Exception.Create('Could not determine folder path');
end;
Result := Path;
end;
GetShellFolder(CSIDL_LOCAL_APPDATA, False);
하지만 테스트 PC의 CSIDL_LOCAL_APPDATA 폴더는 반환되지 않습니다.
폴더가 하드 드라이브에 있어도 테스트 PC에서 CSIDL_LOCAL_APPDATA 폴더가 반환되지 않는 이유를 알고있는 사람이 있습니까? 테스트 컴퓨터는 CSIDL_HISTORY를 사용하여 기록 폴더를 반환하지만 CSIDL_LOCAL_APPDATA가있는 로컬 appdata 폴더는 반환하지 않습니다.
테스트시 PC 탐색기는 CSIDL_LOCAL_APPDATA 폴더를 users \ user \ AppData \ Local로 표시합니다. 테스트에서 PC 탐색기는 CSIDL_HISTORY 폴더를 users \ user \ AppData \ Local \ Microsoft \ Windows \ History로 표시합니다.
GetShellFolder (CSIDL_LOCAL_APPDATA, True)를 호출해도 함수는 폴더 경로를 반환하지 않습니다.
무엇이 잘못 되었나요? 아니면이 문제를 어떻게 해결할 수 있습니까?
함수가 "폴더 경로를 결정할 수 없습니다"를 반환하지 않습니다. 함수가 예외를 발생 시키면 반환 값 *가 전혀 없습니다. 'S_OK'에 대한 결과를 확인하고 있지만,'S_False','E_Fail','E_InvalidArg'와 같은 다른 가능한 반환 값을 고려하고 있지 않습니다. ShGetFolderPath가 실패하면 그 이유를 알려 주어야합니다. 그 정보를 무시하지 마십시오. 또 다른 한 가지 : 프로그램이 서비스입니까? 높은 권한으로 실행 중입니까? –
높은 권한이없는 일반 앱입니다. – Bill
왜 RaiseLastOSError를 사용하지 않고 오류 코드를 하드 코딩합니까? 보다 유용하고 지역화 된 오류 메시지와 함께 오류 코드 –