Microsoft KB Archive/247529

= How To Associate a Custom Icon with a File Extension =

PSS ID Number: 247529

Article Last Modified on 6/29/2004

-

The information in this article applies to:


 * Microsoft Visual Basic Learning Edition for Windows 5.0
 * Microsoft Visual Basic Learning Edition for Windows 6.0
 * Microsoft Visual Basic Professional Edition for Windows 5.0
 * Microsoft Visual Basic Professional Edition for Windows 6.0
 * Microsoft Visual Basic Enterprise Edition for Windows 5.0
 * Microsoft Visual Basic Enterprise Edition for Windows 6.0

-



This article was previously published under Q247529



SUMMARY
Generally, a file type associated with an executable is given the icon of the executable. For example, a Microsoft Excel file displays the Microsoft Excel icon, and a Microsoft Word file displays the Microsoft Word icon. However, if you associate a file extension with an .exe file, it uses the default Windows icon. This article explains how to associate an icon with a file extension.

When the custom icon is associated with a particular file type in the registry, the new default icon may not be recognized by Windows until the computer is restarted. This can be prevented by making an API call to notify Windows that the icon has changed.



MORE INFORMATION
This article uses the techniques described in Microsoft Knowledge Base article Q185453 to associate a file extension with a Microsoft Visual Basic .exe file. You can also associate icons by including another key in the registry for the default icon. The user must have permission to write to the registry.

Step-by-Step Example
 Copy an icon into the application directory and name it myIcon.ico. Start a new Visual Basic Standard EXE project. Form1 is created by default. On the Project menu, select Project1 properties. Set the Project Name field to MyApp. On the Project menu, choose Components. In the Components dialog box, select "Microsoft RichTextBox Control" and click OK. Cite an instance of the RichTextBox control on Form1.  Add the following code to the General Declarations section of Form1: Option Explicit

Private Declare Function RegCreateKey Lib "advapi32.dll" _ Alias "RegCreateKeyA" (ByVal hKey As Long, _                       ByVal lpSubKey As String, _                        phkResult As Long) As Long Private Declare Function RegSetValue Lib "advapi32.dll" _ Alias "RegSetValueA" (ByVal hKey As Long, _                      ByVal lpSubKey As String, _                       ByVal dwType As Long, _                       ByVal lpData As String, _                       ByVal cbData As Long) As Long

' Return codes from Registration functions. Const ERROR_SUCCESS = 0& Const ERROR_BADDB = 1& Const ERROR_BADKEY = 2& Const ERROR_CANTOPEN = 3& Const ERROR_CANTREAD = 4& Const ERROR_CANTWRITE = 5& Const ERROR_OUTOFMEMORY = 6& Const ERROR_INVALID_PARAMETER = 7& Const ERROR_ACCESS_DENIED = 8&

Private Const HKEY_CLASSES_ROOT = &H80000000 Private Const MAX_PATH = 260& Private Const REG_SZ = 1

Private Declare Sub SHChangeNotify Lib "shell32.dll" _ (ByVal wEventId As Long, _           ByVal uFlags As Long, _            dwItem1 As Any, _            dwItem2 As Any)

Const SHCNE_ASSOCCHANGED = &H8000000 Const SHCNF_IDLIST = &H0&

Private Sub Form_Click Dim sKeyName As String  ' Holds Key Name in registry. Dim sKeyValue As String ' Holds Key Value in registry. Dim ret&          ' Holds error status if any from API calls. Dim lphKey&       ' Holds  key handle from RegCreateKey. Dim path As String

path = App.path If Right(path, 1) <> "\" Then path = path & "\" End If

' This creates a Root entry called "MyApp". sKeyName = "MyApp" sKeyValue = "My Application" ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&) ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&)

' This creates a Root entry called .BAR associated with "MyApp". sKeyName = ".BAR" sKeyValue = "MyApp" ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&) ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&)

' This sets the command line for "MyApp". sKeyName = "MyApp" sKeyValue = path & "MyApp.exe %1" ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&) ret& = RegSetValue&(lphKey&, "shell\open\command", REG_SZ, _                      sKeyValue, MAX_PATH)

' This sets the icon for the file extension sKeyName = "MyApp" sKeyValue = path & "myIcon.ico" ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&) ret& = RegSetValue&(lphKey&, "DefaultIcon", REG_SZ, _                      sKeyValue, MAX_PATH) ' This notifies the shell that the icon has changed SHChangeNotify SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0

End Sub

Private Sub Form_Load ' When the file is double clicked the name is stored in Command

RichTextBox1.LoadFile Command End Sub  From the File menu, choose Make Project1.exe and compile the project as MyApp.exe.</li> In the application directory, create a text file named myFile.bar and enter some text into it. The file displays the default Windows icon.</li>  Now run MyApp.exe and click on the form. This creates the following structure in the Registry: <pre class="fixed_text">.bar = MyApp MyApp = My Application |         -- DefaultIcon= myIcon.ico |        -- Shell |              open |                    --command = MyApp.exe %1 </li> The icon of myFile.bar is changed to myIcon.ico.</li> Double-clicking myFile.bar starts MyApp.exe and the text is seen in the RichTextBox control.</li></ol>

<div class="references_section">