Difference between revisions of "Windows Programming Tips"

From Free Pascal wiki
Jump to navigationJump to search
(→‎Creating a shortcut (.lnk) file: Easier shortcut example)
m (Added to example programs category)
Line 112: Line 112:
 
     writeln('Your local appdata path is: ' + AppDataPath);
 
     writeln('Your local appdata path is: ' + AppDataPath);
 
</delphi>
 
</delphi>
 +
 +
[[category:Example programs]]

Revision as of 15:10, 3 February 2012

This page is dedicated to desktop Windows programming tips.

Other Interfaces

Platform specific Tips

Interface Development Articles

Articles about Windows Programming

  • High DPI - How to make your application DPI-aware on Windows 7.
  • Aero Glass - How to apply Aero Glass effect in a Lazarus Form on Windows 7.
  • Windows Icon - How to design your icon with the right sizes.
  • Inno Setup Usage - How to create setup files with File Association support.

Windows specific compiler options

The most prominent options are the -W flags. A GUI application requires the -WG flag. See Project Options / Compiler Options / Linking / Target OS Specific options / Win32 GUI application. No console is shown, writeln and readln are not possible, you will get File not open errors. Omitting this option creates a console application (same as passing -WC).

Code snippets

Listing all available drives

<delphi> program listdevices;

{$ifdef fpc}{$mode delphi}{$endif} {$apptype console}

uses

 Windows;

var

 Drive: Char;
 DriveLetter: string;

begin

 WriteLn('The following drives were found in this computer:');
 WriteLn();
 // Search all drive letters
 for Drive := 'A' to 'Z' do
 begin
   DriveLetter := Drive + ':\';
  
   case GetDriveType(PChar(DriveLetter)) of
    DRIVE_REMOVABLE: WriteLn(DriveLetter + ' Floppy Drive');
    DRIVE_FIXED:     WriteLn(DriveLetter + ' Fixed Drive');
    DRIVE_REMOTE:    WriteLn(DriveLetter + ' Network Drive');
    DRIVE_CDROM:     WriteLn(DriveLetter + ' CD-ROM Drive');
    DRIVE_RAMDISK:   WriteLn(DriveLetter + ' RAM Disk');
   end;
 end;
 // Also add a stop to see the result under Windows
 WriteLn();
 WriteLn('Please press <ENTER> to exit the program.');
 ReadLn(DriveLetter);

end. </delphi>

Creating a shortcut (.lnk) file

Creating a shortcut on the desktop (can be easily adapted to any location). Adapted from post by Felipe Monteiro de Carvalho The ISLink object has more methods that you can use to modify your shortcut...

<delphi> uses ... windows, shlobj {for special folders}, ActiveX, ComObj; ... procedure CreateDesktopShortCut(Target, TargetArguments, ShortcutName: string); var

 IObject: IUnknown;
 ISLink: IShellLink;
 IPFile: IPersistFile;
 PIDL: PItemIDList;
 InFolder: array[0..MAX_PATH] of Char;
 TargetName: String;
 LinkName: WideString;

begin

 { Creates an instance of IShellLink }
 IObject := CreateComObject(CLSID_ShellLink);
 ISLink := IObject as IShellLink;
 IPFile := IObject as IPersistFile;
 ISLink.SetPath(pChar(Target));
 ISLink.SetArguments(pChar(TargetArguments));
 ISLink.SetWorkingDirectory(pChar(ExtractFilePath(Target)));
 { Get the desktop location }
 SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL);
 SHGetPathFromIDList(PIDL, InFolder);
 LinkName := InFolder + PathDelim + ShortcutName+'.lnk';
 { Create the link }
 IPFile.Save(PWChar(LinkName), false);

end;

</delphi>

Getting special folders (My documents, Desktop, local application data, etc)

Often it is useful to get the location of a special folder such as the desktop. The example below shows how you can get the LocalAppData directory - where the Lazarus installer stores its configuration by default. Look in the shlobj unit for more defines that let you look up the Desktop, Recycle Bin, etc. <delphi> uses ... shlobj;

var

 AppDataPath: Array[0..MaxPathLen] of Char; //Allocate memory

... begin ...

   AppDataPath:=;
   SHGetSpecialFolderPath(0,AppDataPath,CSIDL_LOCAL_APPDATA,false);
   writeln('Your local appdata path is: ' + AppDataPath);

</delphi>