.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