实现的目的:通过点击自己自定义的文件,打开自己编写的系统。
要解决问题的步骤分成两步。
第一步: 要实现的步骤必须要先修改注册表,这样你才能 双击文件实现文件与系统 的关联。
第二步: 假如你已经修改注册表已经成功,你双击文件是会向程序的main函数传递两个参数argv[0]、argv[1]。 第一个参数 为程序的exe文件路径,第二个为你双击文件的路径。因此你可以在你所写的程序中通过argv[1]来打开文件。
总结:通过修改注册表,在获得argv[1]参数来实现我们需要实现的功能。
第一步注册表修改详细步骤:
首先注册表改成什么样才能进行文件关联呢?
你可以注册表管理,通过可视化来理解修改注册表的过程,大致要了解注册表文件夹的用处
创建一个.txt的文件夹,并在文件夹里存放另一个文件夹的名字(会自动找到那个文件夹),然后通过那个文件夹设置图标和程序执行的地方。
再次不在赘述,可参考https://blog.csdn.net/lfw19891101/article/details/6103032
编写代码
首先我是用Qt进行编写的,但是后来虽然想出来了,但并不是自己所想的那样,因为还要手动运行自己所写修改注册表的问题,很麻烦,而且自己在电脑上运行一次就不需要再次运行,以下为Qt实现步骤,希望可以给各位点思路。
/*******************************************************************
* 注册文件关联
*
* className // 自定义的类别
* appPath // 关联的程序目录
* ext // 关联的文件类型
* extDes // 该文件类型描述
*
*******************************************************************/
void registerFileRelation(const QString& className,const QString& appPath,const QString& ext,const QString& extDes)
{
QString baseUrl("HKEY_CURRENT_ROOT"); // 要添加的顶层目录
QSettings settingClasses(baseUrl,QSettings::NativeFormat);
// 在...Classes\类别下创建一个新的类别,%1是为了系统提供你运行参数时argv[1],获取该文件的路径。
settingClasses.setValue("/" + className + "/Shell/Open/Command/.","\"" + appPath + "\" \"%1\"");
// 文件类型描述
settingClasses.setValue("/" + className + "/.",extDes);
// 设置该类别的默认图标默认图标
settingClasses.setValue("/" + className + "/DefaultIcon/.",appPath + ",0");
// 关联ext 和 类别
settingClasses.setValue("/" + ext + "/OpenWithProgIds/" + className,"");
// 立即保存该修改
settingClasses.sync();
}
QString className("xxx.yyy.com"); // 自定义的类别
QString appPath("D:\\Program Files\\MyProgram.exe"); // 关联的程序目录
QString ext(".proj"); // 关联的文件类型
QString extDes("xx 工程文件"); // 该文件类型描述
registerFileRelation(className,appPath,ext,extDes)
因此我想到了另外一个步骤通过打包软件,把自己所写的程序进行打包,把修改注册表的步骤放到安装文件的脚本里面,进而在安装程序的过程中就可以实现注册表的修改,结果符合自己的期望。
打包的软件为NSIS,关于这个软件修改注册表的方法自己可以去百度下。
Section ".txt" Note
DetailPrint "关联 txt 文件..."
SectionIn 1
#设置该类型文件关联的文件夹,并添加文件类型解释。
WriteRegStr HKCR ".txt" "" "Note.file"
WriteRegStr HKCR "Note.file" "" "文本文件 (.txt)"
#设置图标,当然你可以不设置默认的图标,直接把路径换成图片的路径,不用0了
WriteRegStr HKCR "Note.file\DefaultIcon" "" "$INSTDIR\Note.exe,0"
#主要是建立command,添加可执行程序,并携带文件路径(%1)
WriteRegStr HKCR "Note.file\shell" "" ""
WriteRegStr HKCR "Note.file\shell\open" "" ""
WriteRegStr HKCR "Note.file\shell\open\command" "" '"$INSTDIR\Note.exe" "%1"'
SectionEnd