Работа с ассоциациями файла

Previous  Top  Next

    
 

 

 

Code:

Unit Associations;  { Subset }

 

Interface

 

Procedure RegisterFiletype( Const extension, filetype, description,

            verb: String; params: String );

Procedure RegisterFileIcon( Const filetype, iconsource: String;

                           iconindex: Cardinal );

Function FiletypeIsRegistered( Const extension, filetype: String ):

Boolean;

 

Implementation

 

Uses Windows, Classes, SysUtils, Registry;

 

ResourceString

eCannotCreateKey =

  'Cannot create key %s, the user account may not have the required '+

  'rights to create registry keys under HKEY_CLASSES_ROOT.';

 

Type

ERegistryError = Class( Exception );

 

 

{+------------------------------------------------------------

| Procedure CreateKey

|

| Visibility : restricted to unit

| Description:

|   This is a helper function which uses the passed reg object

|   to create a registry key.

| Error Conditions:

|   If the key cannot be created a ERegistryError exception is

|   raised.

| Created: 14.03.99 by P. Below

+------------------------------------------------------------}

Procedure CreateKey( reg: TRegistry; Const keyname: String );

Begin

   If not reg.OpenKey( keyname, True ) Then

     raise ERegistryError.CreateFmt( eCannotCreateKey, [keyname] );

End; { CreateKey }

 

 

{+------------------------------------------------------------

| Procedure InternalRegisterFiletype

|

| Parameters :

|   extension  : file extension, including the dot, to register

|   filetype   : string to use as key for the file extension

|   description: string to show in Explorer for files with this

|                extension. If description is empty the file

|                type will not show up in Explorers list of

|                registered associations!

|   verb       : action to register, 'open', 'edit', 'print' etc.

|                The action will turn up as entry in the files

|                context menu in Explorer.

|   serverapp  : full pathname of the executable to associate with

|                the file extension, including any command line

|                switches. Include the "%1" placeholder as well.

|                Actions like printto may require more than one

|                placeholder.

| Visibility : restricted to unit

| Description:

|   Creates the three basic registry keys for a file extension.

|   HKCR\<extension> = <filetype>

|   HKCR\<filetype>  = <description>

|   HKCR\<filetype>\shell\<verb>\command = <serverapp>

|   If the keys already exist they are overwritten!

| Error Conditions:

|   A ERegistryError exception will result if a key cannot be

|   created. Failure to create a key is usually due to insufficient

|   user rights and only a problem on NT.

| Created: 14.03.99 by P. Below

+------------------------------------------------------------}

 

 

Procedure InternalRegisterFiletype( Const extension, filetype,

description,

            verb, serverapp: String );

Var

   reg: TRegistry;

   keystring: String;

Begin

   reg:= TRegistry.Create;

   Try

     reg.Rootkey := HKEY_CLASSES_ROOT;

     CreateKey( reg, extension );

     reg.WriteString( '', filetype );

     reg.CloseKey;

     CreateKey( reg, filetype );

     reg.WriteString('', description );

     reg.closekey;

     keystring := Format('%s\shell\%s\command', [filetype, verb] );

     CreateKey( reg, keystring );

     reg.WriteString( '', serverapp);

     reg.CloseKey;

   Finally

     reg.free;

   End;

End; { InternalRegisterFiletype }

 

 

{+------------------------------------------------------------

[OBJECT]

| Procedure RegisterFiletype

[OBJECT]

|

| Parameters :

|   extension  : file extension, including the dot, to register

|   filetype   : string to use as key for the file extension

|   description: string to show in Explorer for files with this

|                extension. If description is empty the file

|                type will not show up in Explorers list of

|                registered associations!

|   verb       : action to register, 'open', 'edit', 'print' etc.

|                The action will turn up as entry in the files

|                context menu in Explorer.

|   params     : The command line parameters to pass to the

|                app when a file action is requested. If this

|                parameter is empty "%1" is used by default.

| Visibility : exported from unit

| Description:

|   Builds the commandline to use from the applications filename

|   and the passed params and hands the rest of the work off to

|   InternalRegisterFiletype.

| Error Conditions: none

| Created: 20.03.99 by P. Below

+------------------------------------------------------------}

Procedure RegisterFiletype( Const extension, filetype, description,

            verb: String; params: String );

Begin

   If Length(params) = 0 Then

     params := '"%1"';

   InternalRegisterFiletype(

     extension, filetype, description, verb,

     ParamStr(0) + ' ' + params );

End; { RegisterFiletype }

 

 

{+------------------------------------------------------------

| Procedure RegisterFileIcon

|

| Parameters :

|   filetype  : file type key name to register the icon for

|   iconsource: full pathname of the executable or ICO file

|               that contains the icon

|   iconindex : index of the icon to use, if several are containd

|               in iconsource. Counts from 0!

| Visibility : exported from unit

| Description:

|   Creates the registry keys required to tell Explorer which icon

|   to display for files of this type. RegisterFileType needs

|   to be called first to associate the filetype with an extension.

|   The registry key added is

|   HKCR\<filetype>\DefaultIcon = <iconsource>,<iconindex>

|   If the key already exists it is overwritten!

|   The icon specified should contain both large (32*32) and small

|   (16*16) versions of the icon, to optain optimal display

|    quality. If only one icon format is present Windows will

|    generate the other from it.

| Error Conditions:

|   A ERegistryError exception will result if a key cannot be

|   created. Failure to create a key is usually due to insufficient

|   user rights and only a problem on NT.

| Error Conditions: none

| Created: 21.03.99 by P. Below

+------------------------------------------------------------}

Procedure RegisterFileIcon( Const filetype, iconsource: String;

                           iconindex: Cardinal );

Var

   reg: TRegistry;

   keystring: String;

Begin

   reg:= TRegistry.Create;

   Try

     reg.Rootkey := HKEY_CLASSES_ROOT;

     keystring := Format( '%s\DefaultIcon',[filetype] );

     CreateKey( reg, keystring );

     reg.WriteString( '', Format( '%s,%d', [iconsource,iconindex] ));

     reg.CloseKey;

   Finally

     reg.free;

   End;

End; { RegisterFileIcon }

 

 

 

{+------------------------------------------------------------

[OBJECT]

| Function FiletypeIsRegistered

[OBJECT]

|

| Parameters :

|   extension  : file extension, including the dot, to search for

|   filetype   : string to use as key for the file extension

| Returns    : True if this application is registered as server

|              for the 'open' action, false otherwise.

| Visibility : exported from unit

| Description:

|   Checks if there is a registry entry for the passed extension,

|   if it is associated with the expected file type and if this

|   application is registered as server for the 'open' action.

| Error Conditions: none

| Created: 21.03.99 by P. Below

+------------------------------------------------------------}

Function FiletypeIsRegistered( Const extension, filetype: String ):

Boolean;

Var

   reg: TRegistry;

   keystring: String;

Begin

   Result := False;

   reg:= TRegistry.Create;

   Try

     reg.Rootkey := HKEY_CLASSES_ROOT;

     If reg.OpenKey(extension, false) Then Begin

       { Extension is registered, check filetype }

       keystring := reg.ReadString('');

       reg.Closekey;

       If CompareText( keystring, filetype) = 0 Then Begin

         { Filetype is registered for this extension, check server. }

         keystring := Format( '%s\shell\open\command',[filetype] );

         If reg.OpenKey( keystring, false ) Then Begin

           { Command key exists, but is this app the server? }

           keystring := UpperCase( reg.ReadString(''));

           reg.CloseKey;

           If Pos( UpperCase(ParamStr(0)), keystring ) = 1 Then Begin

             { Yes, server matches! }

             Result := True;

           End; { If }

         End; { If }

       End; { If }

     End; { If }

   Finally

     reg.free;

   End;

End; { FiletypeIsRegistered }

End { Unit Associations }.

©Drkb::01743