2012-01-03 10 views
8

मैं डेल्फी 7 के साथ काम कर रहा हूं और मैं अपने के पथ को ढूंढना चाहता हूं ../सभी उपयोगकर्ता/दस्तावेज़ निर्देशिका।
मैं निम्नलिखित कोडडेल्फी फ़ोल्डर पथ

uses shlobj, ... 

function GetMyDocuments: string; 
var 
    r: Bool; 
    path: array[0..Max_Path] of Char; 
begin 
    r := ShGetSpecialFolderPath(0, path, CSIDL_Personal, False) ; 
    if not r then 
    raise Exception.Create('Could not find MyDocuments folder location.') ; 
    Result := Path; 
end; 

यह ठीक काम करता है, लेकिन यह CSIDL_COMMON_DOCUMENTS जो वांछित पथ रिटर्न का समर्थन नहीं करता भर में आया था।

इसके अलावा एमएस CSIDL के अनुसार अब KNOWNFOLDERID का उपयोग नहीं किया जाना चाहिए।
और मुझे इस ऐप को एकाधिक ओएस (केवल विंडोज़) पर काम करने की ज़रूरत है।

मैं यह कैसे कर सकता हूं?
सहायता की सराहना की जाती है :)

उत्तर

5

मेरी नजर में SHGetSpecialFolderPath बुला CSIDL_COMMON_DOCUMENTS गुजर के साथ कुछ भी गलत नहीं है। यदि आपको XP का समर्थन करने की आवश्यकता है तो आप ज्ञात फ़ोल्डर आईडी का उपयोग नहीं कर सकते हैं। आप कोड लिख सकते हैं जो Vista और ऊपर ज्ञात फ़ोल्डर आईडी का उपयोग करता है, और पहले सिस्टम पर CSIDL पर वापस आ गया। लेकिन परेशान क्यों? एमएस ने आपके लिए SHGetSpecialFolderPath के साथ ऐसा किया है।

+0

पर काम करने की अनुमति दे सकता है मुझे 'CSIDL_COMMON_DOCUMENTS' मृत नहीं मिल रहा है मेरी 'Shlobj.pas' फ़ाइल में leration। – Shirish11

+2

इसकी कीमत $ 002E है, आपको अपने कोड में स्थिर घोषित करना होगा –

3

क्या आप shell32.dll से ShGetFolderPath का उपयोग नहीं करना चाहते हैं? यह आईई 5 या नए के साथ विंडोज 2000 का उपयोग कर मानता है।

आपको उस कोड के उपयोग के लिए shlobj जोड़ने की आवश्यकता है।

function SHGetFolderPath(hwnd: HWND; csidl: Integer; hToken: THandle; dwFlags: DWORD; pszPath: PChar): HResult; stdcall; external 'shfolder.dll' name 'SHGetFolderPathA'; 
, तो आप ऐसा

डेल्फी 7 दिनचर्या की विस्तृत संस्करण का उपयोग नहीं करता है:

स्रोत में SHGetFolderPath के लिए कोई परिभाषा नहीं है, आप कोड का उपयोग करता है यह करने से पहले निम्न का उपयोग कर सकते इस कोड का उपयोग कर सकते हैं।

+0

मैं 'है shlobj' मेरी उपयोगों खंड में है और मैं नहीं कर सकते लगता है' डेल्फी में ShGetFolderPath 7. – Shirish11

+0

आह, ShGetFolderPath आपके .dcu से नया है - मैं आपकी फ़ाइल के लिए एक परिवर्तन के साथ उत्तर अपडेट करूंगा जो इसे – Petesh

2

दाऊद जैसा कि पहले ही कहा गया है, SHGetSpecialFolderPath समारोह का उपयोग करें। Vista और W7 आपके लिए सीएसआईडीएल/फ़ोल्डर रूपांतरण करेगा। यदि आप नए एपीआई का उपयोग करना चाहते हैं, तो यह चाल के लिए होना चाहिए: कृपया ध्यान दें कि यह केवल विस्टा से ही काम करेगा।

unit Unit1; 

interface 

uses 
    Windows, ActiveX, Forms, SysUtils, OleAuto, Dialogs; 

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 


type 
TShGetKnownFolderPath = function(const rfid: TGUID; dwFlags: DWord; hToken: THandle; out ppszPath: PWideChar): HResult; stdcall; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

function ShGetKnownFolderPath(const rfid: TGUID; dwFlags: DWord; hToken: THandle; out ppszPath: PWideChar): HResult; 

var Shell: HModule; 
    Fn: TShGetKnownFolderPath; 

begin 
Shell := LoadLibrary('shell32.dll'); 
Win32Check(Shell <> 0); 
try 
    @Fn := GetProcAddress(Shell, 'SHGetKnownFolderPath'); 
    Win32Check(Assigned(Fn)); 
    Result := Fn(rfid, dwFlags, hToken, ppszPath); 
finally 
    FreeLibrary(Shell); 
end; 
end; 

function GetPublicDocuments: string; 
var 
    ret: HResult; 
    Buffer: PWideChar; 
begin 
    ret := ShGetKnownFolderPath(StringToGuid('{ED4824AF-DCE4-45A8-81E2-FC7965083634}'), 0, 0, Buffer) ; 
    OleCheck(ret); 
    try 
    Result := Buffer; 
    finally 
    CoTaskMemFree(Buffer); 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
ShowMessage(GetPublicDocuments); 
end; 

end. 
2

इस डॉक में Embarcadero द्वारा सिफारिश के रूप में: VistaUACandDelphi.pdf

Uses SHFolder; 

function GetSpecialFolder (CSIDL: Integer; ForceFolder: Boolean = FALSE): string; 
CONST SHGFP_TYPE_CURRENT = 0; 
VAR i: Integer; 
begin 
SetLength(Result, MAX_PATH); 
if ForceFolder 
then ShGetFolderPath(0, CSIDL OR CSIDL_FLAG_CREATE, 0, 0, PChar(Result))= S_ok 
else ShGetFolderPath(0, CSIDL, 0, 0, PChar(Result)); 
i:= Pos(#0, Result); 
if i> 0 
then SetLength(Result, pred(i)); 

Result:= Trail (Result); 
end; 

इस तरह यह प्रयोग करें:

s:= GetSpecialFolder(CSIDL_LOCAL_APPDATA, true); 
संबंधित मुद्दे