Как создать элемент управления Property Sheet на FASM?

Тема в разделе "WASM.BEGINNERS", создана пользователем NAGRIS, 15 янв 2007.

  1. NAGRIS

    NAGRIS New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    17
    Как создать элемент управления Property Sheet на FASM?

    Почему функция PropertySheet всегда возвращает FFFFFFFF?

    Где ошибка?

    Код (Text):
    1. .
    2. .
    3. .
    4.  
    5. PropSheet   PROPSHEETPAGE      
    6. PropHdr     PROPSHEETHEADER  
    7. hPropSheet  dd 2 DUP (?)
    8.  
    9. .
    10. .
    11. .
    12.  
    13. ; создаем главное окно программы
    14. invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW,100,100,800,500,0,NULL,[wc.hInstance],NULL
    15. or  eax,eax        
    16. jz  end_loop       
    17. mov [hMainWnd],eax     
    18. mov [showflag],1
    19.  
    20. mov [PropSheet.dwSize], sizeof.PROPSHEETPAGE
    21. mov [PropSheet.dwFlags], PSP_DEFAULT        
    22. mov [PropSheet.hInstance], wc.hInstance    
    23. mov [PropSheet.pszTemplate], PROCESSES      
    24. mov [PropSheet.pszIcon], 0                  
    25. mov [PropSheet.pfnDlgProc], DialogFunc      
    26. mov [PropSheet.pszTitle], pszProcesses      
    27. mov [PropSheet.lParam], 0                  
    28. mov [PropSheet.pfnCallback], 0              
    29.  
    30. mov [PropSheet.dwSize+sizeof.PROPSHEETPAGE], sizeof.PROPSHEETPAGE
    31. mov [PropSheet.dwFlags+sizeof.PROPSHEETPAGE], PSP_DEFAULT        
    32. mov [PropSheet.hInstance+sizeof.PROPSHEETPAGE], wc.hInstance    
    33. mov [PropSheet.pszTemplate+sizeof.PROPSHEETPAGE],  FILES        
    34. mov [PropSheet.pszIcon+sizeof.PROPSHEETPAGE], 0                  
    35. mov [PropSheet.pfnDlgProc+sizeof.PROPSHEETPAGE], DialogFunc      
    36. mov [PropSheet.pszTitle+sizeof.PROPSHEETPAGE], pszFiles          
    37. mov [PropSheet.lParam+sizeof.PROPSHEETPAGE], 0                  
    38. mov [PropSheet.pfnCallback+sizeof.PROPSHEETPAGE], 0              
    39.  
    40. invoke  CreatePropertySheetPage, PropSheet                    
    41. mov     [hPropSheet],  eax                                    
    42. invoke  CreatePropertySheetPage, PropSheet+sizeof.PROPSHEETPAGE
    43. mov     [hPropSheet+4],eax    
    44.  
    45. mov     [PropHdr.dwSize], sizeof.PROPSHEETHEADER                      
    46. mov     [PropHdr.dwFlags], PSH_PROPSHEETPAGE+PSH_DEFAULT+PSH_MODELESS
    47. mov     [PropHdr.hwndParent], hMainWnd                                
    48. mov     [PropHdr.hInstance], wc.hInstance                              
    49. mov     [PropHdr.pszIcon], 0                                          
    50. mov     [PropHdr.pszCaption],  caption                                
    51. mov     [PropHdr.nPages], 2                                            
    52. mov     [PropHdr.pStartPage], pszProcesses                            
    53. mov     [PropHdr.ppsp], hPropSheet                                    
    54. mov     [PropHdr.pfnCallback], 0
    55.  
    56. invoke  PropertySheet, PropHdr
    57. .
    58. .
    59. .
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. #if (_WIN32_IE >= 0x0400)
    2.     union {
    3.         HBITMAP hbmWatermark;
    4.         LPCTSTR pszbmWatermark;
    5.         };
    6.     HPALETTE hplWatermark;
    7.     union {
    8.         HBITMAP hbmHeader;
    9.         LPCSTR pszbmHeader;
    10.         };
    11. #endif
    часть структуры PROPSHEETHEADER. она у тебя есть? она хоть и содержит нули, но меняет размер... можт в этом проблема.
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    2NAGRIS:
    надо так
    push [wc.hInstance]
    pop [PropSheet.hInstance]
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    И в других местах, где wc.hInstance, тоже так сделай.
     
  5. NAGRIS

    NAGRIS New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    17
    twgt

    заменил

    wc.hInstance

    на

    push [wc.hInstance]
    pop [PropSheet.hInstance]

    ничего не изменилось

    FreeManCPM

    Код который я привел это переделанный мною код MASM

    там тоже нет кода который вы указали

    MASM

    Код (Text):
    1. .
    2. .
    3. .
    4.         mov PropSheet.dwSize, sizeof PROPSHEETPAGE
    5.         M2M PropSheet.dwFlags, PSP_DEFAULT   
    6.         M2M PropSheet.hInstance, hInstance   
    7.         M2M PropSheet.pszTemplate, offset mydb   
    8.         mov PropSheet.pszIcon, 0         
    9.         M2M PropSheet.pfnDlgProc, offset DialogFunc  
    10.         M2M PropSheet.pszTitle, offset psztitle  
    11.         mov PropSheet.lParam, 0          
    12.         mov PropSheet.pfnCallback, 0         
    13.  
    14.  
    15.  
    16.         mov PropSheet[(sizeof PROPSHEETPAGE)].dwSize, sizeof PROPSHEETPAGE
    17.         M2M PropSheet[(sizeof PROPSHEETPAGE)].dwFlags, PSP_DEFAULT
    18.         M2M PropSheet[(sizeof PROPSHEETPAGE)].hInstance, hInstance
    19.         M2M PropSheet[(sizeof PROPSHEETPAGE)].pszTemplate, offset mydb2
    20.         mov PropSheet[(sizeof PROPSHEETPAGE)].pszIcon, 0
    21.         M2M PropSheet[(sizeof PROPSHEETPAGE)].pfnDlgProc, offset DialogFunc2
    22.         M2M PropSheet[(sizeof PROPSHEETPAGE)].pszTitle, offset psztitle
    23.         mov PropSheet[(sizeof PROPSHEETPAGE)].lParam, 0
    24.         mov PropSheet[(sizeof PROPSHEETPAGE)].pfnCallback, 0
    25.  
    26.  
    27.         mov PropSheet[(sizeof PROPSHEETPAGE)*2].dwSize, sizeof PROPSHEETPAGE
    28.         M2M PropSheet[(sizeof PROPSHEETPAGE)*2].dwFlags, PSP_DEFAULT
    29.         M2M PropSheet[(sizeof PROPSHEETPAGE)*2].hInstance, hInstance
    30.         M2M PropSheet[(sizeof PROPSHEETPAGE)*2].pszTemplate, offset mydb3
    31.         mov PropSheet[(sizeof PROPSHEETPAGE)*2].pszIcon, 0
    32.         M2M PropSheet[(sizeof PROPSHEETPAGE)*2].pfnDlgProc, offset DialogFunc3
    33.         M2M PropSheet[(sizeof PROPSHEETPAGE)*2].pszTitle, offset psztitle
    34.         mov PropSheet[(sizeof PROPSHEETPAGE)*2].lParam, 0
    35.         mov PropSheet[(sizeof PROPSHEETPAGE)*2].pfnCallback, 0
    36.  
    37.  
    38.  
    39.         invoke CreatePropertySheetPage, ADDR PropSheet
    40.         mov hPs,  eax
    41.         invoke CreatePropertySheetPage, ADDR PropSheet[sizeof PROPSHEETPAGE]
    42.         mov hPs[4],eax
    43.         invoke CreatePropertySheetPage, ADDR PropSheet[(sizeof PROPSHEETPAGE)*2]
    44.         mov hPs[8],eax
    45.  
    46.  
    47.  
    48.         mov PropHdr.dwSize, sizeof PROPSHEETHEADER
    49.         mov PropHdr.dwFlags, PSH_DEFAULT
    50.         M2M PropHdr.hwndParent,hWnd
    51.         M2M PropHdr.hInstance, hInstance
    52.         mov PropHdr.pszIcon, 0
    53.         M2M PropHdr.pszCaption, offset caption
    54.         mov PropHdr.nPages, 3
    55.         mov PropHdr.nStartPage, 0
    56.         M2M PropHdr.phpage, offset hPs
    57.         mov PropHdr.pfnCallback, 0
    58.  
    59.  
    60.        
    61.         invoke  PropertySheet, ADDR PropHdr
    62. .
    63. .
    64. .
    twgt

    M2M это как я понимаю макрос делающий то, что вы и посоветовали

    вот как он описан

    Код (Text):
    1. .
    2. .
    3. .
    4. M2M     MACRO M1, M2        ;; Copy word from memory to memory
    5.         push M2
    6.         pop  M1
    7.         ENDM
    8.  
    9. .
    10. .
    11. .
    12.  
    13. M2M MACRO   arg1, arg2
    14.    
    15.     push    arg2
    16.     pop arg1
    17.  
    18.     ENDM  
    19. .
    20. .
    21. .
    Я написал свой макрос по аналогии

    macro M2M op1,op2
    {

    push op2
    pop op1

    }

    код стал выглядеть так

    FASM

    Код (Text):
    1. .
    2. .
    3. .
    4. PropSheet    PROPSHEETPAGE      
    5. PropSheet1   PROPSHEETPAGE       ; я ввел дополнительную структуру т.к. в отладчике видно что раньше
    6.                                  ; PROPSHEETHEADER записывался поверх второй структуры PROPSHEETPAGE
    7.                                  ; наверное так не должно быть ?
    8.  
    9. PropHdr      PROPSHEETHEADER        
    10. hPropSheet   dd 2 DUP (?)
    11.  
    12.                 mov [PropSheet.dwSize], sizeof.PROPSHEETPAGE
    13.                 M2M [PropSheet.dwFlags], PSP_DEFAULT        
    14.                 M2M [PropSheet.hInstance], wc.hInstance        
    15.                 mov [PropSheet.pszTemplate], PROCESSES    
    16.                 mov [PropSheet.pszIcon], 0                  
    17.                 M2M [PropSheet.pfnDlgProc], DialogFunc  
    18.                 M2M [PropSheet.pszTitle], pszProcesses  
    19.                 mov [PropSheet.lParam], 0                  
    20.                 mov [PropSheet.pfnCallback], 0              
    21.  
    22.  
    23.                 mov [PropSheet1.dwSize], sizeof.PROPSHEETPAGE
    24.                 M2M [PropSheet1.dwFlags], PSP_DEFAULT        
    25.                 M2M [PropSheet.hInstance+sizeof.PROPSHEETPAGE], wc.hInstance        
    26.                 mov [PropSheet1.pszTemplate],  FILES    
    27.                 mov [PropSheet1.pszIcon], 0                  
    28.                 M2M [PropSheet1.pfnDlgProc], DialogFunc  
    29.                 M2M [PropSheet1.pszTitle], pszFiles  
    30.                 mov [PropSheet1.lParam], 0                  
    31.                 mov [PropSheet1.pfnCallback], 0              
    32.  
    33.                 invoke CreatePropertySheetPage, PropSheet
    34.                 mov     [hPropSheet],  eax
    35.                 invoke CreatePropertySheetPage, PropSheet+sizeof.PROPSHEETPAGE
    36.                 mov     [hPropSheet+4],eax
    37.  
    38.                 mov     [PropHdr.dwSize], sizeof.PROPSHEETHEADER
    39.                 mov     [PropHdr.dwFlags], PSH_PROPSHEETPAGE;+PSH_DEFAULT+PSH_MODELESS
    40.                 M2M     [PropHdr.hwndParent], hMainWnd
    41.                 M2M     [PropHdr.hInstance], wc.hInstance
    42.                 mov     [PropHdr.pszIcon], 0
    43.                 M2M     [PropHdr.pszCaption],  caption
    44.                 mov     [PropHdr.nPages], 2
    45.                 mov     [PropHdr.pStartPage], pszProcesses
    46.                 M2M     [PropHdr.ppsp], hPropSheet
    47.                 mov     [PropHdr.pfnCallback], 0
    48.  
    49.                invoke  PropertySheet, PropHdr
    50. .
    51. .
    52. .
    Этот код работает также как и старый, т.е. ничего не создается. PropertySheet возвращает FFFFFFFF
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    от себя добавлю еще так устрой с hMainWnd.
    и пока плиз без всяких М2М. и внимательно посмотри под отладчиком
     
  7. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    2NAGRIS:
    Может исходник кинеш, ато я на это всё смотрю с телефона, неудобна аднако.
     
  8. NAGRIS

    NAGRIS New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    17
    FreeManCPM

    Делал и с hMainWnd, и везде где M2M, везде делал через push и pop все равно одно и то же.

    Под отладчиком смотрел все идет нормально, но при вызове
    invoke PropertySheet, PropHdr
    всегда возвращается FFFFFFFF.

    twgt

    исходник
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Вроде все ошбки исправил, а всё равно не работает.
    Может кто-нбудь заметит ешё ошибки. http://twit.wen.ru/proga.zip
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    1.
    Код (Text):
    1. mov     [PropHdr.pStartPage], pszProcesses
    А флага PSH_USEPSTARTPAGE нет.

    2.
    Код (Text):
    1. M2M     [PropHdr.ppsp], hPropSheet
    ppsp используется, если Windows создаёт страницы, а здесь ты сам создаёшь.

    http://msdn2.microsoft.com/en-us/library/ms652418.aspx
     
  11. NAGRIS

    NAGRIS New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    17
    Даже если поставить флаг PSH_USEPSTARTPAGE все равно ничего не происходит.
    Если вместо ppsp использовать phpage, то FASM ругается. Если дописать phpage в comctl32.inc и использовать потом, то тоже ничего не происходит.
    Статью сейчас почитаю.