实际开发过程中时常遇到这种情况:双击自定义的后缀类型(例如:.ext),想要调用(Test.exe)打开,这个时候就需要设定文件类型的关联了。
/*******************************************************************
* 注册文件关联
* className // 自定义的类别
* appPath // 关联的程序目录
* ext // 关联的文件类型
* extDes // 该文件类型描述
*******************************************************************/
void registerFileRelation(const QString& className, const QString& appPath, const QString& ext, const QString& extDes)
{QString baseUrl("HKEY_CURRENT_USER\\Software\\Classes"); // 要添加的顶层目录QSettings settingClasses(baseUrl,QSettings::NativeFormat);// 在...Classes\类别下创建一个新的类别,并设置该类别打开文件时的调用参数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("LookExe"); // 自定义的类别 QString appPath("E:\\Asdst\\00ssag\\winExe\\test.exe"); // 关联的程序目录 QString ext(".ets"); // 关联的文件类型 QString extDes("查看"); // 该文件类型描述registerFileRelation(className,appPath,ext,extDes);
相关命令行调用如下:
assoc .ets=etsfile
ftype etsfile="E:\\Asdst\\00ssag\\winExe\\test.exe" "%1"
说明:在QT中使用Qprocess调用(systme调用会有黑框闪现)
QString strAssoc = "assoc .eest=eestfile"; // 显示或修改文件扩展名的关联QString strFtype = QString("ftype eestfile=\"%1\"").arg(QApplication::applicationFilePath()); // 显示或修改用在文件扩展名中的关联strFtype.replace("/", "\\");QProcess::startDetached("cmd.exe", QStringList() << "/c" << strAssoc + "\n");QProcess::startDetached("cmd.exe", QStringList() << "/c" << strFtype + "%1 \n");
....do something