|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 16, 2004 00:13:14 · Поправил: cresta Добрый вечер, господа! Наверняка кто-то сталкивался с макросом OpenFileDlg MACRO (c:\masm32\macros\macros.asm). При создании проекта в него автоматом включается процедура OpenSaveFile proc Action:DWORD ;(здесь я добавил Action, остальное - оригинал)
LOCAL fname :DWORD
LOCAL patn :DWORD
.IF Action==1
sas patn, "All files",0,"*.*",0
mov eax, offset OFNBuffer
mov fname, OpenFileDlg(hWnd,hInstance,ADDR szOpenFile,patn)
cmp BYTE PTR [eax], 0
jne @F
return 0
@@:
mov eax,fname
.ELSEIF Action==0
.ENDIF
ret
OpenSaveFile endp
В неё включён макрос OpenFileDlg: ; -----------------------------------------
; common dialog file open and close macros.
; Return value in both is the OFFSET of a
; 260 byte dedicated buffer in the .DATA?
; section in EAX.
; -----------------------------------------
OpenFileDlg MACRO hWin,hInstance,lpTitle,lpPattern
invoke OpenFileDialog,hWin,hInstance,reparg(lpTitle),reparg(lpPattern)
EXITM <eax>
ENDM
И вот этот макрос, вернее invoke OpenFileDialog..... искажает данные в секции .data? Я нашёл кусок секции, которая искажается и исходя из комментария к макросу, соорудил там буфер OFNBuffer db 260 Dup(?), чтобы OpenFileDialog гадил туда, но он по-прежнему перезаписывает мои данные. Причём не одним куском, а выборочно. Описания OpenFileDialog я не нашёл ни в ComDlg32.inc ни в macros.asm. Самое простое -отказаться от макроса и действовать обычным способом через GetOpenFileName. Просто непонятно, это я где-то проморгал, или invoke OpenFileDialog..... так криво написана? Кто сталкивался с этим, подскажите чего и куда копать |
|
|
Дата: Июл 16, 2004 02:28:34 Что - то у меня этого макроса нет. Какой MASM? |
|
|
Дата: Июл 16, 2004 02:37:38 Недавно закачивал, версия V8.2 |
|
|
Дата: Июл 16, 2004 03:08:40 Кинь файл сюда. Глянуть хочеться. |
|
|
Дата: Июл 16, 2004 03:28:38 |
|
|
Дата: Июл 16, 2004 04:48:24 cresta И вот этот макрос, вернее invoke OpenFileDialog..... искажает данные в секции .data? Несправедливое обвинение. и исходя из комментария к макросу, соорудил там буфер Твоя интерпретация комментария неверна. Imho там написано, что "в регистре EAX будет возвращен адрес буфера размещенного в секции .data?". Подтверждение этому в исходнике OpenFileDialog. Описания OpenFileDialog я не нашёл ни в ComDlg32.inc ни в macros.asm Не там ищешь. См. masm32\m32lib\OPENDLG.ASM. |
|
|
Дата: Июл 16, 2004 05:19:55 cresta q_q правильно описал, к сожалению у меня нет всех файлов чтобы объяснить работу макроса =( |
|
|
Дата: Июл 16, 2004 05:28:33 jekyll у меня нет всех файлов чтобы объяснить Приаттачить? |
|
|
Дата: Июл 16, 2004 05:33:32 · Поправил: cresta q_q Пока не согласен Вот как я нарвался на это дело: .data?
catWnd9 db 84 Dup(?)
browseBuffer db 260 Dup(?)
browseBuffer1 db 260 Dup(?)
popWnd dd ?
prevCatWnd dd ?
prevWnd dd ?
prevID dd ?
currWnd dd ?
После вызова диалога открытия файла идет процедура сохранения его имени, в которой используется переменная, записанная по адресу prevWnd. В ней ноль при запуске приложения, она сразу инициализируется и в ней хэндл текущего активного окна. Вот кусок кода, где происходит бяка: push prevWnd PrintDec prevWnd ;здесь в Output Window RadAsm мне пишет хэндл = 131268 mov StrAddr, FUNC(OpenSaveFile,1) ;здесь вызывается процедура OpenSaveFile, в которую вставлен макрос(см.вопрос) PrintDec prevWnd ;здесь в Output Window RadAsm мне пишет хэндл = 0 pop prevWnd PrintDec prevWnd ;здесь в Output Window RadAsm мне пишет хэндл = 131268 При этом затираются также и popWnd и prevID. Пробовал на позиции popWnd вставить OFNBuffer1 db 260 Dup(?) - все равно prevWnd,popWnd и prevID затираются.Пока вышел из положения через стек Не думаю, что в такой простейшей ситуации мог ошибиться. А в макросе есть своя секция .data?, тогда почему она криво пришивается к другой секции, где прописана prevWnd и остальные переменные??? |
|
|
Дата: Июл 16, 2004 05:33:51 q_q Да нет, спасибо, я лучше MASM целиком качну. |
|
|
Дата: Июл 16, 2004 05:44:21 cresta А в макросе есть своя секция .data? Т.е. ты не смотрел masm32\m32lib\OPENDLG.ASM.
OpenFileDialog proc hParent:DWORD,Instance:DWORD,lpTitle:DWORD,lpFilter:DWORD
LOCAL ofn:OPENFILENAME
.data?
openfilebuffer db 260 dup (?)
.code
mov eax, OFFSET openfilebuffer
mov BYTE PTR [eax], 0
; --------------------
; zero fill structure
; --------------------
push edi
mov ecx, sizeof OPENFILENAME
mov al, 0
lea edi, ofn
rep stosb
pop edi
mov ofn.lStructSize, sizeof OPENFILENAME
m2m ofn.hWndOwner, hParent
m2m ofn.hInstance, Instance
m2m ofn.lpstrFilter, lpFilter
m2m ofn.lpstrFile, offset openfilebuffer
mov ofn.nMaxFile, sizeof openfilebuffer
m2m ofn.lpstrTitle, lpTitle
mov ofn.Flags, OFN_EXPLORER or OFN_FILEMUSTEXIST or \
OFN_LONGNAMES or OFN_HIDEREADONLY
invoke GetOpenFileName,ADDR ofn
mov eax, OFFSET openfilebuffer
ret
OpenFileDialog endp
На первый взгляд в твоем коде все нормально, однако нигде не видно где и как определена/описана переменная szOpenFile. |
|
|
Дата: Июл 16, 2004 06:56:40 q_q макрос я смотрел :) Твоя цитата оборвалась на середине предложения: здесь знак вопроса относится к слову .data, а не для придания вопросительного выражения предложению. Немного исказился смысл :) Но в коде, как ты заметил, ошибиться просто негде. О переменной szOpenFile: в макросе OpenFileDlg (из macros.asm) стоит так: invoke OpenFileDialog,hWin,hInstance,reparg(lpTitle),reparg(lpPattern), так вот я от греха подальше исключил макрос reparg и в секции .data (без знака вопроса) соорудил szOpenFile db "Open File",0 и стал передавать напрямую ADDR szOpenFile, но это не помогло, и пришлось пушить prevWnd. |
|
|
Дата: Июл 16, 2004 07:04:39 Я вот не пойму один момент, если можно, объясните кто .data? openfilebuffer db 260 dup (?) .code -кусок макроса. При создании ехе куда вставляется эта секция .data? из макроса? Пришивается к основной секции, описанной в файле myprog.asm или где в другом месте создаётся автономная секция? |
|
|
Дата: Июл 16, 2004 07:08:59 cresta здесь знак вопроса относится к слову .data Я так и интерпретировал. Показав код OpenFileDialog, содержащий секцию .data?. так вот я от греха подальше исключил макрос reparg Ты исправил макрос, не показываешь свои исправления, демонстрируешь оригинальный вариант и ругаешь его. Как тебя понимать Саид? (C) из к/ф "Белое солнце пустыни". в секции .data (без знака вопроса) соорудил szOpenFile db "Open File",0 Понятно. Пиши тестовую программу и аттачь ее. Не забудь свой вариант макроса. |
|
|
Дата: Июл 16, 2004 07:59:47 Блин, зачем столько претензий :), макрос OpenFileDialog не переделывал, но если надо переделаю, какой разговор. И приаттачу, вот только не уверен, что в тестовой программе будет в точности смоделирована данная ситуация, т.к. не знаю, что происходит с секциями data при линковке и компиляции. Но думаю этот подводный камень можно исключить. Макросов никогда не писал, может процедура подойдёт взамен? Ну в общем, попробую. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.056 |