设置文件关联

.386
.model   flat,stdcall
option   casemap:none

include      windows.inc
include      kernel32.inc
includelib   kernel32.lib
include      user32.inc
includelib   user32.lib
include      advapi32.inc     ;必须包含这个头文件
includelib   advapi32.lib

.data?
hInstance    dd    ?

.const

szKeyExt1        db '.test',0      ;第一个子键
szKeyExt1Value   db 'testfile',0   ;第一个子键的默认键值
szKeyExt2        db 'testfile/shell/open/command',0      ;第二个子键,默认键值为关联程序名
szParam          db ' "%1"',0

.code
_SetExt     proc
LOCAL    @hKey
LOCAL    @szFileName[MAX_PATH]:byte   ;关联到这个可执行程序

invoke   RegCreateKeyEx,HKEY_CLASSES_ROOT,addr szKeyExt1,NULL,NULL,/
           REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,addr @hKey,NULL
.if   eax == ERROR_SUCCESS
   invoke   RegSetValueEx,@hKey,NULL,NULL,REG_SZ,ADDR szKeyExt1Value,sizeof szKeyExt1Value
   invoke   RegCloseKey,@hKey
.endif
invoke   RegCreateKeyEx,HKEY_CLASSES_ROOT,addr szKeyExt2,NULL,NULL,/
           REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,addr @hKey,NULL
.if   eax == ERROR_SUCCESS
   invoke   GetModuleFileName,NULL,addr @szFileName,MAX_PATH
   invoke   lstrcat,addr @szFileName,addr szParam
   invoke   lstrlen,addr @szFileName
   inc      eax   ;REG_EXPAND_SZ型的cbData应为字符串长度加2,但这里加一就可以
   invoke   RegSetValueEx,@hKey,NULL,NULL,REG_EXPAND_SZ,addr @szFileName,eax
   invoke   RegCloseKey,@hKey
.endif
ret

_SetExt endp
start:
        invoke _SetExt
        invoke MessageBox,NULL,NULL,NULL,MB_OK ;双击.TEST文件,如果程序运行的话,则设置成功
        invoke ExitProcess,NULL
        end start

你可能感兴趣的:(设置文件关联)