Menu

Windows_Registry_Implementation

Christian Walther Andrea Viarengo

pipmak_windows.c

I have tryed this implementation and work fine.

I have add three functions

  • registry_key_write()
  • registry_key_read()
  • registry_file_association()

And I have recalled registry_file_association() inside initGUI()

We need another include file: shlobj.h from system includes.

....     
#include <shlobj.h>
....

/* windows specific prototypes */
void registry_key_write(HKEY hkey_class,unsigned char *key_path,unsigned char *key_name,unsigned char *key_value);
int registry_key_read(HKEY hkey_class,unsigned char *key_path,unsigned char *key_name,unsigned char *key_value);
int registry_file_association(void);
....

void initGUI() {
    registry_file_association();  /* added this call to initGUI() */
}

....
....

/* put next lines at end of file */

void registry_key_write(HKEY hkey_class,unsigned char *key_path,unsigned char *key_name,unsigned char *key_value) {
  HKEY hKey;
  unsigned long dwDisp;  //could be REG_CREATED_NEW_KEY or REG_OPENED_EXISTING_KEY

  RegCreateKeyEx(hkey_class, key_path,0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, &hKey, &dwDisp);
  RegSetValueEx(hKey, key_name, 0, REG_SZ,key_value ,(DWORD)strlen(key_value));
  RegCloseKey(hKey);
}

int registry_key_read(HKEY hkey_class,unsigned char *key_path,unsigned char *key_name,unsigned char *key_value) {
   HKEY hKey;
   unsigned char buffer[_MAX_PATH];
   unsigned long datatype;
   unsigned long bufferlength = sizeof(buffer);

   if(RegOpenKeyEx(hkey_class, key_path,0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
     RegQueryValueEx(hKey, key_name, NULL, &datatype, buffer, &bufferlength);
     strcpy(key_value,buffer);
     RegCloseKey(hKey);
     return 1;
     }
   else
     return 0;
}

int registry_file_association(void) {
   unsigned char buffer[MAX_PATH];
   unsigned char path[MAX_PATH + 1];
   unsigned char proj_icon[MAX_PATH+2];
   unsigned char save_icon[MAX_PATH+2];
   unsigned char pipmak_cmd[MAX_PATH+5];  
   int res1,res2,res3;

   GetModuleFileName( NULL, path, MAX_PATH + 1 );
   sprintf(pipmak_cmd,"%s \"%%1\"",path);

   res1=registry_key_read(HKEY_CLASSES_ROOT,".pipmak","",buffer);
   res2=registry_key_read(HKEY_CLASSES_ROOT,".pipsave","",buffer);
   res3=registry_key_read(HKEY_CLASSES_ROOT,"PipmakProj\\Shell\\Open\\Command","",buffer);

   if(res1*res2*res3==0 || strcmp(buffer,pipmak_cmd)!=0)  {
    sprintf(proj_icon, "%s,1",      path);
    sprintf(save_icon, "%s,2",      path);

    registry_key_write(HKEY_CLASSES_ROOT,"PipmakProj","",path);
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakProj\\DefaultIcon","",proj_icon);
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakProj\\Shell","","");
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakProj\\Shell\\Open","","");
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakProj\\Shell\\Open\\Command","",pipmak_cmd);
    registry_key_write(HKEY_CLASSES_ROOT,".pipmak","","PipmakProj");

    registry_key_write(HKEY_CLASSES_ROOT,"PipmakSavedGame","",path);
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakSavedGame\\DefaultIcon","",save_icon);
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakSavedGame\\Shell","","");
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakSavedGame\\Shell\\Open","","");
    registry_key_write(HKEY_CLASSES_ROOT,"PipmakSavedGame\\Shell\\Open\\Command","",pipmak_cmd);
    registry_key_write(HKEY_CLASSES_ROOT,".pipsave","","PipmakSavedGame");

    //Reload Icon association  
    SHChangeNotify( SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0,0 );
    return 1;

     }
   return 0;
}

Related

Wiki: Proposals

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.