如何从一个EXE或DLL文件中提取(ico)图标文件 如何从一个EXE或DLL文件中提取(ico)图标文件,并用其它图标文件替换EXE或DLL中原有的图标文件?我在MSDN查到在ICONS.H有一个 ReadIconFromEXEFile 函数,但不知道怎么用,可以帮忙吗?谢谢、 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls/vctips_32/1232004.htm http://www.sgxcn.com/doc/show.asp?ID=123 有说明,www.vckbase.com中有它的例子,就是根据这篇文章写的,但是具体在哪我也忘了,好像在什么人的一个专栏里,自己找找吧。 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); } 如何将提取出的图标资源保存为Ico或Bmp格式。//保存图标资源为ICO或BMP格式文件 void CIconSnapDlg::OnButtonSaveas() { LPTSTR lpIconID; CFileDialog fileDialog( FALSE,"*.ICO",NULL,NULL,"图标文件(*.ICO)|*.ICO|位图文件(*.BMP)|*.BMP||"); if (fileDialog.DoModal() == IDOK) { szSaveFileName=fileDialog.GetPathName(); szSaveFileExtName= fileDialog.GetFileExt (); szSaveFileExtName.MakeLower (); if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl") if((lpIconID=(LPTSTR)m_List.GetItemData (m_List.GetCurSel()))!= (LPTSTR)LB_ERR) lpIR=pIcons->ReadIconFromEXEFile (szOpenFileName,lpIconID); if(szSaveFileExtName=="bmp") { if(lpIR!=NULL && m_List.GetCount ()>0) { BeginWaitCursor(); pIcons->IconImageToBMPFile (szSaveFileName,&lpIR->IconImages [0]); EndWaitCursor(); } else MessageBox( "没有可保存的图标资源!", "错误", MB_OK ); } else if(szSaveFileExtName=="ico") { if(lpIR!=NULL && m_List.GetCount ()>0) { BeginWaitCursor(); pIcons->WriteIconToICOFile (lpIR,szSaveFileName); EndWaitCursor(); } else MessageBox( "没有可保存的图标资源!", "错误", MB_OK ); } }} void CTreeViewDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) { m_list.DeleteAllItems(); NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; TVITEM item = pNMTreeView->itemNew; if(item.hItem == m_hRoot) return; CString str = GetFullPath(item.hItem); if(str.Right(1) != "\\") str += "\\"; str += "*.*"; CFileFind file; BOOL bContinue = file.FindFile(str); while(bContinue) { bContinue = file.FindNextFile(); if(!file.IsDirectory() && !file.IsDots()) { SHFILEINFO info; CString temp = str; int index = temp.Find("*.*"); temp.Delete(index,3); SHGetFileInfo(temp + file.GetFileName(),0,&info,sizeof(&info),SHGFI_DISPLAYNAME | SHGFI_ICON); int i = m_ImageList.Add(info.hIcon); m_list.InsertItem(i,info.szDisplayName,i); } } *pResult = 0;} 有谁见过这种用法, 翻了好多书都找不到的!!! 学MFC,COM,ATL这些,对以后搞嵌入式开发有用吗? 不触发事件,直接调用事件函数,是否可以?依旧高分,谢谢各位帮忙! CTreeCtrl控件的问题 da bu chu zhong wen 动态库连接出错 谁看过《VC++项目案例导航〉 我有代码就是无法使之运行!!!!!!!!!!! DCOM和COM+的配置问题! 多謝大海的郵件﹐給您分 一自动生成菜单的SDI希望个位帮忙 请问如何判断本机的相应端口是否已经被占用了 谁有NAT端口映射算法?
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);
} 如何将提取出的图标资源保存为Ico或Bmp格式。
//保存图标资源为ICO或BMP格式文件
void CIconSnapDlg::OnButtonSaveas()
{
LPTSTR lpIconID; CFileDialog fileDialog( FALSE,"*.ICO",NULL,NULL,"图标文件(*.ICO)|*.ICO|位图文件(*.BMP)|*.BMP||");
if (fileDialog.DoModal() == IDOK)
{
szSaveFileName=fileDialog.GetPathName();
szSaveFileExtName= fileDialog.GetFileExt ();
szSaveFileExtName.MakeLower (); if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl")
if((lpIconID=(LPTSTR)m_List.GetItemData (m_List.GetCurSel()))!= (LPTSTR)LB_ERR)
lpIR=pIcons->ReadIconFromEXEFile (szOpenFileName,lpIconID);
if(szSaveFileExtName=="bmp")
{
if(lpIR!=NULL && m_List.GetCount ()>0)
{
BeginWaitCursor();
pIcons->IconImageToBMPFile (szSaveFileName,&lpIR->IconImages [0]);
EndWaitCursor();
}
else
MessageBox( "没有可保存的图标资源!", "错误", MB_OK );
}
else if(szSaveFileExtName=="ico")
{
if(lpIR!=NULL && m_List.GetCount ()>0)
{
BeginWaitCursor();
pIcons->WriteIconToICOFile (lpIR,szSaveFileName);
EndWaitCursor();
}
else
MessageBox( "没有可保存的图标资源!", "错误", MB_OK );
}
}
}
{
m_list.DeleteAllItems();
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TVITEM item = pNMTreeView->itemNew;
if(item.hItem == m_hRoot)
return;
CString str = GetFullPath(item.hItem);
if(str.Right(1) != "\\")
str += "\\";
str += "*.*";
CFileFind file;
BOOL bContinue = file.FindFile(str);
while(bContinue)
{
bContinue = file.FindNextFile();
if(!file.IsDirectory() && !file.IsDots())
{
SHFILEINFO info;
CString temp = str;
int index = temp.Find("*.*");
temp.Delete(index,3);
SHGetFileInfo(temp + file.GetFileName(),0,&info,sizeof(&info),SHGFI_DISPLAYNAME | SHGFI_ICON);
int i = m_ImageList.Add(info.hIcon);
m_list.InsertItem(i,info.szDisplayName,i);
}
}
*pResult = 0;
}