Как создать элемент управления Property Sheet на FASM? Почему функция PropertySheet всегда возвращает FFFFFFFF? Где ошибка? Код (Text): . . . PropSheet PROPSHEETPAGE PropHdr PROPSHEETHEADER hPropSheet dd 2 DUP (?) . . . ; создаем главное окно программы invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW,100,100,800,500,0,NULL,[wc.hInstance],NULL or eax,eax jz end_loop mov [hMainWnd],eax mov [showflag],1 mov [PropSheet.dwSize], sizeof.PROPSHEETPAGE mov [PropSheet.dwFlags], PSP_DEFAULT mov [PropSheet.hInstance], wc.hInstance mov [PropSheet.pszTemplate], PROCESSES mov [PropSheet.pszIcon], 0 mov [PropSheet.pfnDlgProc], DialogFunc mov [PropSheet.pszTitle], pszProcesses mov [PropSheet.lParam], 0 mov [PropSheet.pfnCallback], 0 mov [PropSheet.dwSize+sizeof.PROPSHEETPAGE], sizeof.PROPSHEETPAGE mov [PropSheet.dwFlags+sizeof.PROPSHEETPAGE], PSP_DEFAULT mov [PropSheet.hInstance+sizeof.PROPSHEETPAGE], wc.hInstance mov [PropSheet.pszTemplate+sizeof.PROPSHEETPAGE], FILES mov [PropSheet.pszIcon+sizeof.PROPSHEETPAGE], 0 mov [PropSheet.pfnDlgProc+sizeof.PROPSHEETPAGE], DialogFunc mov [PropSheet.pszTitle+sizeof.PROPSHEETPAGE], pszFiles mov [PropSheet.lParam+sizeof.PROPSHEETPAGE], 0 mov [PropSheet.pfnCallback+sizeof.PROPSHEETPAGE], 0 invoke CreatePropertySheetPage, PropSheet mov [hPropSheet], eax invoke CreatePropertySheetPage, PropSheet+sizeof.PROPSHEETPAGE mov [hPropSheet+4],eax mov [PropHdr.dwSize], sizeof.PROPSHEETHEADER mov [PropHdr.dwFlags], PSH_PROPSHEETPAGE+PSH_DEFAULT+PSH_MODELESS mov [PropHdr.hwndParent], hMainWnd mov [PropHdr.hInstance], wc.hInstance mov [PropHdr.pszIcon], 0 mov [PropHdr.pszCaption], caption mov [PropHdr.nPages], 2 mov [PropHdr.pStartPage], pszProcesses mov [PropHdr.ppsp], hPropSheet mov [PropHdr.pfnCallback], 0 invoke PropertySheet, PropHdr . . .
Код (Text): #if (_WIN32_IE >= 0x0400) union { HBITMAP hbmWatermark; LPCTSTR pszbmWatermark; }; HPALETTE hplWatermark; union { HBITMAP hbmHeader; LPCSTR pszbmHeader; }; #endif часть структуры PROPSHEETHEADER. она у тебя есть? она хоть и содержит нули, но меняет размер... можт в этом проблема.
twgt заменил wc.hInstance на push [wc.hInstance] pop [PropSheet.hInstance] ничего не изменилось FreeManCPM Код который я привел это переделанный мною код MASM там тоже нет кода который вы указали MASM Код (Text): . . . mov PropSheet.dwSize, sizeof PROPSHEETPAGE M2M PropSheet.dwFlags, PSP_DEFAULT M2M PropSheet.hInstance, hInstance M2M PropSheet.pszTemplate, offset mydb mov PropSheet.pszIcon, 0 M2M PropSheet.pfnDlgProc, offset DialogFunc M2M PropSheet.pszTitle, offset psztitle mov PropSheet.lParam, 0 mov PropSheet.pfnCallback, 0 mov PropSheet[(sizeof PROPSHEETPAGE)].dwSize, sizeof PROPSHEETPAGE M2M PropSheet[(sizeof PROPSHEETPAGE)].dwFlags, PSP_DEFAULT M2M PropSheet[(sizeof PROPSHEETPAGE)].hInstance, hInstance M2M PropSheet[(sizeof PROPSHEETPAGE)].pszTemplate, offset mydb2 mov PropSheet[(sizeof PROPSHEETPAGE)].pszIcon, 0 M2M PropSheet[(sizeof PROPSHEETPAGE)].pfnDlgProc, offset DialogFunc2 M2M PropSheet[(sizeof PROPSHEETPAGE)].pszTitle, offset psztitle mov PropSheet[(sizeof PROPSHEETPAGE)].lParam, 0 mov PropSheet[(sizeof PROPSHEETPAGE)].pfnCallback, 0 mov PropSheet[(sizeof PROPSHEETPAGE)*2].dwSize, sizeof PROPSHEETPAGE M2M PropSheet[(sizeof PROPSHEETPAGE)*2].dwFlags, PSP_DEFAULT M2M PropSheet[(sizeof PROPSHEETPAGE)*2].hInstance, hInstance M2M PropSheet[(sizeof PROPSHEETPAGE)*2].pszTemplate, offset mydb3 mov PropSheet[(sizeof PROPSHEETPAGE)*2].pszIcon, 0 M2M PropSheet[(sizeof PROPSHEETPAGE)*2].pfnDlgProc, offset DialogFunc3 M2M PropSheet[(sizeof PROPSHEETPAGE)*2].pszTitle, offset psztitle mov PropSheet[(sizeof PROPSHEETPAGE)*2].lParam, 0 mov PropSheet[(sizeof PROPSHEETPAGE)*2].pfnCallback, 0 invoke CreatePropertySheetPage, ADDR PropSheet mov hPs, eax invoke CreatePropertySheetPage, ADDR PropSheet[sizeof PROPSHEETPAGE] mov hPs[4],eax invoke CreatePropertySheetPage, ADDR PropSheet[(sizeof PROPSHEETPAGE)*2] mov hPs[8],eax mov PropHdr.dwSize, sizeof PROPSHEETHEADER mov PropHdr.dwFlags, PSH_DEFAULT M2M PropHdr.hwndParent,hWnd M2M PropHdr.hInstance, hInstance mov PropHdr.pszIcon, 0 M2M PropHdr.pszCaption, offset caption mov PropHdr.nPages, 3 mov PropHdr.nStartPage, 0 M2M PropHdr.phpage, offset hPs mov PropHdr.pfnCallback, 0 invoke PropertySheet, ADDR PropHdr . . . twgt M2M это как я понимаю макрос делающий то, что вы и посоветовали вот как он описан Код (Text): . . . M2M MACRO M1, M2 ;; Copy word from memory to memory push M2 pop M1 ENDM . . . M2M MACRO arg1, arg2 push arg2 pop arg1 ENDM . . . Я написал свой макрос по аналогии macro M2M op1,op2 { push op2 pop op1 } код стал выглядеть так FASM Код (Text): . . . PropSheet PROPSHEETPAGE PropSheet1 PROPSHEETPAGE ; я ввел дополнительную структуру т.к. в отладчике видно что раньше ; PROPSHEETHEADER записывался поверх второй структуры PROPSHEETPAGE ; наверное так не должно быть ? PropHdr PROPSHEETHEADER hPropSheet dd 2 DUP (?) mov [PropSheet.dwSize], sizeof.PROPSHEETPAGE M2M [PropSheet.dwFlags], PSP_DEFAULT M2M [PropSheet.hInstance], wc.hInstance mov [PropSheet.pszTemplate], PROCESSES mov [PropSheet.pszIcon], 0 M2M [PropSheet.pfnDlgProc], DialogFunc M2M [PropSheet.pszTitle], pszProcesses mov [PropSheet.lParam], 0 mov [PropSheet.pfnCallback], 0 mov [PropSheet1.dwSize], sizeof.PROPSHEETPAGE M2M [PropSheet1.dwFlags], PSP_DEFAULT M2M [PropSheet.hInstance+sizeof.PROPSHEETPAGE], wc.hInstance mov [PropSheet1.pszTemplate], FILES mov [PropSheet1.pszIcon], 0 M2M [PropSheet1.pfnDlgProc], DialogFunc M2M [PropSheet1.pszTitle], pszFiles mov [PropSheet1.lParam], 0 mov [PropSheet1.pfnCallback], 0 invoke CreatePropertySheetPage, PropSheet mov [hPropSheet], eax invoke CreatePropertySheetPage, PropSheet+sizeof.PROPSHEETPAGE mov [hPropSheet+4],eax mov [PropHdr.dwSize], sizeof.PROPSHEETHEADER mov [PropHdr.dwFlags], PSH_PROPSHEETPAGE;+PSH_DEFAULT+PSH_MODELESS M2M [PropHdr.hwndParent], hMainWnd M2M [PropHdr.hInstance], wc.hInstance mov [PropHdr.pszIcon], 0 M2M [PropHdr.pszCaption], caption mov [PropHdr.nPages], 2 mov [PropHdr.pStartPage], pszProcesses M2M [PropHdr.ppsp], hPropSheet mov [PropHdr.pfnCallback], 0 invoke PropertySheet, PropHdr . . . Этот код работает также как и старый, т.е. ничего не создается. PropertySheet возвращает FFFFFFFF
от себя добавлю еще так устрой с hMainWnd. и пока плиз без всяких М2М. и внимательно посмотри под отладчиком
FreeManCPM Делал и с hMainWnd, и везде где M2M, везде делал через push и pop все равно одно и то же. Под отладчиком смотрел все идет нормально, но при вызове invoke PropertySheet, PropHdr всегда возвращается FFFFFFFF. twgt исходник
Вроде все ошбки исправил, а всё равно не работает. Может кто-нбудь заметит ешё ошибки. http://twit.wen.ru/proga.zip
1. Код (Text): mov [PropHdr.pStartPage], pszProcesses А флага PSH_USEPSTARTPAGE нет. 2. Код (Text): M2M [PropHdr.ppsp], hPropSheet ppsp используется, если Windows создаёт страницы, а здесь ты сам создаёшь. http://msdn2.microsoft.com/en-us/library/ms652418.aspx
Даже если поставить флаг PSH_USEPSTARTPAGE все равно ничего не происходит. Если вместо ppsp использовать phpage, то FASM ругается. Если дописать phpage в comctl32.inc и использовать потом, то тоже ничего не происходит. Статью сейчас почитаю.