|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 2, 2004 14:56:09 Прикрутил к WinObjEx такую фичу, чтоб выводить список процессов, в которых открыт хендл объекта. Инфа выводиться в ListView, иконки процессов дергаются через SHGetFileInfo. Всё чудно работает до тех пор, пока я не запущу WinObjEx из под System Local account (это ещё одна фича, которую я прикрутил, чтоб больше инфы вытягивать). Трабла в том, что в этом случае, при каждом вызове SHGetFileInfo у меня в процессе появляется штук 5-6 новых хендлов иконок, которые уже никогда не закрываются. Как их закрыть принудительно не понятно. Может кто-нить сталкивался с таким? Пока я решил вопрос старым дедовским методом - через CreateToolhelp32Snapshot( TH32CS_SNAPMODULE.../ Module32First, а потом ExtractIcon. Но тут проблема такая, что иконка достается то ли 16 цветная, то ли 32х32 и потом ужимается до 16. В общем не очень эстетично. Порывшись по MSDN я что-то не догнал, как достать из модуля процесса иконку так чтобы она красиво ложилась в имейдж лист, созданный ImageList_Create(...ILC_MASK | ILC_COLOR32. Это второй вопрос. Буду благодарен за помощь. |
|
|
Дата: Май 2, 2004 19:32:07 Можно попробовать так: 0. invoke EnumResourceNames,hModule,RT_ICON,OFFSET lpfn,0 . . . 1. invoke FindResource,hModule,first_icon_id,RT_ICON mov dResource,eax 2. invoke SizeofResource,hModule,eax mov dSize,eax 3. invoke LoadResource,hModule,dResource mov dResource,eax 4. invoke LockResource,eax 5. CreateIconFromResourceEx,eax,dSize,1,030000h,WIDTH,HEIGHT,LR_DEFAULTCO LOR 6. invoke ImageList_ReplaceIcon,himl,-1,eax . . . 7. invoke FreeResource,dResourceХотя логично предположить, что SHGetFileInfo и ExtractIcon именно так и поступают (после LoadLibraryEx(path,0,LOAD_LIBRARY_AS_DATAFILE)), я неоднократно наблюдал у них глюки с цветом/размером иконок... |
|
|
Дата: Май 3, 2004 05:36:34 Да, брат, совсем ты забросил третье кольцо :) Насчет размеров: The ExtractIcon function retrieves a handle to an icon from the specified executable file, dynamic-link library (DLL), or icon file. To retrieve an array of handles to large or small icons, use the ExtractIconEx function Есть еще ExtractAssociatedIconEx - работает не только для экзешников. Я ею 32-битные иконки извлекал и рисовал без проблем. |
|
|
Дата: Май 3, 2004 14:19:19 [ Toxic: Да, брат, совсем ты забросил третье кольцо :) ] Да, есть такое дело :) ExtractIconEx и ExtractAssociatedIconEx я смотрел/пробовал, но что-то уже не помню какие были результаты. В общем, я пока слегка модифицированный вариант Quantum'а прикрутил. Да простит мя великий дух дзена за этот еретический код. HICON WINAPI CreateIconFromModuleResource(
HMODULE hModule,
LPTSTR lpszName
)
{
HRSRC hResource;
HGLOBAL hMem;
LPVOID lpResource;
int nID;
hResource = FindResource( hModule, MAKEINTRESOURCE(lpszName), RT_GROUP_ICON );
if ( hResource == NULL )
// Probably it is a name
hResource = FindResource( hModule, lpszName, RT_GROUP_ICON );
hMem = LoadResource( hModule, hResource );
lpResource = LockResource( hMem );
nID = LookupIconIdFromDirectoryEx((PBYTE) lpResource, TRUE,
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
hResource = FindResource(hModule, MAKEINTRESOURCE(nID), MAKEINTRESOURCE(RT_ICON));
hMem = (HRSRC) LoadResource(hModule, hResource);
lpResource = (HRSRC) LockResource(hMem);
return CreateIconFromResourceEx((PBYTE) lpResource,
SizeofResource(hModule, hResource), TRUE, 0x00030000,
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
}
////////////////////////////////////////////////////////////////////// ///////////////////////
static HICON g_hImageFileIcon;
BOOL CALLBACK EnumResNameProc(
HMODULE hModule,
LPCTSTR lpszType,
LPTSTR lpszName,
long lParam
)
{
g_hImageFileIcon = CreateIconFromModuleResource(hModule, lpszName);
return FALSE;
}
////////////////////////////////////////////////////////////////////// ///////////////////////
HICON
WINAPI
ExtractIconFromImageFile (
LPCTSTR lpszExeFileName
)
{
HMODULE hModule;
HICON hIcon = NULL;
hModule = LoadLibraryEx(lpszExeFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
if ( hModule != NULL ) {
g_hImageFileIcon = NULL; // If EnumResourceNames fails we will use default icon
EnumResourceNames(hModule, RT_GROUP_ICON, EnumResNameProc, NULL);
if ( g_hImageFileIcon != NULL )
hIcon = g_hImageFileIcon;
FreeLibrary( hModule );
}
return hIcon;
} |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078 |