Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Проблемы с masm32


Автор: zxcc 11.10.2006, 10:10
При создание программы на masm32 под windows xp,основанную на диалогах, ассемблируется и линкуется все без ошибок, а когда запускаешь -- окно не отображается, даже в примерах из книжек не показываются диалоги.Помогите.Заранее спасибо[email protected]

Автор: Damarus 11.10.2006, 10:47
zxcc, код в студию.

Автор: zxcc 14.10.2006, 12:41
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD

.data
DIAL db "DIAL1",0
.data?
hInstance HINSTANCE ?
.code
start:
invoke GetModuleHandle, NULL
    mov hInstance,eax
    invoke DialogBoxParam,hInstance,ADDR DIAL,0,ADDR DlgProc, 0
    invoke ExitProcess,eax
 DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
  
    .IF uMsg==WM_CLOSE
     invoke EndDialog,hWnd,NULL
     .ELSE
     invoke DefWindowProc,hWnd,uMsg,wParam,lParam
 .ENDIF
 xor eax,eax
    ret
DlgProc endp

end start

Файл ресурсов:
#define WS_SYSMENU       0x00080000L
#define WS_MINIMIZEBOX   0x00020000L
#define WS_MAXIMIZEBOX   0x00010000L

DIAL1 DIALOG 0, 0, 240, 120
STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX|WS_VISIBLE 
CAPTION "Пример диалогового окна"
CLASS "DLGCLASS"
FONT 8, "Arial"
{
}

Автор: 586 14.10.2006, 14:15
zxcc, неужели так трудно взять отладчик?
Код
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD

.data
DIAL db "DIAL1",0

.data?
hInstance dd ?

.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, eax, offset DIAL, 0, offset DlgProc, 0
invoke GetLastError
int 3   ; eax=0000057f - Не удаётся найти класс окна
ret


DlgProc proc hWnd, uMsg, wParam, lParam:DWORD
  
 .IF uMsg==WM_CLOSE
     invoke EndDialog,hWnd,NULL
     .ELSE
     invoke DefWindowProc,hWnd,uMsg,wParam,lParam
 .ENDIF
 xor eax,eax
    ret
DlgProc endp

end start

следовательно:

#define WS_SYSMENU       0x00080000L
#define WS_MINIMIZEBOX   0x00020000L
#define WS_MAXIMIZEBOX   0x00010000L

DIAL1 DIALOG 0, 0, 240, 120
STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX|WS_VISIBLE 
CAPTION "Пример диалогового окна"
CLASS "DLGCLASS"
FONT 8, "Arial"
{
}

Автор: zxcc 14.10.2006, 15:46
Спасибо  большое.Но у меня всё равно не получается.Та же проблема.Наверно я что то не так делаю.

Автор: 586 14.10.2006, 15:56
вот

Добавлено @ 16:01 
функцию DefWindowProc убери - из-за неё диалог глючит

Автор: zxcc 14.10.2006, 16:18
Спасибо.Запускаю test.exe всё работает,но если пробую компилировать ,то после компиляции опять окно не отображается.Можете объяснить как пользоваться masm32  я чайник в этом деле.

Автор: 586 14.10.2006, 16:33
1) компиляция test.asm
ml /c /coff /IC:\MASM32\INCLUDE test.asm
или просто
ml /c /coff test.asm

2) копмиляция ресурсов
rc res.rc

3) создание exe
link /SUBSYSTEM:WINDOWS /LIBPATH:C:\masm32\lib test.obj res.res
или просто
link /SUBSYSTEM:WINDOWS test.obj res.res

Подробнее - см. здесь: http://search.msdn.microsoft.com/search/Default.aspx?__VIEWSTATE=&query=link.exe&siteid=0&tab=0 (в поиске)

Автор: zxcc 14.10.2006, 16:41
Я пользуюсь qeditior.exe из masm32.Сохраняю файл в разрешение .asm ,ресурсы .rc А через ком.строку не знаю как.

Автор: 586 14.10.2006, 16:45
пользуйся блокнотом.
для облегчения труда созд. bat-файлы

Автор: zxcc 14.10.2006, 16:48
Спасибо.А можно  подробнее.

Автор: 586 14.10.2006, 16:51
подробнее в аттаче было.

Автор: zxcc 14.10.2006, 16:55
там на английском

Автор: 586 14.10.2006, 16:56
 smile всё что надо я написал. у меня всё работает.

Автор: anwe 14.10.2006, 22:31
Цитата

Я пользуюсь qeditior.exe из masm32.Сохраняю файл в разрешение .asm ,ресурсы .rc А через ком.строку не знаю как.

Тут знать нечего, просто пишешь там, то что 586 указал.
Но если пользуешься qeditior - пользуйся. Ошибка не в этом.
Ошибка в файле ресурсов. Ты прописал значения для STYLE WS_SYSMENU, WS_MINIMIZEBOX и WS_MAXIMIZEBOX, а для WS_VISIBLE - нет.
Добавь:

#define WS_VISIBLE          0x10000000L

586 писал:
Цитата

функцию DefWindowProc убери - из-за неё диалог глючит 

Это, как раз не обязательно, из-за нее не глючит, хотя и не нужна в процедуре.

Автор: zxcc 15.10.2006, 10:19
Добавил,но ничего не получилось.
 

При сборке выдает 
Microsoft ® Windows ® Resource Compiler, Version 5.00.1823.1 - Build 1823 
Copyright © Microsoft Corp. 1985-1998. All rights reserved. 

Using codepage 1251 as default 
Creating rsrc.RES 
RC: RCPP -CP 1251 -f D:\masm32\RCa03588 -g D:\masm32\RDa03588 -DRC_INVOKED -D_WI 
N32 -pc\:/ -E -I. -I . 


RC : fatal error RC1110 : could not open rsrc.rc 


Microsoft ® Windows Resource To Object Converter Version 5.00.1736.1 
Copyright © Microsoft Corp. 1992-1997. All rights reserved. 

CVTRES : fatal error CVT1101: cannot open rsrc.res for reading 

Автор: 586 15.10.2006, 13:16
Цитата(anwe @  14.10.2006,  23:31 Найти цитируемый пост)
586 писал:
Цитата
Функцию DefWindowProc убери - из-за неё диалог глючит 


Это, как раз не обязательно, из-за нее не глючит, хотя и не нужна в процедуре. 

Кликни правой клавишей по заголовку окна, а потом левой по самому окну - диалог повиснет.

Автор: anwe 15.10.2006, 13:58
586, раз уж на то пошло, то надо сказать (написать), что в модальных диалоговых окнах, как это, вообще не используется DefWindowProc. Там если функция возвращает TRUE, значит сообщение сделано для диалогового окна и оно обрабатывается менеджером диалоговых сообщений и FALSE - в противном случае, поэтому правильно было бы написать так:
Код

...
.IF uMsg==WM_CLOSE
     invoke EndDialog,hWnd,NULL
.ELSE
     mov    eax,FALSE
     ret
.ENDIF
mov    eax,TRUE
ret
...

И тогда все работает правильно.

zxcc - не знаю что и сказать. Ради этого написал и скомпилировал у себя твое творение - все же идет!!! При сборке выдает все тоже кроме 
Цитата

RC : fatal error RC1110 : could not open rsrc.rc 
 и получается DIALOG: DIAL1

Попоробуй вместо описания значений стилей прописать ссылку на файл resource.h. Если ты используешь пакет masm32, он должен быть у тебя.

Автор: zxcc 15.10.2006, 16:20
А есть ли другой способ создания ресурсов.

Автор: anwe 15.10.2006, 16:38
Ты открой через то же qeditor файл bres.bat и сравни то, что там написано с тем, что указал 586: какой там должен быть прописан код.

А по поводу другого способа - можешь использовать специальные редакторы ресурсов.

Автор: 586 15.10.2006, 19:00
Цитата(zxcc @  15.10.2006,  17:20 Найти цитируемый пост)
А есть ли другой способ создания ресурсов.

Создаёшь res-файл (пустой), открываешь редактором ресурсов и редактируешь. И не надо никаких rc-файлов, и это удобно. Лично я использую редактор ресурсов из Micro$oft Visual C++ 6.

Автор: zxcc 15.10.2006, 20:36
А где можно узнать,как пользоваться Microsoft Visual C++6.

Автор: 586 15.10.2006, 21:13
а там нет ничего сложного. Я без помощи научился.

zxcc, у тебя вообще есть опыт программирования в других средах? Мне кажется, асм тебе ещё рановат. С++ хоть знаешь?

Не знаешь, как пользоваться, возми другой редактор. Поищи в Интернете.

Автор: anwe 15.10.2006, 21:40
Цитата

zxcc, у тебя вообще есть опыт программирования в других средах? Мне кажется, асм тебе ещё рановат. С++ хоть знаешь?

Не, ну это зря! Асм не сложнее других. Я им пользуюсь, а С++ почти не знаю. Могу только догадываться о том, какая логика прописана в том или ином синтаксисе, зная ее написание в асме.

Автор: zxcc 16.10.2006, 05:46
Нет я только учусь.И С++ тоже пытаюсь осилить но больше ассемблер нравиться.В С++ с типами возвр.значений заморочек много.А вот что за проблема с компилятором не могу понять.( А может во мне).Большое Всем спасибо за помощь.

Автор: anwe 16.10.2006, 21:43
Не, ты все же посмотри bres.bat.
Вот мой:
Код

@echo off
\masm32\bin\rc /v rsrc.rc
\masm32\bin\cvtres /machine:ix86 rsrc.res
pause

Автор: zxcc 17.10.2006, 09:15

Спасибо anwe,что не забываешь.Посмотрел свой bres.bat.Всё тоже самое как и у тебя.На одном из форумов у одного парня была такая же проблема как и у меня.И он её как то решил. Но как не говорит.

Автор: tnt17 17.10.2006, 09:26
Возьми какую-то IDE, заточенную под масм.Например:
http://wasm.ru/baixado.php?mode=tool&id=215 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)