2010-02-09 4 views
3

우리의 응용 프로그램을 테스트하는 동안 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)를 호출해도 함수는 폴더 경로를 반환하지 않습니다.

무엇이 잘못 되었나요? 아니면이 문제를 어떻게 해결할 수 있습니까?

+2

함수가 "폴더 경로를 결정할 수 없습니다"를 반환하지 않습니다. 함수가 예외를 발생 시키면 반환 값 *가 전혀 없습니다. 'S_OK'에 대한 결과를 확인하고 있지만,'S_False','E_Fail','E_InvalidArg'와 같은 다른 가능한 반환 값을 고려하고 있지 않습니다. ShGetFolderPath가 실패하면 그 이유를 알려 주어야합니다. 그 정보를 무시하지 마십시오. 또 다른 한 가지 : 프로그램이 서비스입니까? 높은 권한으로 실행 중입니까? –

+0

높은 권한이없는 일반 앱입니다. – Bill

+2

왜 RaiseLastOSError를 사용하지 않고 오류 코드를 하드 코딩합니까? 보다 유용하고 지역화 된 오류 메시지와 함께 오류 코드 –

답변

2

유용한 추가 정보 : 1. 어떤 델파이 버전 (유니 코드 또는 ansi) 2. 예외가 발생 했습니까? 그렇다면 shGetFolderPat 호출의 정확한 결과는 무엇입니까? 전화 (우리는 이제 S_OK가 아니지만 무엇입니까?)

실제 답변에 따르면, PATH는 길이가 0 인 종료 문자열 MAX_PATH 여야합니다. 현재는 초기화되지 않았으므로 (로컬 변수) 두 시스템 간의 차이점을 설명 할 수 있습니다. 먼저 fillcharring을 시도해보십시오. 긴 샷, 나는 인정한다.

+0

이 나타납니다. Delphi 버전은 Delphi 2010입니다. – Bill

+0

모든 표준 HRESULT 코드와 HResult를 반환하도록 함수를 변경했습니다. 테스트 PC에서 실패하면 -2147024891의 오류 코드가 반환됩니다. – Bill

+3

오류 코드 0x80070005는 E_ACCESSDENIED를 의미합니다. 이것을 고려하면 http://bit.ly/9MEp7x가 도움이 될 수 있습니다. –

관련 문제