文件类型注册的可重用的类在项目FileTypeReg里,而实际使用的类TSysRegeist在MyLog3(即主程序)项目中。
所谓文件类型注册,实际上是向注册表的HKEY_CLASSES_ROOT项中写入一些相关的数据:首先,在HKEY_CLASSES_ROOT项下建立一个子项,名称即为后缀名,如".ml3"。它有一个默认值,比如"ML3_FileType"。意思是指,".ml3"文件类型的相关数据存储在HKEY_CLASSES_ROOT下的"ML3_FileType"这个子项里面。
"ML3_FileType"子项的内容像下面这样:
其中,Shell和Open下面的值是空的。因此,重要的属性有下面三个:
1。文件类型描述,即"ML3_FileType"下的默认值"MyLog3 日志文件"。
2。图标路径,即"DefaultIcon"下的默认值"F:桌面MyLog3ML3.ico"。
3。启动参数,即"Command"下的默认值"F:桌面MyLog3MyLog3.exe "%1""。它是意思是,每当运行.ml3类型的文件,就会调用程序"F:桌面MyLog3MyLog3.exe",传递的命令行参数为""fileName"",fileName指的是这个ml3文件的完全路径。注意,路径用""包括了起来,这样,当文件名中有空格时不至于产生错误。(如:文件名为"F:ab cd.ml3",如果不加"",则收到的命令行参数会是2个:F:ab和cd.ml3。)
首先,需要一个类,用它来记录这些信息,看项目FileTypeReg里的类FileTypeRegInfo:
public class FileTypeRegInfo
...{
/**//// 目标类型文件的扩展名
public string ExtendName; //".xcf"
/**//// 目标文件类型说明
public string Description; //"XCodeFactory项目文件"
/**//// 目标类型文件关联的图标
public string IcoPath;
/**//// 打开目标类型文件的应用程序
public string ExePath;
public FileTypeRegInfo()
...{
}
public FileTypeRegInfo(string extendName)
...{
this.ExtendName = extendName;
}
}
其次,需要一个类,它实际上执行注册表的写入操作,看项目FileTypeReg里的类FileTypeRegister:
public class FileTypeRegister
...{
//注册文件类型到系统中,需要传递FileTypeRegInfo对象
public static void RegisterFileType(FileTypeRegInfo regInfo)
...{
//
}
//从系统中删除文件类型,需要传递后缀名,比如 .txt
public static void DelFileTypeReg(string extendName)
...{
//
}
//返回相关的文件类型系统中的注册信息
public static FileTypeRegInfo GetFileTypeRegInfo(string extendName)
...{
//
}
//更新文件类型信息
public static bool UpdateFileTypeRegInfo(FileTypeRegInfo regInfo)
...{
//
}
//检查指定的文件类型是否已经注册过
public static bool FileTypeRegistered(string extendName)
...{
//
}
}
增加注册RegisterFileType(FileTypeRegInfo regInfo):
public static void RegisterFileType(FileTypeRegInfo regInfo)
...{
if (FileTypeRegistered(regInfo.ExtendName))
...{
return;
}
//xcf_FileType
string relationName = regInfo.ExtendName.Substring(1, regInfo.ExtendName.Length - 1).ToUpper() + "_FileType";
//指定.xcf文件的关联信息在xcf_FileType中
RegistryKey fileTypeKey = Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName);//创建项.xcf
fileTypeKey.SetValue("", relationName);//在.xcf 中增加一个默认值为 xcf_FileType
fileTypeKey.Close();
RegistryKey relationKey = Registry.ClassesRoot.CreateSubKey(relationName);//创建项xcf_FileType
relationKey.SetValue("", regInfo.Description);//写入默认值文件类型说明
RegistryKey iconKey = relationKey.CreateSubKey("DefaultIcon");//添加项,图标路径
iconKey.SetValue("", regInfo.IcoPath);
RegistryKey shellKey = relationKey.CreateSubKey("Shell");
RegistryKey openKey = shellKey.CreateSubKey("Open");
RegistryKey commandKey = openKey.CreateSubKey("Command");
commandKey.SetValue("", regInfo.ExePath + " "%1""); //让应用程序知道打开了哪个文件
relationKey.Close();
}
首先,判断是否已经注册过,如果已注册则退出。再得到存储信息的名relationName,并创建相应的子项DefaultIcon、Shell、Open、Command,写入相应的数据。这里涉及到注册表的操作,对其中的函数不明白的可以查看vs2005中的对象浏览器。
后面还有更新、删除等操作,其原理是一样的,对注册表中的值进行修改。
在MyLog3项目中,实际执行文件类型注册的类是TSysRegeist:
public static void AddRegeist()//注册文件类型 .ml3
...{
FileTypeRegInfo fileReg = new FileTypeRegInfo(".ml3");
fileReg.Description = "MyLog3 日志文件";
fileReg.ExePath = Application.StartupPath + @"MyLog3.exe";
fileReg.IcoPath = Application.StartupPath + @"ML3.ico";
if (FileTypeRegister.FileTypeRegistered(fileReg.ExtendName))
...{
FileTypeRegister.UpdateFileTypeRegInfo(fileReg);
}
else
...{
FileTypeRegister.RegisterFileType(fileReg);
}
}
public static void DelRegeist()//从系统中删除文件类型.ml3的关联
...{
FileTypeRegister.DelFileTypeReg(".ml3");
}
只要在应用程序启动后,调用相应的方法,就可以执行增加或删除的操作。
下一篇,数据结构检查。
ie.2008-04-08