大家有没有见过就是当我们下载一个软件比如视频播放器
下载之后我们电脑上的视频文件图标都变成了这个视频播放器的图标,然后打开时也是默认调用此视频播放器来播放
下面就给大家介绍如何在Windows平台上实现这个功能:
通过上图可以知道,HKEY_LOCAL_MACHINE健负责注册关联文件
所以我们需要操作注册表
这里介绍一下注册表操作的几个API
1.RegOpenKey
作用:打开注册表健
函数原型:
LONG RegOpenKey( HKEY hKey, // 要打开键的句柄
LPCTSTR lpSubKey, // 要打开子键的名字的地址
PHKEY phkResult // 要打开键的句柄的地址);
参数介绍:
hKey
当前打开键的句柄或下列已确定的保留句柄值:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Windows NT: HKEY_PERFORMANCE_DATA
Windows 95和Windows 98: HKEY_DYN_DATA
被RegOpenKey函数打开地键是能被hKey识别的子键。
lpSubKey
指向包含了要打开键的名字的以空字符结束的字符串。这个键必须是能被hKey参数识别的子键。如果这个参数为NULL或指向一个空字符串,函数返回与被传递相同的句柄。
phkResult
指向一个接收被打开键句柄的变量。
返回值:
如果调用成功,返回ERROR_SUCCESS。
如果调用失败,返回一个非零错误码(定义在WINERROR.H)。你可以使用带有FORMAT_MESSAGE_FROM_SYSTEM标记的FormatMessage函数获得普通错误描述信息。
2.RegCreateKey
作用创建或者打开注册表健
函数原型
LONG RegCreateKey( HKEY hKey, // 要打开键的句柄
LPCTSTR lpSubKey, // 要打开子键的名字的地址
PHKEY phkResult // 要打开键的句柄的地址);
参数与RegOpenKey一致,不过这里如果在打开建表时不存在则创建一个!
3.RegSetValue
函数原型:
LONG WINAPI RegSetValue(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_In_ DWORD dwType,
_In_ LPCTSTR lpData,
_In_ DWORD cbData
);
参数介绍:
hKey
指向当前打开表项的句柄,或者预定保留值之一(注册表中默认的几大注册表项)
lpSubKey
指向一个空终止的字符串指针,指示这个函数将打开或创建表项的名称。可以为NULL,或空字符串,那么此函数将为参数hkey所指定的注册表项默认设置值。这个表项必须是由hkey参数所标识的子项。
dwType
指示将被存储的信息类型。该参数必须为REG_SZ
lpData
指向一个空终止的字符串,该字符串中包含了要为指定项的默认值设置的数据。
cbData
指示lpData参数所指向的字符串的大小,单位是字节,但不包含字符串最后的空终止字符
返回值:
0代表成功,否则错误码
4.RegCloseKey
函数原型:
LONG RegCloseKey(
HKEY hKey // 释放键的句柄
);
返回值:
0代表成功,否则错误码
在开始之前先手动的带大家做一次,这样大家才能理解Windows是怎样通过注册表来关联文件的!
1.打开注册表
使用Win+r呼出运行窗口,在运行窗口里输入regedit即可进入注册表
找到HKEY_CLASSES_ROOT
右键新建项
注意要以“.”开头
在默认值里写上你下面要关联的文件目录
这里值得说一下,Windows是通过.开头的表项里的默认健值得数据去寻找关联表项(这里有点模糊没关系下面你就知道了)
名字可以随便输入,但要记得
然后在子表项下建立一个与刚刚输入的.KY默认值一样的表项
这样就把.kY后缀文件与glfile表项关联起来了,那么接下来设置默认程序以及图标
在glfile下添加项“DefaultIcon”和“shell”
DefaultIcon:图标
shell:shell命令(系统启动程序时都是通过shell命令来调用的)
设置图标,修改DefaultIcon默认值即可,给默认值图标路径即可:
然后调用shell的open事件,在open事件里的command命令里输入我们的执行程序路径即可
注意后面的%1代表传递那个环境参数
比如
d:\a.EXE -a -c
其中上面代表三个环境参数,路径本身就代表一个
这个时候我们桌面生成一个.KY文件看下是不是和我们设定的一样:
图标发生了变化,程序也运行了起来!
那么就换成代码来实验一下:
BOOL setfile(char *file/*要关联的文件后缀*/, char *exefile/*要执行的exe程序*/, char *ico/*关联文件的图标后缀*/,char* glfilename/*注册表关联项*/) {
HKEY hKey;
char strtemp[256] = { 0 }; //关联目录完整值
//设置关联后缀名
RegCreateKey(HKEY_CLASSES_ROOT, file, &hKey);
RegSetValue(hKey, "", REG_SZ, glfilename, strlen(glfilename) + 1); //关联目录
RegCloseKey(hKey); //关闭句柄
//创建关联目录
RegCreateKey(HKEY_CLASSES_ROOT, glfilename, &hKey);
RegCloseKey(hKey); //关闭句柄
//添加DefaultIcon项
sprintf(strtemp, "%s\\DefaultIcon", glfilename);
RegCreateKey(HKEY_CLASSES_ROOT, strtemp, &hKey); //打开或创建一个后缀文件健值
memset(strtemp, 0, 256);//字符清空
sprintf(strtemp, "%s %1", ico); //%1
RegSetValue(hKey, "", REG_SZ, strtemp, strlen(strtemp) + 1/*换行符*/); //关联ico
RegCloseKey(hKey); //关闭句柄
memset(strtemp, 0, 256);//字符清空
//关联执行程序,shell,open,command
sprintf(strtemp, "%s\\shell", glfilename);
RegCreateKey(HKEY_CLASSES_ROOT, strtemp, &hKey); //打开或创建一个后缀文件健值
RegCloseKey(hKey); //关闭句柄
memset(strtemp, 0, 256);//字符清空
//open
sprintf(strtemp, "%s\\shell\\open", glfilename);
RegCreateKey(HKEY_CLASSES_ROOT, strtemp, &hKey); //打开或创建一个后缀文件健值
RegCloseKey(hKey); //关闭句柄
memset(strtemp, 0, 256);//字符清空
//command
sprintf(strtemp, "%s\\shell\\open\\command", glfilename);
RegCreateKey(HKEY_CLASSES_ROOT, strtemp, &hKey); //打开或创建一个后缀文件健值
RegSetValue(hKey, "", REG_SZ, exefile, strlen(exefile) + 1/*换行符*/); //关联exe
RegCloseKey(hKey); //关闭句柄
memset(strtemp, 0, 256);//字符清空
return TRUE;
}
main:
int main(int argc, char** argv) {
setfile(".m", "d:\\LOG.exe", "d:\\1.ico", "EXEFILE1111");
return 0;
}
结果:
注意,在Win7以上需要管理员权限运行,博主尝试提权API也无效!