· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Проблема с SHGetFileInfo

Посл.отвђт Сообщен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