Консультация № 159433
02.02.2009, 22:28
0.00 руб.
0 1 1
Здраствуйте, незнаю или задаю данный вопрос там где надо, но немогу разобратся как связать свой исходник на асме с файлом ресурсов. В приложении файл ресурсов(зделан использую ResEd) из ассемблерских компиляторов использую masm32, в приложении также кусочек исходника на асме(взят из интернета). Может ктонибуть могбы подправить этот исходник, чтобы при нажатии кнопки на форме, чтонибуть вписалось в Edit поле. как что компилировать я вроде как знаюсразу русурсы rc resurs.rc потом ml /c /coff kod.asm и в конце link resurs.res kod.obj
Проблема заключается именно в исправлении кода :(
покачто rc resurs.rc тоже неполучается выполнить, пишет: error RC2104 : undefined keyword or key name: WS_VISIBLE
Помогите пожалуйста исправить этот код
Заранее Спасибо.

Приложение:
#define Frame 1000
#define IDC_BTN1 1001
#define IDC_BTN2 1002
#define IDC_CHK1 1003
#define IDC_EDT1 1004

Frame DIALOGEX 6,6,194,102
CAPTION "IDD_DLG"
FONT 8,"MS Sans Serif",0,0,0
STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
BEGIN
CONTROL "Button 1",IDC_BTN1,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,5,54,13
CONTROL "Button 2",IDC_BTN2,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,22,54,13
CONTROL "IDC_CHK",IDC_CHK1,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,12,40,54,9
CONTROL "",IDC_EDT1,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP,90,7,54,13,WS_EX_CLIENTEDGE
END

-------------------------------------------------------------------------------------------------------------------------------
.386
.model flat, stdcall

option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

WinMain proto :DWORD, :DWORD, :DWORD, :DWORD

.const
IDM_OPEN equ 1
IDM_SAVE equ 2
IDM_EXIT equ 3
MAXSIZE equ 260

.data
ClassName db "ExeCryptClass", 0
AppName db "ExeCrypt", 0
ofn OPENFILENAME <>
FilterString db "Exe files",0,"*.exe",0
buffer db MAXSIZE dup(0)
hMapFile HANDLE 0

.data?
hInstance HINSTANCE ? ;handle progi
CommandLine LPSTR ?
hFileRead HANDLE ?
hFileWrite HANDLE ?
hMenu HANDLE ?
pMemory DWORD ?

.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax

WinMain proc hInst: HINSTANCE, hPrevInst: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW+8
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset ClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
;invoke CreateWindowEx, NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\r
NULL,\
NULL,\
hInst,\
NULL
mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd

.WHILE TRUE
invoke GetMessage, ADDR msg, NULL,0,0
.BREAK .IF(!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret

WinMain endp

WndProc proc hWnd:HWND, uMsg: UINT, wParam: WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, NULL
;.ENDIF
;.IF uMsg==WM_RBUTTONDOWN
; invoke Beep, 15000d, 600
;.ENDIF
;.IF uMsg==WM_LBUTTONDOWN
; invoke Beep, 10000d, 500
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp

end start

Обсуждение

давно
Посетитель
7438
7205
03.02.2009, 02:07
общий
это ответ
Здравствуйте, Станислав!
Вы задали вопрос туда, куда надо
Мы всегда рады помочь ищущим знания!
В приложении подправленная программа, которая по первой кнопке "рисует" в edit-е строку "Нажали на кнопочку..."
По второй выходим из программы
Чтобы диалог из ресурсов начал работать как основное окно необходимо в диалоге указать класс такой же,
как и зарегистрированный. Плюс необходимо задать поле WNDCLASSEX.cbWndExtra равным DLGWINDOWEXTRA
Для файла ресурсов надо было подключить файл resource.h
Удачи!

Приложение:
#include "\masm32\include\resource.h"

#define Frame 1000
#define IDC_BTN1 1001
#define IDC_BTN2 1002
#define IDC_CHK1 1003
#define IDC_EDT1 1004

Frame DIALOGEX 6,6,194,102
CAPTION "IDD_DLG"
CLASS "ExeCryptClass"
FONT 8,"MS Sans Serif",0,0,0
STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
BEGIN
CONTROL "Button 1",IDC_BTN1,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,5,54,13
CONTROL "Button 2",IDC_BTN2,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,22,54,13
CONTROL "IDC_CHK",IDC_CHK1,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_AUTOCHECKBOX,12,40,54,9
CONTROL "",IDC_EDT1,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP,90,7,54,13,WS_EX_CLIENTEDGE
END
;--------------------------------
.386
.model flat, stdcall

option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\macros\macros.asm ;для макро szText

WinMain proto :DWORD, :DWORD, :DWORD, :DWORD

.const
IDM_OPEN equ 1
IDM_SAVE equ 2
IDM_EXIT equ 3
MAXSIZE equ 260

Frame equ 1000 ;ресурсы
IDC_BTN1 equ 1001
IDC_BTN2 equ 1002
IDC_CHK1 equ 1003
IDC_EDT1 equ 1004

.data
ClassName db "ExeCryptClass", 0
AppName db "ExeCrypt", 0
ofn OPENFILENAME <>
FilterString db "Exe files",0,"*.exe",0
buffer db MAXSIZE dup(0)
hMapFile HANDLE 0

.data?
hInstance HINSTANCE ? ;handle progi
CommandLine LPSTR ?
hFileRead HANDLE ?
hFileWrite HANDLE ?
hMenu HANDLE ?
pMemory DWORD ?

.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax

WinMain proc hInst: HINSTANCE, hPrevInst: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, DLGWINDOWEXTRA ;важно, чтобы запустить главное окно из ресурсов
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW+8
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset ClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc

;создаем главное окно из ресурсов
;важно, чтобы в диалоге был указан класс, такой же как и зарегистрированный
invoke CreateDialogParam, hInstance, Frame, 0, NULL, NULL

mov hwnd, eax
invoke ShowWindow, hwnd, SW_SHOWNORMAL
invoke UpdateWindow, hwnd

.WHILE TRUE
invoke GetMessage, ADDR msg, NULL,0,0
.BREAK .IF(!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax, msg.wParam
ret

WinMain endp

WndProc proc hWnd:HWND, uMsg: UINT, wParam: WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, NULL
;.ENDIF
;.IF uMsg==WM_RBUTTONDOWN
; invoke Beep, 15000d, 600
;.ENDIF
;.IF uMsg==WM_LBUTTONDOWN
; invoke Beep, 10000d, 500
.ELSEIF uMsg==WM_COMMAND
.IF wParam==IDC_BTN1
szText TestString, "Нажали на кнопочку..."
invoke GetDlgItem, hWnd, IDC_EDT1
invoke SetWindowText, EAX, ADDR TestString
.ELSEIF wParam==IDC_BTN2
invoke SendMessage, hWnd, WM_CLOSE, 0, 0
.ENDIF
.ELSE
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp

end start
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа