Difference between revisions of "Windows Programming Tips"

From Lazarus wiki
Jump to navigationJump to search
(Link to LazActiveX)
(add link to shlobj.pp)
Line 116: Line 116:
 
===Getting special folders (My documents, Desktop, local application data, etc)===
 
===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.
 
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.
+
Look in the [http://delphi-miranda-plugins.googlecode.com/svn-history/r105/trunk/FPC/units/src/shlobj.pp shlobj] unit for more defines that let you look up the Desktop, Recycle Bin, etc.
 
<syntaxhighlight>
 
<syntaxhighlight>
 
uses  
 
uses  

Revision as of 15:17, 2 October 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).

COM Programming

Importing and using a COM library

The first step to import and use a COM library is generating the interface definitions from it. Use the program importtl which is located in Free Pascal in fpc/utils/importtl. A pre-compiled binary of this program can be found here: http://sourceforge.net/projects/p-tools/files/ImportTL/

You can call it, for example for MSAA like this:

importtl.exe C:\Windows\system32\oleacc.dll

And it will generate the type library pascal unit Accessibility_1_1_TLB.pas in the folder where it is.

Creating a library which exports a COM object

ToDo: write me

ActiveX controls

You can use ActiveX controls in recent Lazarus versions. See LazActiveX

Code snippets

Listing all available drives

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.

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...

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;

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.

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);