VC++如何实现文件图标变更?

smartsecuri 2012-09-12 05:54:15
下面是网上抄的代码,不管用。请高人指点,能实现类似的功能。

#include "stdafx.h"
#define _AFXDLL
#include <afxwin.h>


int _tmain(int argc, _TCHAR* argv[])
{
HGLOBAL hResLoad(NULL);
HANDLE hExe(NULL);
HRSRC hRes(NULL);
HANDLE hUpdateRes(NULL);
char * lpResLock;
BOOL result;
hExe = LoadLibrary(_TEXT("D:\\Src.exe"));
if (hExe == NULL)
{
AfxMessageBox(_T("加载Src.exe失败."),0,0);
}
hRes = FindResource((HMODULE)hExe, (LPCTSTR)1, RT_ICON);
if (hRes == NULL)
{
AfxMessageBox(_T("不能定位Src.exe中的第一个图标"));
}
hResLoad = LoadResource((HMODULE)hExe, hRes);
if (hResLoad == NULL)
{
AfxMessageBox(_T("不能加载该图标资源"));
}
lpResLock =(char *)LockResource(hResLoad);
if (lpResLock == NULL)
{
AfxMessageBox(_T("不能锁定该资源."));
}
hUpdateRes = BeginUpdateResource(_T("D:\\Target.exe"), FALSE);
if (hUpdateRes == NULL)
{
AfxMessageBox(_T("不能打开Target.exe准备写."));
}
result =UpdateResource((HMODULE)hUpdateRes , RT_ICON,
(LPCTSTR)1, 0, lpResLock, SizeofResource((HMODULE)hExe, hRes));
if (result == FALSE)
{
AfxMessageBox(_T("添加资源失败."));
}
if (!EndUpdateResource(hUpdateRes, FALSE))
{
AfxMessageBox(_T("不能向目标EXE中写入改动结束资源更新"));
}
if (!FreeLibrary((HMODULE)hExe))
{
AfxMessageBox(_T("不能释放Src的句柄."));
}
return 0;
}
...全文
146 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartsecuri 2012-09-13
  • 打赏
  • 举报
回复
再顶顶,看今天有没有结果
smartsecuri 2012-09-12
  • 打赏
  • 举报
回复
试了前两个提权函数,貌似还是无效果?

[Quote=引用 4 楼 的回复:]
引用 2 楼 的回复:
谢谢,他的方法1比我的多了EnableDebugPrivilge函数,说是提升本进程的权限为DEBUG级别。不知道有什么作用?代码在哪儿找?

引用 1 楼 的回复:
这里(http://www.cnblogs.com/weiqubo/archive/2011/03/15/1984865.html)有详细的解说和参考代码,看过会很有收获的。

提权的代码网上很多……
[/Quote]
Gloveing 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
谢谢,他的方法1比我的多了EnableDebugPrivilge函数,说是提升本进程的权限为DEBUG级别。不知道有什么作用?代码在哪儿找?

引用 1 楼 的回复:
这里(http://www.cnblogs.com/weiqubo/archive/2011/03/15/1984865.html)有详细的解说和参考代码,看过会很有收获的。
[/Quote]
提权的代码网上很多
由于需要替换exe的资源,所以要提权
VC提权(转)
2010-09-19 1:00
VC提权代码 收藏方法一:

C/C++ code

bool EnableDebugPrivilege()

{

HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))

{ return FALSE; }

if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) { CloseHandle(hToken); return false; }

tkp.PrivilegeCount = 1;

tkp.Privileges[0].Luid = sedebugnameValue;

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))

{

CloseHandle(hToken);

return false;

}

return true;

}

方法二:

C/C++ code

bool UpPrivilege()

{

HANDLE hToken; / /handle to process token

TOKEN_PRIVILEGES tkp; // pointer to token structure

bool result = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);

if(!result) //打开进程错误 return result;

result = LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);

if(!result) //查看进程权限错误

return result;

tkp.PrivilegeCount = 1; // one privilege to set

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

result = AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL); return result;

}

方法三:

C/C++ code

#define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege")

#define SE_ASSIGNPRIMARYTOKEN_NAME TEXT("SeAssignPrimaryTokenPrivilege")

#define SE_LOCK_MEMORY_NAME TEXT("SeLockMemoryPrivilege")

#define SE_INCREASE_QUOTA_NAME TEXT("SeIncreaseQuotaPrivilege")

#define SE_UNSOLICITED_INPUT_NAME TEXT("SeUnsolicitedInputPrivilege")

#define SE_MACHINE_ACCOUNT_NAME TEXT("SeMachineAccountPrivilege")

#define SE_TCB_NAME TEXT("SeTcbPrivilege")

#define SE_SECURITY_NAME TEXT("SeSecurityPrivilege")

#define SE_TAKE_OWNERSHIP_NAME TEXT("SeTakeOwnershipPrivilege")

#define SE_LOAD_DRIVER_NAME TEXT("SeLoadDriverPrivilege")

#define SE_SYSTEM_PROFILE_NAME TEXT("SeSystemProfilePrivilege")

#define SE_SYSTEMTIME_NAME TEXT("SeSystemtimePrivilege")

#define SE_PROF_SINGLE_PROCESS_NAME TEXT("SeProfileSingleProcessPrivilege")

#define SE_INC_BASE_PRIORITY_NAME TEXT("SeIncreaseBasePriorityPrivilege")

#define SE_CREATE_PAGEFILE_NAME TEXT("SeCreatePagefilePrivilege")

#define SE_CREATE_PERMANENT_NAME TEXT("SeCreatePermanentPrivilege")

#define SE_BACKUP_NAME TEXT("SeBackupPrivilege")

#define SE_RESTORE_NAME TEXT("SeRestorePrivilege")

#define SE_SHUTDOWN_NAME TEXT("SeShutdownPrivilege")

#define SE_DEBUG_NAME TEXT("SeDebugPrivilege")

#define SE_AUDIT_NAME TEXT("SeAuditPrivilege")

#define SE_SYSTEM_ENVIRONMENT_NAME TEXT("SeSystemEnvironmentPrivilege")

#define SE_CHANGE_NOTIFY_NAME TEXT("SeChangeNotifyPrivilege")

#define SE_REMOTE_SHUTDOWN_NAME TEXT("SeRemoteShutdownPrivilege")

#define SE_UNDOCK_NAME TEXT("SeUndockPrivilege")

#define SE_SYNC_AGENT_NAME TEXT("SeSyncAgentPrivilege")

#define SE_ENABLE_DELEGATION_NAME TEXT("SeEnableDelegationPrivilege")

#define SE_MANAGE_VOLUME_NAME TEXT("SeManageVolumePrivilege")

BOOL EnablePrivilege(LPCTSTR lpszPrivilegeName,BOOL bEnable)

{

HANDLE hToken;

TOKEN_PRIVILEGES tp;

LUID luid;

if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ,&hToken))

return FALSE;

if(!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))

return TRUE;

tp.PrivilegeCount = 1;

tp.Privileges[0].Luid = luid;

tp.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;

AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL);

CloseHandle(hToken); return (GetLastError() == ERROR_SUCCESS); } /********************************VISTA************************/ 嵌入manifest 如果是vs2008 在项目属性里面直接修改为requireAdministrator就可以了 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 该代码添加到VC资源中, 添加方式: 添加一个“custom”资源,”resource type”填24,把资源ID改为1
smartsecuri 2012-09-12
  • 打赏
  • 举报
回复
两种方法都试过了,貌似不行啊?
第一种的代码贴在前面了,第二种是不是我的调用方法有问题?

void main()
{
bool ret = ChangeExeIcon(L"D:\\255.ICO", L"D:\\Src.exe");
if (TRUE == ret)
{
printf("OK!\n");
}
else
{
printf("FAIL!\n");
}
getchar();
}
smartsecuri 2012-09-12
  • 打赏
  • 举报
回复
谢谢,他的方法1比我的多了EnableDebugPrivilge函数,说是提升本进程的权限为DEBUG级别。不知道有什么作用?代码在哪儿找?
[Quote=引用 1 楼 的回复:]
这里(http://www.cnblogs.com/weiqubo/archive/2011/03/15/1984865.html)有详细的解说和参考代码,看过会很有收获的。
[/Quote]
图灵狗 2012-09-12
  • 打赏
  • 举报
回复
这里(http://www.cnblogs.com/weiqubo/archive/2011/03/15/1984865.html)有详细的解说和参考代码,看过会很有收获的。
目录 第一章 1·带图标的菜单 2·显示倾斜文字 3·文字的颜色渐变 4·设置并叠加透明图片 5·颜色渐变进度条 6·透明窗体 第二章 7·调色程序 8·颜色下拉框 9·模拟拷贝进程 10·通用对话框 11·窗体分割 12·实现QQ程序的抽屉效果 13·以动画方式弹出,关闭窗口 14·半透明窗体 15·获得指定点颜色 16·判知图片大小 17·图片的伸缩显示 18·浏览大图 19·放大局部图形 20·屏幕抓图 21·裁剪位图 22·填充区域图象 23·列表项的提示条 24·浮动的鼠标提示 25·控制工具栏的按钮组 26·工具栏上设置下拉按钮 27·使窗体保持在最前 28·模仿windows任务拦 29·定义光标热区 30·拖放选中对象 第三章 31·调节系统音量 32·控制混音效果 33·播放WAV文件 34·再现windows的CD播放器 35·小解霸--VCD经典控制 36·播放rm文件 第四章 37·文字逐个出现模仿打字 38·嵌入式时钟 39·程序中嵌入日历 40·毫秒级的控制 41·读写系统时间 42·同步网络时间 第五章 43·编写屏保程序 44·屏蔽系统热键和隐藏任务拦 45·动态调整屏幕分辨率 46·获取系统硬件信息 47·编辑注册表信息 48·重启动和关闭计算机 49·获取windows版本号和运行模式 50·枚举可用字体 第六章 51·向导程序 52·系统托盘程序 53·隐藏程序不被关闭程序发现 54·枚举系统正在运行的程序 55·启动并控制其他exe程序 56·禁止运行程序多个实力 57·禁止程序右上角各按钮 58·多线程方式同时进行多项任务 59·线程优先级示例==赛马 60·利用剪贴板实现exe程序间的数据交换 61·通过内存映射实现exe程序间的数据交换 62·通过消息机制实现exe程序间的数据交换 第七章 63·获取驱动器序列号 64·获取磁盘空间数据 65·判别并定位到光驱(软驱) 66·嫡归法遍历磁盘目录 67·获得文件属性 68·删除不为空的目录 69·快速检索指定文件 70·拷贝,删除和移动文件 71·读写INI文件 72·读写大块资料(二进制) 73·文件变更通知 第八章 74·格式化数字 75·中文大写数字 76·存取图象字段 77·ADO控制access数据库 78·SQL语句中设置时段检索条件 79·SQL语句中设置字符串检索条件 80·SQL语句中设置多个字符串检索条件 81·SQL语句嵌套 82·代码控制链接ODBC 第九章 83·获取网卡地址 84·获得主机名和IP地址 85·端口扫描 86·判断网址是否有效 87·枚举局域网内计算机 88·连续批量Ping测试 89·设置IE的标题 90·收发电子邮件 91·FTP上传下载 92·网络聊天WINSOCK-TCP 93·广播信息WINSOCK-UDP 94·电话拨号上网 第十章 95·进制转换 96·随机选号 97·统计中英文字符数 第十一章 98·鼠标位置追踪 99·代码控制光标 100·模拟鼠标单双击 101·模拟键盘输入 102·限定鼠标区域 103·截获鼠标移开事件 104·截获键盘信息 第十二章 105·产生程序序列号 106·建立一个快捷方式 107·设置程序为自动被执行 108·注册与卸载OCX 109·限定程序的使用时限 110·在IE工具栏中加入快捷图标
01一个~2 02 软件启动画面 03 不规则窗口的实现 04 多色窗口的实现 05 创建图标 06 以图片为背景的标题栏 07 工具窗口 08 切分窗口 09 显示多姿多彩的动画图标 10 智能滚动条 100 特效画线 11 在工具栏上绘制双把手 12 制作可扩展对话框 13 不规则形状按钮 14 窗口显示为显示背景图 15 奇妙的三维文字按钮 16 彩色按钮的实现 17 计算器 18 使用DIB制作动画按钮 19 Winamp样式的自动停靠对话框 20 在对话框中预览位图 21 文字的特殊显示效果 22 动画字体 23 旋转文本 24 渐隐渐显地显示图像 25 马赛克的实现 26 动画启动界面 27 透明的图像 28 用OpenGL实现简单动画 29 屏幕放大镜 30 绘制光源照射的球体 31 图像的缩放 32 半透明的三维物体 33 OpenGL中雾的应用 34 制作CD播放器 35 播放WAV文件 36 制作AVI动画按钮 37 用MFC制作屏幕保护程序 38 在OpenGL视图中绘制三维物体 39 透明的按钮 40 打开真彩色位图 41 彩色立方体 42 简易的Windows媒体播放器 43 制作MIDI播放器 44 场景反走样效果 45 制作景深效果 46 进行拷屏打印 47 纹理映射 48 多线程的实现 49 改变系统时间 50 滚动字幕的实现 51 获取和修改计算机名 52 获取文件属性 53 获取系统文件夹的路径 54 检测硬件设备 55 组合框的自动查询技术 56 实时捕捉光标位置 57 内存监测器 58 确定正在运行的进程 59 文件变更通知 60 重新启动和关闭计算机 61 字体选择组合框 62 设置显示器分辨率 63 Vc++中IO的应用 64 以二进制形式查看文件 65 串行化功能的实现 66 独特的读写工具 67 打开PCX格式文件 68 IP编辑器 69 服务器端应用程序 70 客户端应用程序 71 网络浏览器 72 映射网络驱动器 73 HTTP监控器 74 基于IE4组件的浏览器 75 基于STMP的邮件发送系统 76 监控POP3上的电子邮件收发 77 信箱应用程序接口的使用 78 超级链接的制作 79 数据库对话框 80 ISAPI身份鉴定过滤器 81 用电子表格显示数据库内容 82 动态创建数据源 83 在动态集中使用虚拟列表 84 使用数据访问对象的MSDI 85 气球式提示栏 86 具有不可选项的组合框 87 扩展静态文本控件 88 列表控件 89 树形控件 90 制作一个多功能的状态栏 91 组合框控件的多列显示 92 ATL&MFC构造COM自动化编程界面 93 ActiveX文档容器 94 创建向导程序 95 模式对话框 96 非模式对话框 97 颜色对话框的使用 98 四则运算的实现 99 多功能的画笔

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧