· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› искажение данных OpenFileDialog'ом

. 1 . 2 . 3 . >>

Посл.отвђт Сообщен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 при линковке и компиляции. Но думаю этот подводный камень можно исключить. Макросов никогда не писал, может процедура подойдёт взамен? Ну в общем, попробую.

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.056