Pipmak Game Engine Wiki
Status: Alpha
Brought to you by:
cwalther
I have tryed this implementation and work fine.
I have add three functions
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;
}