W7 > ITaskbarList3 > SetProgressValue

Тема в разделе "WASM.WIN32", создана пользователем _Newbie_, 1 ноя 2009.

  1. _Newbie_

    _Newbie_ New Member

    Публикаций:
    0
    Регистрация:
    1 ноя 2009
    Сообщения:
    2
    Здравствуйте уважаемые форумчане.

    После знакомства с новой версией окон ака 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):
    1.     invoke  CoInitialize, NULL
    2.  
    3.     invoke  CoCreateInstance, addr CLSID_TaskbarList, NULL, CLSCTX_ALL, addr IID_ITaskbarList3, addr psl
    4.     .if eax == S_OK
    5.  
    6.         push    TBPF_INDETERMINATE
    7.         push    hWnd
    8.         mov eax, psl
    9.         push    eax
    10.         mov eax, [eax]
    11.         call    dword ptr [eax + 4*10]      ; SetProgressState 
    12.  
    13.         invoke  Sleep, 1000*5
    14.  
    15.         push    100
    16.         push    50
    17.         push    hWnd
    18.             mov eax, psl
    19.             push    eax
    20.             mov eax, [eax]
    21.         call    dword ptr [eax + 4*9]       ; SetProgressValue
    22.        
    23.     .endif
    24.  
    25.     invoke  CoUninitialize
    приложение из которого вырван этот кусок кода, естественно обладает окном и кнопкой на таскбаре. Просто это все поскипано с целью экономии пространства.

    данные и прочее:

    Код (Text):
    1. .const
    2.     TBPF_NOPROGRESS equ 0h
    3.     TBPF_INDETERMINATE  equ 1h
    4.     TBPF_NORMAL     equ 2h
    5.     TBPF_ERROR      equ 4h
    6.     TBPF_PAUSED     equ 8h
    7.  
    8. .data
    9.     GUID    STRUCT
    10.         Data1     dd ?
    11.         Data2     dw ?
    12.         Data3     dw ?
    13.         Data4     db 8 dup(?)
    14.     GUID ENDS
    15.  
    16.     CLSID_TaskbarList   GUID {056FDF344h, 0FD6Dh, 011D0h, {095h, 08Ah, 000h, 060h, 097h, 0C9h, 0A0h, 090h}}
    17.     IID_ITaskbarList3   GUID {0EA1AFB91h, 09E28h, 04B86h, {090h, 0E9h, 09Eh, 09Fh, 08Ah, 05Eh, 0EFh, 0AFh}}
    18. .data?
    19.     psl dd ?
    Вопрос собственно следующий: какого оно не работает? В чем может быть проблема, куда копать?

    PS. Заодно может посоветуете какой отладчик с поддержкой W7 ? OllyDebugger отказывается загружать приложение.

    Благодарю за внимание... в ожидании ваших ответов...
     
  2. _Newbie_

    _Newbie_ New Member

    Публикаций:
    0
    Регистрация:
    1 ноя 2009
    Сообщения:
    2
    Проблема найдена. Невнимательность при чтении мануалов.

    MSDN:
    Код (Text):
    1. HRESULT SetProgressValue(      
    2.     HWND hwnd,
    3.     ULONGLONG ullCompleted,
    4.     ULONGLONG ullTotal
    5. );
    MSDN:
    A ULONGLONG is a 64-bit unsigned integer.

    В программе же использовался просто ULONG (32 бита). Отчего и глючило прогресбар.
    Итак правильный вызов выглядит следующим образом:

    Код (Text):
    1.         push    0               ;
    2.         push    100             ; ullTotal
    3.         push    0               ;
    4.         push    50              ; ullCompleted
    5.         push    hWnd
    6.             mov eax, psl
    7.             push    eax
    8.             mov eax, [eax]
    9.         call    dword ptr [eax + 4*9]       ; SetProgressValue