请问怎么可以提取DLL,EXE文件里的图标 我只知道用LoadIcon提取程序自己资源里的ICON,但是有的程序可以提取任意指定的一个EXE,DLL里的图标,请问怎么实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 作者:Future Studio.徐景周 下面让我们来看看如何来具体用它们来实现:1、 提取并显示出图标到左侧列表框中。代码实现如下://读取各种资源内部图标并显示在左侧列表框中 void CIconSnapDlg::OnOK() { CFileDialog fileDialog( TRUE,"*.ICO",NULL,NULL,"资源文件(*.ICO,*.BMP,*.EXE,*.DLL,*.ICL)|*.ICO;*.BMP;*.EXE;*.DLL;*.ICL||");if (fileDialog.DoModal() == IDOK) { szOpenFileName=fileDialog.GetPathName(); szOpenFileExtName= fileDialog.GetFileExt ();szOpenFileExtName.MakeLower ();m_List.ResetContent (); //选清空左侧图标列表框//读取并显示ICON文件if(szOpenFileExtName =="ico") {lpIR=pIcons->ReadIconFromICOFile (szOpenFileName); HICON hIcon;hIcon=ExtractIcon(AfxGetInstanceHandle(),szOpenFileName,0);if(hIcon!=NULL)m_List.AddString (szOpenFileName);CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);pStatic->SetIcon (hIcon);}else if(szOpenFileExtName == "bmp") //读取并显示BMP文件{pIcons->IconImageFromBMPFile (szOpenFileName,&lpIR->IconImages[0],TRUE);HICON hIcon;hIcon=pIcons->MakeIconFromResource (&lpIR->IconImages [0]);if(hIcon!=NULL) m_List.AddString (szOpenFileName);CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);pStatic->SetIcon (hIcon);}else //读取并显示EXE、DLL等资源文件{HINSTANCE hLibrary;// Load the DLL/EXE - NOTE: must be a 32bit EXE/DLL for this to workif( (hLibrary = LoadLibraryEx( szOpenFileName, NULL, LOAD_LIBRARY_AS_DATAFILE )) == NULL ){// Failed to load - abortMessageBox( szOpenFileName+ "文件载入错误,必须是WIN32的文件!", "错误", MB_OK );return;}// Store the infoEDII.szFileName =szOpenFileName;EDII.hInstance = hLibrary;// Fill in the listbox with the icons availableif( ! EnumResourceNames( EDII.hInstance, RT_GROUP_ICON, (ENUMRESNAMEPROC )MyEnumProcedure, (LPARAM)GetSafeHwnd()) ){MessageBox( "列举图标资源名时出错!", "错误", MB_OK );return;}}m_List.SetCurSel (0);if( m_List.GetCount() == 0 ){MessageBox( "此文件中没有图标资源!", "错误", MB_OK );//无图标资源,置保存和复制按钮为无效状态m_Copy.EnableWindow (false);m_SaveAs.EnableWindow (false);return;}//有图标资源,置保存和复制按钮为有效状态m_Copy.EnableWindow (true);m_SaveAs.EnableWindow (true);//刷新调用OnPaint来显示图标InvalidateRect(NULL,TRUE);} } 在OnPaint()涵数中加入下面代码用来具体显示提取出的图标或位图资源。//根据左侧图标列表,利用OnPaint()来更新右侧相应图标 LPTSTR lpIconID;HICON hIcon;if((lpIconID=(LPTSTR)m_List.GetItemData(m_List.GetCurSel()))!=(LPTSTR)LB_ERR ){if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl"){hIcon=pIcons->GetIconFromInstance(EDII.hInstance,lpIconID);CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);pStatic->SetIcon (hIcon);}} jennyvenus(JennyVenus) 能否给个全文联接 MSDNSDK SamplesICONPRO Sample http://www.vckbase.com/document/viewdoc.asp?id=310 怎么全局的快捷键? 网页下载问题 XP下一个VC技巧 如何得到当前时间? 请问消息WM_VSCROLL是管什么的? 学习OpenGL或DX9的朋友请留下QQ号共同提高(我的QQ:286150624) CListBox的问题 ATL/ActiveX的静态成员函数调用静态成员变量,出错如下: 为什么不能添加类成员变量? MFC紧急求助高手 中印知识分子比较 一个关于Checked和UnChecked的问题?
下面让我们来看看如何来具体用它们来实现:1、 提取并显示出图标到左侧列表框中。代码实现如下://读取各种资源内部图标并显示在左侧列表框中
void CIconSnapDlg::OnOK()
{
CFileDialog fileDialog( TRUE,"*.ICO",NULL,NULL,"资源文件(*.ICO,*.BMP,*.EXE,*.DLL,*.ICL)|*.ICO;*.BMP;*.EXE;*.DLL;*.ICL||");
if (fileDialog.DoModal() == IDOK)
{
szOpenFileName=fileDialog.GetPathName();
szOpenFileExtName= fileDialog.GetFileExt ();
szOpenFileExtName.MakeLower ();m_List.ResetContent (); //选清空左侧图标列表框//读取并显示ICON文件
if(szOpenFileExtName =="ico")
{
lpIR=pIcons->ReadIconFromICOFile (szOpenFileName);
HICON hIcon;
hIcon=ExtractIcon(AfxGetInstanceHandle(),szOpenFileName,0);
if(hIcon!=NULL)
m_List.AddString (szOpenFileName);
CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);
pStatic->SetIcon (hIcon);
}
else if(szOpenFileExtName == "bmp") //读取并显示BMP文件
{
pIcons->IconImageFromBMPFile (szOpenFileName,&lpIR->IconImages[0],TRUE);
HICON hIcon;
hIcon=pIcons->MakeIconFromResource (&lpIR->IconImages [0]);
if(hIcon!=NULL)
m_List.AddString (szOpenFileName);
CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);
pStatic->SetIcon (hIcon);
}
else //读取并显示EXE、DLL等资源文件
{
HINSTANCE hLibrary;// Load the DLL/EXE - NOTE: must be a 32bit EXE/DLL for this to work
if( (hLibrary = LoadLibraryEx( szOpenFileName, NULL, LOAD_LIBRARY_AS_DATAFILE )) == NULL )
{
// Failed to load - abort
MessageBox( szOpenFileName+ "文件载入错误,必须是WIN32的文件!", "错误", MB_OK );
return;
}
// Store the info
EDII.szFileName =szOpenFileName;
EDII.hInstance = hLibrary;// Fill in the listbox with the icons available
if( ! EnumResourceNames( EDII.hInstance, RT_GROUP_ICON, (ENUMRESNAMEPROC )MyEnumProcedure, (LPARAM)GetSafeHwnd()) )
{
MessageBox( "列举图标资源名时出错!", "错误", MB_OK );
return;
}
}m_List.SetCurSel (0);
if( m_List.GetCount() == 0 )
{
MessageBox( "此文件中没有图标资源!", "错误", MB_OK );
//无图标资源,置保存和复制按钮为无效状态
m_Copy.EnableWindow (false);
m_SaveAs.EnableWindow (false);
return;
}
//有图标资源,置保存和复制按钮为有效状态
m_Copy.EnableWindow (true);
m_SaveAs.EnableWindow (true);//刷新调用OnPaint来显示图标
InvalidateRect(NULL,TRUE);
}
}
在OnPaint()涵数中加入下面代码用来具体显示提取出的图标或位图资源。
//根据左侧图标列表,利用OnPaint()来更新右侧相应图标 LPTSTR lpIconID;
HICON hIcon;
if((lpIconID=(LPTSTR)m_List.GetItemData(m_List.GetCurSel()))!=(LPTSTR)LB_ERR )
{
if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl")
{
hIcon=pIcons->GetIconFromInstance(EDII.hInstance,lpIconID);
CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);
pStatic->SetIcon (hIcon);
}
}
SDK Samples
ICONPRO Sample