【问题标题】:Getting Vista Folder Paths获取 Vista 文件夹路径
【发布时间】:2012-04-04 07:55:58
【问题描述】:

为什么这不能在 Delphi 2009 中编译?

unit VistaFolders;

interface

uses Windows, ShellAPI, ShlObj;

type
  KNOWNFOLDERID = TGuid;

const
  FOLDERID_ProgramData: KNOWNFOLDERID =
    '{374DE290-123F-4565-9164-39C4925E467B}'; // downloads folder

var
  SHGetKnownFolderPathFunc: function( const rfid: KNOWNFOLDERID;
    dwFlags: DWORD; hToken: THandle; var ppszPath: PWideChar ): HResult; stdcall;
  SHGetKnownFolderIDListFunc: function( const rfid: KNOWNFOLDERID;
    dwFlags: DWORD; hToken: THandle; var ppidl: PItemIDList ): HResult; stdcall;

  function GetDownloadsFolderPath: string;

implementation

uses ActiveX;

function PathFromIDList( Pidl: ShlObj.PItemIdList ): string;
var
  Path: array[ 0..MAX_PATH ] of Char;
begin
  if SHGetPathFromIDList( Pidl, Path ) then
    Result := Path
  else
    Result := '';
end;

function GetDownloadsFolderPath: string;
var
  Path: PWideChar;
  Pidl: PItemIdList;
begin
  Result := '';
  if @SHGetKnownFolderPathFunc <> nil then
  begin
    if Succeeded( SHGetKnownFolderPathFunc( FOLDERID_ProgramData, 0, 0, Path ) ) then
      begin
        try
          Result := Path;
        finally; CoTaskMemFree( Path ); end;
        Exit;
      end;
  end
  else if @SHGetKnownFolderIDListFunc <> nil then
  begin
    if Succeeded( SHGetKnownFolderIDListFunc( FOLDERID_ProgramData, 0, 0, Pidl ) ) then
      begin
        try
          Result := PathFromIDList( Pidl );
        finally; CoTaskMemFree( Pidl ); end;
        Exit;
      end;
  end;
  if Succeeded( SHGetFolderLocation( 0, CSIDL_PROFILE, 0, 0, Pidl ) ) then
    try
      Result := PathFromIDList( Pidl ) + '\Downloads';
    finally; CoTaskMemFree( Pidl ); end;
end;

procedure InitVistaFunctions;
var
  hShell32: THandle;
begin
  hShell32 := GetModuleHandle( 'SHELL32' );
  @SHGetKnownFolderPathFunc := Windows.GetProcAddress( Shell32, 'SHGetKnownFolderPath' );
  @SHGetKnownFolderIDListFunc := Windows.GetProcAddress( Shell32, 'SHGetKnownFolderIDList' );
end;

initialization
  InitVistaFunctions;

end.

【问题讨论】:

  • 谢谢...现在可以完美运行了。
  • 编译器通常会告诉你为什么有些东西不能编译。不要让其他人猜测。当您询问问题所在时,包括编译器的错误消息和位置。
  • @Bill Miller:如果 mghie 的回答有帮助,您可以通过勾选他的回答旁边的复选标记来“接受”它。

标签: delphi delphi-2009


【解决方案1】:

因为您在GetProcAddress 调用中给出了Shell32 而不是hShell32

如果你想知道为什么它会失败

没有可以使用这些参数调用的“GetProcAddress”的重载版本

您可以按住 ctrl 单击第一个参数,IDE 会将您带到编译器为 Shell32 找到的常量。

【讨论】:

    【解决方案2】:

    对于其他想使用上述代码的人来说,Delphi 2010(可能是 2009 年?)有一个名为 KnownFolders.pas 的单元,其中包含所有其他 FOLDERID_ 常量 例如: FOLDERID_RoamingAppData: TGUID = '{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}';

    【讨论】:

      【解决方案3】:

      在Delphi 2010中,所有的SHGetKnownFile函数都定义在单元“shlobj”中 FOLDERID 常量在 KnownFolders 中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-25
        • 2017-11-03
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2012-04-29
        • 2011-07-31
        相关资源
        最近更新 更多