没啥可描述的.....就是一个注册扩展名的关联程序函数, 纯粹写注册表实现:
uses System.Win.Registry, Winapi.ShlObj; /// <summary> /// 注册文件类型及其默认执行程序 /// </summary> /// <param name="AExt"> /// 扩展名, 比如: .pas /// </param> /// <param name="AFileType"> /// 文件类型, 比如: BDS.PasFile /// </param> /// <param name="ADescription"> /// 类型描述, 比如: Delphi Source File /// </param> /// <param name="AExeName"> /// 执行程序, 比如: "C:Program FilesEmbarcaderoRAD Studio12.0Binds.exe" /// </param> /// <param name="AIcoIndex"> /// 图标标号, 文件关联的图标, 编号为执行程序图标资源编号 /// </param> /// <param name="ADoUpdate"> /// 是否要求更新, 如果该值为True, 则每次注册时, 无论信息是否存在是否相同, /// 都通知Windows资源管理器更新, 如果该值为False, 则每次注册时, /// 只有执行程序不同时, 才会要求Windows资源管理器更新 /// </param> procedure RegisterFileType(AExt, AFileType, ADescription, AExeName: string; AIcoIndex: Integer = 0; ADoUpdate: Boolean = False); const _BPath = 'SOFTWAREClasses'; var nStr: string; nNeedUpdate: Boolean; begin with TRegistry.Create do try {这里注册的是当前用户 如果想注册全用户, 需要用管理员身份运行, 并且写入HKEY_CLASSES_ROOT中, 同时_BPath = ''} RootKey := HKEY_CURRENT_USER; {自定义文件后缀} OpenKey(_BPath + AExt, True); WriteString('', AFileType); CloseKey; {自定义的文件类型 格式:HKEY_CURRENT_USERSOFTWAREClasses<Ext>(Default) = <FileType>} OpenKey(_BPath + AFileType, True); {文件类型的描述信息} WriteString('', ADescription); CloseKey; {自定义文件类型选择图标 格式: HKEY_CURRENT_USERSOFTWAREClasses<FileType>DefaultIcon(Default) = 'App DirApp.exe,0'} OpenKey(_BPath + AFileType + 'DefaultIcon', True); WriteString('', AExeName + ',' + IntToStr(AIcoIndex)); CloseKey; {注册在资源管理器中打开文件的程序 格式:HKEY_CURRENT_USERSOFTWAREClasses<FileType>ShellOpenCommand(Default) = '"App DirApp.exe" "%1"'} OpenKey(_BPath + AFileType + 'ShellOpen', True); WriteString('', '&Open'); CloseKey; nNeedUpdate := False; OpenKey(_BPath + AFileType + 'ShellOpenCommand', True); nStr := '"' + AExeName + '" "%1"'; {如果原来有默认程序, 则需要通知资源管理器更新} nNeedUpdate := not SameText(nStr, ReadString('')); if nNeedUpdate then WriteString('', nStr); CloseKey; {通知资源管理器注册文件类型关联,调用SHChangeNotify} if ADoUpdate or nNeedUpdate then SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); finally Free; end; end;