Страница: 1 |
Страница: 1 |
Вопрос: Нужна помощь по асму..
Добавлено: 06.08.05 17:00
Автор вопроса: ISpy | Web-сайт:
Изучаю ассемблер. Написал простую программу, кторая получает хэндл окна,
пихает его в переменную и выводит месседжбокс.
Проблема в том, что ничего в messagebox'e не выводится, просто пустое место :(
Вот код, я асм только изучаю, поэтому возможны глупые ошибки, просьба найти где ;)
(компилятор - masm32)
.386
.model flat,stdcall
option casemap:none
MessageBoxA proto :dword,:dword,:dword,:dword
include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
.DATA
AppName db "Our First Window",0
.DATA?
hHWND dd ?
.CODE
CTAPT:
invoke GetModuleHandle, addr AppName
mov hHWND,eax
invoke MessageBoxA,0,addr hHWND,addr AppName,0h
invoke ExitProcess,0
end CTAPT
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #1
Добавлено: 06.08.05 17:02
LPCTSTR lpModuleName // address of module name to return handle for
Да, насчет параметра LPCTSTR: в него надо передавать название exe'шника (пример: "project.exe" или загаловок окна (пример: "Безымянный - Блокнот"??
Номер ответа: 2
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #2
Добавлено: 06.08.05 19:24
1.
MessageBox в качестве второго параметра принимает адрес СТРОКИ, а не переменной, где хранится хэндл.
Тут всё-таки не VB, который сам за тебя число (hWND) переведёт в строку и её адрес отправит MessageBox'у. Т.е. число (hWnd) нужно сначала преобразовать в строку, а затем адрес строки передавать MessageBox'у.
2.
LPCTSTR - это не параметр. Это тип переменной. Параметр тут lpModuleName - адрес строки, в которой содержится имя модуля, загруженного в память. Это может быть как сам exe, так и любая из dll, которая подружена в память.
Номер ответа: 3
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #3
Добавлено: 06.08.05 19:35
Посмотри и проанализируй этот пример:
module_name db 'user32.dll',0
fmt db 'Модуль user32.dll загружен в адресное пространство начиная с адреса %08Xh',0
hModule dd 0
mod_str db 256 dup(0)
.code
invoke GetModuleHandle, addr module_name
mov hModule,eax
invoke wsprintf, addr mod_str, addr fmt, hModule
invoke MessageBox, NULL, addr mod_str, addr module_name, MB_OK
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 06.08.05 22:47
Если тебе нужен hModule твоей программы, в GetModuleHandle передавай NULL
Номер ответа: 5
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #5
Добавлено: 07.08.05 12:42
Можно по-подробнее:
-Что такое fmt? Для чего он нужен?
-Опиши какие параметры принимает wsprintf (а то я с английским не очень).
Твой пример выводит: "Модуль user32.dll загружен в адресное пространство начиная с адреса Чр"
Насколько я знаю хэндл - это адрес программы в памяти (исправте если я не прав), Получается "Чр" - это и есть хэндл? Но хэндл вроде это числовое значение, мне и надо число..
Номер ответа: 6
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #6
Добавлено: 07.08.05 13:12
Все понял и разобрался.
Надо вместо %08Xh написать %ld и будут цифры )
p.s. спасибо sne
Номер ответа: 7
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #7
Добавлено: 07.08.05 13:16
Да, спасибо всем кто отвеча: HOOLIGAN, Sharp