ShellPlus Customer login
Shell+ components
    Customer's area
    Flash Demo
Developer Tools
    Shell Reset Tool
Shell+ Tutorial
    Namespace Extensions
    ShortCut menu
    Property Sheet
    Icon Handler
    InfoTip Handler
    Copy Hook
    Balloon TrayIcon
    Control Panel
    Shortcut Files
    Drag&Drop Menu
    Shell Change Notify
    Articles Index
    Press Releases
    Buy now
    Resellers network
    Resellers wanted
    Contact directly
    Customer's area
    Shell+ Developers

Embarcader Technology Partner

Shell+ 3.2 release notes

We are glad to announce the release of version 3.2. This article describes the features introduced in releases starting from 3.1. For examples we used code from our standard examples as well as from our end-user product, which Windows Shell-part is completely built using Shell+ components - Romeo Burner.

  • Delphi 2007 support
  • Windows Vista support
    • Explorer Command Bar
    • Extra-large icons
    • Vista-background on TsxExplorerBar component
  • Unicode support
  • TsxShellFolder: option to show/hide icon on the desktop without unregistering NSE
  • TsxShellView: added properties SelectedGrain and SelectedGrainList
  • New event: TsxByHandProvider.OnGetGrainFileContentsEx that optimizes memory operations for large data transfer
  • TsxExplorerToolbar drop-down buttons


Delphi 2007 support

Version 3.2 introduces support for CodeGear Delphi 2007. Many people asking about implementing shell extensions for Windows x64. Unfortunately this will be possible only with Delphi x64 (CodeGear planned to release it at the end of 2008). Windows x64 can simulate 32-bit operating system for standalone applications, but shell extensions are DLL and 32-bit DLL can't work inside of 64-bit process.


Windows Vista Support

Starting from version 3.1 we provide support Windows Vista and it's new features such as Command Bar, various icon sizes and background.

CommandBar element in Windows Vista replaces old-styled toolbar. With Shell+ Command Bar items can be added for virtual folders of namespace extension. Here is the example how Command Bar looks in Romeo:

Command Bar

CommandBar implemented using TsxExplorerCommandsModule component. It's Commands property contain information about items and subitems of Command Bar. Every item is linked with MenuItem (from TsxPopupMenu component), so everything works just like TsxExplorerToolbar or TsxExplorerMenu components. You can handle OnUpdateExplorerCommands or OnUpdateItemState (event of CommandBar item) to update visibility and state of any item in the CommandBar.

For some reason Microsoft implemented CommandBar such way that its icons can be loaded only from resources or external file. Shell+ provides a bit flexibility. You can assign icon to the CommandBar item. It will be stored in DFM resource and automatically stored to temporary file and loaded in runtime. This is the simpliest way to develop this functionality. In Romeo we stored all icons in resource file linked to the project and loaded icons by handling OnGetIconResName event of CommandBar item. It's DllFileName property shall receive path to the DLL with resources and index of icon resource within that DLL.

The TsxExplorerCommandsModule must be connected to ShellView component using CommandsModule property.


Windows Vista introduces wide range of shell views and new icon size - Jumbo (256x256):

Vista Large Icons

To provide support for various icon sizes we added property Icons to DataProvider component. This property contains list of TsxIconList components filled with icons of different sizes. They must have synchronious indexes and image counts.

  function __LoadIcon(const ImageList: TSxIconList; const ResName: String): Integer; overload;
    tmpIcon: HICON;
    tmpIcon := LoadIcon(ResName, ImageList.Width);
    if tmpIcon = 0 then
      Result := -1 else
      Result := ImageList.AddIcon(tmpIcon);

  function __LoadIcon(const ResName: String): Integer; overload;
    // Small icon
    Result := __LoadIcon(imlSmall, ResName);
    // Large icon
    __LoadIcon(imlLarge, ResName);
    // Extra-Large icon
    __LoadIcon(imlExtraLarge, ResName);
    // Jumbo icon
    if RunningOnWinVistaAndHigher then
      __LoadIcon(imlJumbo, ResName);

Above is the code example from Romeo Burner that load icon of specified name from DLL resources.

To make your software look similar with Windows Vista we implemented automatic background fill for Explorer Band objects:

Vista Information Band

To make your Explorer Band look seamless with Windows Vista just turn on DrawVistaBg property in Options property of TsxExplorerBand component.


Unicode support

Shell+ 3.1 also introduced support for Unicode. Any information displayed within Windows Shell can be unicode. To keep backward compatibility we added unicode alternatives to all methods in Shell+ that work with strings. These methods have "W" letter at the end of it's name. For example: OnShellExtInitW.

Utility functions and classes with unicode support are collected in unit SxUnicode. Here is the list of them:

function MapStrToWideStr(const Value: String): WideString;
function PosW(const Substr: WideString; const S: WideString): Integer;
function StrCopyW(Dest: PWideChar; const Source: PWideChar): PWideChar; overload;
function StrCopyW(Dest: PWideChar; const Source: WideString): PWideChar; overload;
procedure SetStringW(var S: WideString; Buffer: PWideChar; Len: Integer);
function StrPasW(Source: PWideChar; StringLength: Integer = 0): WideString;
function StrLenW(Source: PWideChar): Cardinal;
function StrScanW(Str: PWideChar; Chr: WideChar): PWideChar;
function StrEndW(Str: PWideChar): PWideChar;
function StrMoveW(Dest: PWideChar; const Source: PWideChar; Count: Cardinal): PWideChar;
function StrAllocW(Size: Cardinal): PWideChar;
function StrNewW(Str: PWideChar): PWideChar;
function AnsiUpperCaseW(const S: WideString): WideString;
function AnsiLowerCaseW(const S: WideString): WideString;
function UpCaseW(const S: WideChar): WideChar;
procedure StrPCopyW(Dest: PWideChar; Source: WideString);
procedure StrPLCopyW(Dest: PWideChar; Source: WideString; MaxLen: Cardinal);
function UpperCaseW(Str: WideString): WideString;
function LowerCaseW(Str: WideString): WideString;
function SxCompareStrW(const W1, W2: WideString; const LocaleId: LCID): Integer;
function SxStringReplaceW(const S, OldPattern, NewPattern: WideString;
  Flags: TReplaceFlags) : WideString;
function SxTrailingBackslashIncludedW(const S: WideString): Boolean;
function SxIncludeTrailingBackslashW(const S: WideString): WideString;
function SxExcludeTrailingBackslashW(const S: WideString): WideString;
function SxChangeFileExtW(const FileName, Extension: WideString): WideString;
function SxExtractFileExtW(const FileName: WideString): WideString;
function SxExtractFileNameW(const FileName: WideString): WideString;
function SxExtractFileDirW(const FileName: WideString): WideString;
function SxExtractFilePathW(const FileName: WideString): WideString;
function SxExtractFileDriveW(const FileName: WideString): WideString;
function SxExtractOwnerDirNameW(const FileName: WideString): WideString;
function SxGetWinPathW: WideString;
function SxGetWinSysPathW: WideString;
function SxGetWinTempPathW: WideString;
function SxGetLocalAppDataPathW: WideString;
function SxValidFile(const FileName: WideString): Boolean; overload;
function SxIsFile(const Attributes: DWORD): Boolean; overload;
function SxIsFile(const FileName: WideString): Boolean; overload;
function SxIsDirectory(const Attributes: DWORD): Boolean; overload;
function SxIsDirectory(const Path: WideString): Boolean; overload;
function SxIsUrl(const Str: WideString): Boolean; overload;
function SxIsLocalFile(const Str: WideString): Boolean; overload;
function SxIsRemoteFile(const Str: WideString): Boolean; overload;
function SxIsLocalOrRemoteFile(Str: WideString): Boolean; overload;
function SxForceDeleteFile(const FileName: WideString): Boolean; overload;
function FileExistsW(const FileName: WideString): Boolean;
function SxFileExistsW(const FileName: WideString): Boolean;
function SxDirectoryExistsW(const Directory: WideString): Boolean;
function SxDirectoryEmptyW(const Directory: WideString): Boolean;
function SxRootDirectoryExistsW(const Directory: WideString): Boolean;
function SxForceDirectoriesW(Directory: WideString): Boolean;
function SxRemoveDeepDir(DirectoryName: WideString;
  const RemoveRoot: Boolean = True; const FileMask: WideString = '*.*'): Boolean; overload;
function SxGetFileSize(const FileName: WideString): Int64; overload;
function SxGetTempFileNameW(FileExt: WideString = '.tmp';
  const FileNamePrefix: WideString = ''; const FilePath: WideString = ''): WideString;

Show or Hide desktop icon of NSE

With version 3.2 component TsxVirtualFolder got new property - DesktopIconVisible. It is used to show/hide icon on the Windows Desktop without unregistering the shell extension. Often user doesn't like to see something else than Recycle Bin on their desktop.


New ShellView runtime properties

TsxSysShellView also got two new properties: SelectedGrain and SelectedGrainList. They are very useful in events like TsxExplorerToolbar.OnUpdateToolbar. By checking these properties you can decide whether to enable, disable, hide or show some specific buttons or CommandBar items.


File transfer memory optimization

TsxByHandProvider have got new useful event: OnGetGrainFileContentsEx. It provides you a structure TGrainFileContents with different kinds of stream objects to work with.


Drop-down buttons for Explorer Toolbar

Starting from version 3.2 TsxExplorerToolBar component supports drop-down buttons. This can be easily done by adding subitems to the menu item that assigned to the Explorer Button object (TsxExplorerToolbar.Buttons property).

Components | Download | Purchase | Support | About Us
Copyright © 2016 ALDYN Software. All rights reserved.
Copyright © 2001 - 2011 Shell+ Development Group. All rights reserved.