大家有没有见过就是当我们下载一个软件比如视频播放器

下载之后我们电脑上的视频文件图标都变成了这个视频播放器的图标,然后打开时也是默认调用此视频播放器来播放

下面就给大家介绍如何在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);  //%1RegSetValue(hKey, "", REG_SZ, strtemp, strlen(strtemp) + 1/*换行符*/);  //关联icoRegCloseKey(hKey);   //关闭句柄memset(strtemp, 0, 256);//字符清空//关联执行程序,shell,open,commandsprintf(strtemp, "%s\\shell", glfilename);RegCreateKey(HKEY_CLASSES_ROOT, strtemp, &hKey);    //打开或创建一个后缀文件健值RegCloseKey(hKey);   //关闭句柄memset(strtemp, 0, 256);//字符清空//opensprintf(strtemp, "%s\\shell\\open", glfilename);RegCreateKey(HKEY_CLASSES_ROOT, strtemp, &hKey);    //打开或创建一个后缀文件健值RegCloseKey(hKey);   //关闭句柄memset(strtemp, 0, 256);//字符清空//commandsprintf(strtemp, "%s\\shell\\open\\command", glfilename);RegCreateKey(HKEY_CLASSES_ROOT, strtemp, &hKey);    //打开或创建一个后缀文件健值RegSetValue(hKey, "", REG_SZ, exefile, strlen(exefile) + 1/*换行符*/);   //关联exeRegCloseKey(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也无效!

Windows核心编程_注册表操作和小练习程序关联相关推荐

  1. Windows核心编程_设置Windows开机自动登录

    设置自动登录的方法在Windows中已经给出了非常方便的方法,当Windows内核进入登入界面时会检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ ...

  2. Windows核心编程_获取鼠标指定位置的RGB颜色值

    Windows核心编程_获取鼠标指定位置的RGB颜色值 大家平常会见到很多屏幕取色工具,其原理都是获取鼠标位置的屏幕像素点颜色! 一般思路都是:获取鼠标位置,然后取出鼠标指向的屏幕像素点颜色! Get ...

  3. Windows核心编程_判断是否管理员权限运行

    在Windows安全性越来越强的情况下,不常于XP时代,几乎毫无安全可言,各种对内核文件操控的rin3API不需要权限就可以运行和随意修改,如常见的注册表需改! 但是Win8以后安全性得到了强力的提升 ...

  4. Windows核心编程_远线程方式实现Dll注入

    之前有介绍过HOOK的方式注入,这次介绍以其它方式注入,而无须HOOK,要知道在Windows这个浩荡的海洋里,API就是宝藏,找到足够多的宝藏那么你就是海贼王~! 实现思路如下: 首先打开一个进程的 ...

  5. Windows核心编程_提权

    在Windows下编程有些涉及到硬件或者跨内存的API会发现失效了,原因是因为权限问题,这也是Windows出于安全的保护,但是事物都有两面性的,Windows又为我们提供了提权的API! 1.Adj ...

  6. Windows核心编程_窗口属性表

    这里来介绍一下窗口属性表,窗口属性表是一个链表,用于存储窗口句柄的,这里来介绍两个函数: SetProp,GetProp 函数介绍: BOOL SetProp(HWND hWnd,LPCTSTR lp ...

  7. Windows核心编程_窗口透明组件不透明

    经过前几篇对界面编程的学习,已经对Windows窗口消息有了更加深刻的理解,今天就教大家写一个窗口透明而组件却不透明的小示列! 这个demo并不难,而且还非常的简单,如果你看过我的前几篇针对界面编程写 ...

  8. Windows核心编程_重绘ListBox样式(仿QQListBox)

    今天教大家如何重绘ListBox,其中涉及到的相关知识点也一一解释了 效果图: 是不是和QQ的列表框非常相似?那么这里就一步一步教大家如何使用Win32SDK来完成这项工作! 创建Win32窗口 #i ...

  9. Windows核心编程_代码段共享_LocalAlloc/GlobalAlloc区别

    数据段共享 数据段共享起源于Windows16位的时代,在Win16操作系统时代下,16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为 ...

最新文章

  1. 三维点云语义分割总览
  2. qtdll在linux系统运行,在QT下编写带DLL的程序
  3. 机器学习模型的超参数优化 | 原力计划
  4. 服务器安全性文档,Microsoft Web服务器的安全性
  5. SanFeng-Clound
  6. LightOJ 1093 - Ghajini 线段树
  7. 翻译职称计算机能力,2018年职称计算机word2003考点辅导:用好Office2003中的翻译功能...
  8. VTK:图像平移范围用法实战
  9. oracle外表日期,三步教会您掌握oracle外表(external table)
  10. 算法--Hash算法及其应用场所
  11. C# MVC中过滤器的简单使用
  12. 40-10-010-运维-kafka-2.11-基本操作
  13. mifare classic 2.2.3中文_Adobe Lightroom Classic CC 2019 v8.4.1 中文完整直装版
  14. iOS “[App] if we're in the real pre-commit handler we can't actually add any new fences due
  15. matlab算系统阻抗,基于MatlabRF系统阻抗匹配设计.pdf
  16. 历史上的今天:乔布斯辞去苹果CEO一职;Windows 95 发布
  17. 2020.01.18【NOIP提高组】模拟B 组——总结——探险者拉罗
  18. 大文件CSV导入MYSQL_将大csv文件导入cp网站出租搭建mysql数据库
  19. BZOJ3527 力
  20. 新手不得不知的Amazon三大运营技巧

热门文章

  1. java adf是什么_在ArcIMS9.2中使用JAVA ADF实现图层要素的查询
  2. 更改docker源 aliyun_番外篇 (1) Docker 安装
  3. php上传压缩文件,8行代码实现PHP上传RAR文件并解压
  4. java构造函数的执行顺序,java构造函数和初始化函数的执行顺序
  5. php ccontroller,FineCMS controllers\ApiController.php 函数downAction 任意文件下载
  6. su封面插件_儿豁嘛,这就是SU空间布线葵花宝典
  7. element tree ui 全选_element UI tree 控件,点击父节点进行异步加载,异步加载的数据不能全选...
  8. 和nptf螺纹一样吗_常用数控加工计算公式和最全螺纹标准
  9. 输入分数输出小数C语言,这是把小数转换成分数的程序,可是输入0.6666无限循环...
  10. 纵向取模需要自己倒叙吗_我能自己完成混音工作吗?需要掌握哪些知识?