2011-06-08 8 views
11

Por lo tanto, no puedo asociar mi programa con un tipo de archivo específico sin forzar al usuario pobre a ingresar su contraseña de administrador (puede estar bien para usuarios domésticos, pero es un problema gigantesco para los usuarios en un entorno corporativo). En este caso, la única solución es hacer la asociación solo para el usuario actual.¿Cómo asociar un programa Delphi con un tipo de archivo, pero solo para el usuario actual?

Lo he intentado pero algo no funciona.

Si entiendo correctamente tengo que escribir una clave como (digamos) '.mp3' en ctCurUserFileExt y escribir algo así como 'mi_archivo'. Luego, en ctCurUserClases añado una clave de esta manera:

WriteReg_String(RootKey, ctCurUserClases+ 'my_file\shell\open\command', '', Application.ExeName+ ' "%L"', TRUE) 

Sin embargo, cuando hago doble clic en el archivo, Windows me pregunta con qué aplicación debería abrirla.

Éstos son la constante:

CONST 
    RootKey= 'HKEY_CURRENT_USER'; 
    ctCurUserFileExt= '\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\'; 
    ctCurUserClases = '\Software\Classes\'; 
+1

[víctima Posible] (http://stackoverflow.com/questions/4585078/how-to-change-file-association-programmatically-without-require-elevation) – NGLN

+1

Hola, Ngln. NO es un tonto. Se trata de cómo asociar para todos los usuarios (requiere elevación). Necesito sin elevación (por lo tanto, solo para el usuario actual). – Ampere

+1

¿por qué no usar TRegistry, por cierto? –

Respuesta

16

Si desea registrar la asociación para cada usuario, escribir sus datos a

HKEY_LOCAL_MACHINE\Software\Classes 

Si desea registrar la asociación para el usuario actual , escribir sus datos a

HKEY_CURRENT_USER\Software\Classes 

ésta es la manera de hacer esto último:

with TRegistry.Create do 
    try 
    RootKey := HKEY_CURRENT_USER; 
    if OpenKey('\Software\Classes\.myfile', true) then 
     WriteString('', 'MyAppDataFile'); 
    if OpenKey('\Software\Classes\MyAppDataFile', true) then 
     WriteString('', 'My Very Own Text File Type'); 
    if OpenKey('\Software\Classes\MyAppDataFile\DefaultIcon', true) then 
     WriteString('', 'C:\WINDOWS\notepad.exe'); 
    if OpenKey('\Software\Classes\MyAppDataFile\shell\open\command', true) then 
     WriteString('', 'C:\WINDOWS\notepad.exe "%1"'); 
    finally 
    Free; 
    end; 
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); 

Esto asociará .myfile archivos, llamados "Mi propio tipo de archivo de texto", por lo que tendrán el icono del Bloc de notas y será inaugurado por el Bloc de notas. La última línea le dice a Explorer que se 'vuelva a cargar' para reflejar los cambios realizados en las asociaciones de archivos. Por ejemplo, las vistas de la lista de archivos de Explorer se actualizarán. La función WinAPI SHChangeNotify se declara en ShlObj.pas, por lo que necesita uses ShlObj.

Observe que el %1 en shell\open\command se ampliará al archivo actual. Por ejemplo, si hace doble clic en C:\some dir\test.myfile, a continuación, Explorador ejecutará el comando

C:\WINDOWS\notepad.exe "C:\some dir\test.myfile" 
+0

Entonces, ¿tenía que agregar ambas entradas en ctCurUserClases? Pensé que necesitaba agregar uno en ctCurUserClases y uno en ctCurUserFileExt. – Ampere

+0

@ user759588 - en realidad eso es incorrecto. HKEY_CLASSES_ROOT es el punto de entrada para HKLM y no para HKCU. – Ampere

+0

@Altar, cierto, me encuentro corregido. –

2

¿Has mirado en su creación en HKEY_CURRENT_USER \ Software \ Classes según http://support.microsoft.com/kb/257592

+0

Sí. No dice mucho. – Ampere

+0

Funciona exactamente igual que configurarlo globalmente, excepto que hay un lugar específico del usuario para colocar las claves para obtener las asociaciones de archivos. – BugFinder

Cuestiones relacionadas