Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите получить путь к системной папке


Автор: Zlo 8.12.2009, 20:46
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

const
 CSIDL_PERSONAL = 5;
 SHGFP_TYPE_CURRENT = 0;

function SHGetFolderPath(wnd: HWND; csIdl: LongInt; dwFlags: DWORD; hToken: THandle; szPath: PChar):HRESULT;stdcall;
                        external 'shell32.dll' name 'SHGetFolderPathA';

var buf: array[0..MAX_PATH-1] of char;

begin

  SHGetFolderPath(0, CSIDL_PERSONAL, 0, SHGFP_TYPE_CURRENT, @buf);
  WriteLn('My Documents path: ', StrPas(@buf));

end.

Дельфя ругается на:
Код

StrPas(@buf)

А если поставить:
Код

Pchar(@buf)

то компилится, но выводит иероглифы :(
Как быть? Тут главное чтоб без использования доп библиотек вроде ShlObj

Может у кого есть готовый примерчик? уж очень не хочется тащиться в реестр за инфой...

Автор: THandle 8.12.2009, 21:38
Цитата(Zlo @  8.12.2009,  21:46 Найти цитируемый пост)
то компилится, но выводит иероглифы :(


Это из за WriteLn smile Он не выводит русские символы просто так. smile

Используй вместо WriteLn процедуру типа:
Код


procedure Console_WriteLine(const AStr: WideString);
begin
  WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), PWideChar(AStr),
    Length(AStr), PDWORD(nil)^, nil);
end;


Да и вообще код на юникод переделай.

Автор: Демо 8.12.2009, 21:43
Либо так:
Код

var
  s: AnsiString;

begin
  SetLength(s,MAX_PATH);
  SHGetFolderPath(0, CSIDL_PERSONAL, 0, SHGFP_TYPE_CURRENT, @s[1]);
  s := PAnsiChar(s);
  WriteLn('My Documents path: ', WideString(s));
  Readln;


Автор: Zlo 8.12.2009, 22:13
Спасибо ребята! А то я замучился.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)