Smart questions
Smart answers
Smart people
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Member Login

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips now!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

Join Tek-Tips
*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

LINK TO THIS FORUM!

Add Stickiness To Your Site By Linking To This Professionally Managed Technical Forum.
Just copy and paste the
code below into your site.

Partner With Us!

"Best Of Breed" Forums Add Stickiness To Your Site
Partner Button
(Download This Button Today!)

Feedback

"...I'm a freelance consultant, and your site's helped me with many issues. I just wanted you to know that someone does appreciate the intelligent help your site offers."

Geography

Where in the world do Tek-Tips members come from?

Microsoft: Visual FoxPro FAQ

API Functions

How to register a file type and icon with Windows?
Posted: 29 Jul 03

Q: I have written a small word processing program in VFP. I have given the extension ".RST". When I view the .rst files in Windows Explorer, the default Windows icon is displayed. I want my own icon to appear.

A: This requires some registry modifications:

* load api functions
DECLARE INTEGER RegOpenKeyEx IN Win32API ;
    INTEGER nKey, STRING @cSubKey, INTEGER nReserved, ;
    INTEGER nAccessMask, INTEGER @nResult

DECLARE INTEGER RegQueryValue IN WIN32API INTEGER nKey, ;
    STRING @cSubKey, STRING @cBuffer, INTEGER nBufferSize

DECLARE INTEGER RegQueryValueEx IN Win32API INTEGER nKey, ;
    STRING cValueName, INTEGER nReserved, ;
    INTEGER @nType, STRING @cBuffer, INTEGER @nBufferSize

DECLARE INTEGER RegCloseKey IN Win32API INTEGER nKey

DECLARE RegCreateKeyEx IN ADVAPI32.DLL INTEGER, STRING, INTEGER, ;
    STRING, INTEGER, INTEGER, INTEGER, INTEGER @, INTEGER @

DECLARE RegSetValueEx IN ADVAPI32.DLL INTEGER, STRING, INTEGER, ;
   INTEGER, STRING, INTEGER

DECLARE RegCloseKey IN ADVAPI32.DLL INTEGER nHKey

DECLARE SHChangeNotify IN Shell32.DLL INTEGER, INTEGER, STRING, STRING

DECLARE INTEGER RegOpenKey IN ADVAPI32.DLL INTEGER hKey, ;
   STRING lpSubKey, INTEGER @phkResult

DECLARE INTEGER RegCreateKey IN ADVAPI32.DLL INTEGER nHKey, ;
    STRING @cSubKey, INTEGER @nResult

* some constants
#DEFINE EXEFILE "c:\program files\myfolder\myapp.exe" && your program file name and path here
#DEFINE EXEDESC "My Application" && your app description here
#DEFINE FILE_EXT ".RST" && your file type here
#DEFINE SECURITY_ACCESS_MASK 983103
#DEFINE SHCNE_ASSOCCHANGED 0x08000000
#DEFINE SHCNF_IDLIST 0x0000
#DEFINE HKEY_CLASSES_ROOT -2147483648
#DEFINE HKEY_CURRENT_USER -2147483647
#DEFINE HKEY_LOCAL_MACHINE -2147483646
#DEFINE HKEY_USERS -2147483645
#DEFINE KEY_ALL_ACCESS 0x3F

* create a registry key for your application
lcExe = FORCEEXT(JUSTFNAME(EXEFILE), "")
lnResult=0
lnDisplay=0
lcKeyName = lcExe
lcKeyValue = EXEDESC
lnKeyLen = LEN(lcKeyValue)
RegCreateKeyEx(HKEY_CLASSES_ROOT, lcKeyName, 0, "REG_SZ", 0, SECURITY_ACCESS_MASK, 0, @lnResult, @lnDisplay)
RegSetValueEx(lnResult, "", 0, 1, lcKeyValue, lnKeyLen)
RegCloseKey(@lnResult)

* register your file type
lnResult= 0
lnDisplay = 0
lcKeyName = ".RST"
lcKeyValue = lcExe
lnKeyLen = LEN(lcKeyValue)
RegCreateKeyEx(HKEY_CLASSES_ROOT, lcKeyName, 0, "REG_SZ", 0,SECURITY_ACCESS_MASK, 0, @lnResult, @lnDisplay)
RegSetValueEx(lnResult, "", 0, 1, lcKeyValue, lnKeyLen)
RegCloseKey(@lnResult)

* register the command that has to be executed when the file type is double clicked in Windows Explorer
lnResult= 0
lnDisplay = 0
lcKeyName = lcExe + "\shell\open\command"
* if you want to pass the file name that was doubleclicked in Explorer as a parameter, then
* replace the following line with:
* lcKeyValue = EXEFILE + " %1"
lcKeyValue = EXEFILE
lnKeyLen = LEN(lcKeyValue)
RegCreateKeyEx(HKEY_CLASSES_ROOT, lcKeyName, 0, "REG_SZ", 0, SECURITY_ACCESS_MASK, 0, @lnResult, @lnDisplay)
RegSetValueEx(lnResult, "", 0, 1, lcKeyValue, lnKeyLen)
RegCloseKey(@lnResult)

* add a reference top the icon.
* note: Windows 'extracts' the icon that was attached to the exe/project at design time
lnResult= 0
lnDisplay = 0
lcKeyName = lcExe + "\DefaultIcon"
lcKeyValue = EXEFILE + ",0" && ",0" is a pointer to the icon inside the .EXE
lnKeyLen = LEN(lcKeyValue)
RegCreateKeyEx(HKEY_CLASSES_ROOT, lcKeyName, 0, "REG_SZ", 0, SECURITY_ACCESS_MASK, 0, @lnResult, @lnDisplay)
RegSetValueEx(lnResult, "", 0, 1, lcKeyValue, lnKeyLen)
RegCloseKey(@lnResult)

* Instruct Windows to refresh the icon & file type information
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL)

Back to Microsoft: Visual FoxPro FAQ Index
Back to Microsoft: Visual FoxPro Forum

My Archive

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close