Agosto 01, 2012, 11:54:35 PM Ultima modificación: Agosto 03, 2012, 10:37:44 PM por Texic
Creador: Texic
Versión de Gm utilizada:  :GM8:
Descripción: Este script sirve para crear una asociación entre un tipo de archivo y un archivo ejecutable. Puede hacerlo de dos maneras, por medio de los scripts en gml (silencioso), y si no funciona (por ejemplo en windows 7 o similares) pasa al modo no silencioso, creando y ejecutando un archivo de registro .reg
Script:
//argument0: Extensión a asociar (string) Ej: ".svk"
//argument1: Ruta del archivo con que abrirlo (string) Ej: "C:\Mijuego\Juego.exe"
//argument2: Ruta del ícono asociado (string) Ej: "C:\Mijuego\Icono.ico" (Opcional)
//argument3: Tipo de archivo (string) Ej: "Archivo Guardado"
b=registry_set_root(2)
if registry_exists("\"+argument0) {exit}
b+=registry_write_string_ext("\"+argument0,"",string_copy(argument0,2,3)+"file")
b+=registry_write_string_ext('\'+string_copy(argument0,2,3)+"file","",argument3)
b+=registry_write_string_ext('\'+string_copy(argument0,2,3)+"file"+'\shell\open\command',"",argument1+' %1')
if variable_local_exists(argument2) {b+=registry_write_string_ext("\"+string_copy(argument0,2,3)+"\DefaultIcon","",argument2)}
if b=0{
argument1=string_replace_all(string_replace_all(argument1,"\","|"),"|","\\")
argument2=string_replace_all(string_replace_all(argument2,"\","|"),"|","\\")
str='Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\'+argument0+']
@="'+string_copy(argument0,2,3)+"file"+'"

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+']
@="'+argument3+'"

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+"file"+'\DefaultIcon]
@="'+argument2+'"

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+'\shell]

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+'\shell\open]

[HKEY_CLASSES_ROOT\'+string_copy(argument0,2,3)+'file'+'\shell\open\command]
@="'+argument1+' %1"
'
a=file_text_open_write(working_directory+"\reg.reg")
file_text_write_string(a,str)
file_text_close(a)
execute_shell(working_directory+"\reg.reg",0)
}
str='@echo off
taskkill /IM explorer.exe /F
CD /d %userprofile%\AppData\Local
DEL IconCache.db /a
explorer.exe
exit'
a=file_text_open_write(temp_directory+"\act.bat")
file_text_write_string(a,str)
file_text_close(a)
while(1)
{
screen_redraw()
screen_refresh()
if registry_exists_ext("\"+argument0,"") {execute_shell(temp_directory+"\act.bat",0) break}
}


Soporte para íconos personalizados agregado, y ejemplo sobre cómo usar los parameter string y count para reconocer los archivos asociados abiertos. Usenlo con sabiduría! ;P

Ejemplo Adjunto

PD: Para que el ícono y el nombre de la extensión sean visibles se corre un comando .bat, si lo desean pueden pasar esos comandos de manera silenciosa con silentdos, que se encuentra en gmtoolbox.com. Lo dejo a su elección, de otra manera se muestra en pantalla




Que bueno! podria venirme bien para un juego que estoy haciendo...
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Genial, aunq creo q estaría mejor con ícono, no? Cuando logre esa parte posteo acá para que se enteren, y de paso hago un ejemplo usando parameter_count y parameter_string para que al abrir el archivo asociado, el juego haga algo específico




Cita de: Texic en Agosto 02, 2012, 12:20:46 AM
Genial, aunq creo q estaría mejor con ícono, no? Cuando logre esa parte posteo acá para que se enteren, y de paso hago un ejemplo usando parameter_count y parameter_string para que al abrir el archivo asociado, el juego haga algo específico
Ah, entonces por ahora cuando haces doble click a un .svk se abre el juego como si hubieras entredo al .exe
Ahora que lo pienso es obvio, porque el juego se abre y ni se entera XD
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Claro, a menos que sepas usar los parameter_count y parameter_string, porq si no me equivoco, así como está ya pasa el parámetro de la ruta completa del archivo abierto al juego

Edit: Actualizado el post principal y agregado soporte para íconos y nombre del tipo de extensión!




Texic una pregunta,como funciona lo de parameters cout y eso solo es para cargar el juego o también sirven para otra función mas?
Padre Nuestro del Programador de C           
C Nuestro que estas en la Memoria,
Compilado sea tu código,
venga a nosotros tu software,
carguense tus punteros.
así en la RAM como en el Disco Duro,
Danos hoy nuestro Array de cada día,
Perdona nuestros Warnings,
así como nosotros también los eliminamos,
no nos dejes caer en Bucles,
y libranos del Windows, Enter.

Está en el manual y más o menos se entiende en el ejemplo. Es para tomar los parámetros pasados al juego mediante una alteración en la ruta de ejecución. Como cambiás el acceso directo del counter strike poniendo "C:\Counter_Strike.exe" -console
Esa palabra, -console, se puede leer desde el juego con parameter_string, parameter_count te devuelve la cantidad de parámetros pasados al juego, se puede pasar más de uno. Lo que hace el script es asociar los archivos para que al abrirse pasen como parámetro su ruta completa, así pueden ser identificados desde el juego/aplicación. Prueba el ejemplo y después me dices. Saludos!

EDIT: Nueva versión final. Ahora la caché de íconos se actualiza para que quede todo bien bonito :3




Cita de: Texic en Agosto 03, 2012, 10:39:52 PM
EDIT: Nueva versión final. Ahora la caché de íconos se actualiza para que quede todo bien bonito :3
Genial!! Ahora está completo, muy útil, lo descargo :D
Esto se puede usar para abrir archivos con extensiones y un parametro específico con nuestro programa creado en game maker cierto?


Si, exactamente, con esto podés asociar una extensión específica a tu programa en game maker. Suponete que creaste un editor de imágenes en gm, con un formato especial .imk, esto crea la asociación para que los .imk abran tu programa y tu programa los reconozca y cargue. Está todo en el ejemplo. Saludos!