Здравствуйте уважаемые форумчане. После знакомства с новой версией окон ака Windows 7, захотелось использовать ее модные возможности и в своих программках. Одна из новых фич винды - некое подобие статусбара в таскбаре(статья о таком элементе на Хабрахабр http://habrahabr.ru/blogs/windows7/59856/). Реализуется это все методами SetProgressValue, SetProgressState интерфейса ITaskbarList3 (MSDN http://msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx). С SetProgressState(hWnd, TBPF_INDETERMINATE); все впорядке, она работает без проблем. А вот, с SetProgressValue какие-то чудеса, она упорно не хочет работать так как надо. Т.е. при SetProgressValue(hWnd, 100, 100); как положено заполняется 100% статусбара. При SetProgressValue(hWnd, 50, 100); заполняется 0% статусбара. Хотя должно бы было поидее 50%. Ниже привожу кусок кода на MASM. Вызовы COM сделаны так коряво, ибо заголовочных файлов под новую винду для асма еще нигде не встречал. Код (Text): invoke CoInitialize, NULL invoke CoCreateInstance, addr CLSID_TaskbarList, NULL, CLSCTX_ALL, addr IID_ITaskbarList3, addr psl .if eax == S_OK push TBPF_INDETERMINATE push hWnd mov eax, psl push eax mov eax, [eax] call dword ptr [eax + 4*10] ; SetProgressState invoke Sleep, 1000*5 push 100 push 50 push hWnd mov eax, psl push eax mov eax, [eax] call dword ptr [eax + 4*9] ; SetProgressValue .endif invoke CoUninitialize приложение из которого вырван этот кусок кода, естественно обладает окном и кнопкой на таскбаре. Просто это все поскипано с целью экономии пространства. данные и прочее: Код (Text): .const TBPF_NOPROGRESS equ 0h TBPF_INDETERMINATE equ 1h TBPF_NORMAL equ 2h TBPF_ERROR equ 4h TBPF_PAUSED equ 8h .data GUID STRUCT Data1 dd ? Data2 dw ? Data3 dw ? Data4 db 8 dup(?) GUID ENDS CLSID_TaskbarList GUID {056FDF344h, 0FD6Dh, 011D0h, {095h, 08Ah, 000h, 060h, 097h, 0C9h, 0A0h, 090h}} IID_ITaskbarList3 GUID {0EA1AFB91h, 09E28h, 04B86h, {090h, 0E9h, 09Eh, 09Fh, 08Ah, 05Eh, 0EFh, 0AFh}} .data? psl dd ? Вопрос собственно следующий: какого оно не работает? В чем может быть проблема, куда копать? PS. Заодно может посоветуете какой отладчик с поддержкой W7 ? OllyDebugger отказывается загружать приложение. Благодарю за внимание... в ожидании ваших ответов...
Проблема найдена. Невнимательность при чтении мануалов. MSDN: Код (Text): HRESULT SetProgressValue( HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal ); MSDN: A ULONGLONG is a 64-bit unsigned integer. В программе же использовался просто ULONG (32 бита). Отчего и глючило прогресбар. Итак правильный вызов выглядит следующим образом: Код (Text): push 0 ; push 100 ; ullTotal push 0 ; push 50 ; ullCompleted push hWnd mov eax, psl push eax mov eax, [eax] call dword ptr [eax + 4*9] ; SetProgressValue