Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2011, 18:32   #1
Maks1978
Пользователь
 
Аватар для Maks1978
 
Регистрация: 25.05.2008
Сообщений: 53
Вопрос Unicode-заголовок окна

Создаю окно. Регистрирую класс окна функцией RegisterClassExW. Потом создаю функцией CreateWindowExW. Название класса и заголовка окна я использую Unicode-строки. Также использую транслятор masm32. После создания и появления на экране окна в заголовке появляется какая-то белеберда. Может скажет кто в чем дело?
Maks1978 вне форума Ответить с цитированием
Старый 12.09.2011, 18:45   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

строки как задаете то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.09.2011, 01:27   #3
Maks1978
Пользователь
 
Аватар для Maks1978
 
Регистрация: 25.05.2008
Сообщений: 53
По умолчанию

Пробовал сначала так:
Код:
...
wczWindowName DW "Ф", "о", "р", "м", "у", л"", "ы", " ", "в", " ", "W", "o", "r", "d", " ", "2", "0", "0", "7", 0
...
Сейсас задал так:
Код:
...
wczWindowName DW 0424H, 043EH, 0440H, 043CH, 0443H, 043BH, 044BH, 0020H, 0432H, 0020H, 0057H, 006FH, 0072H, 0064H, 0020H, 0032H, 0030H, 0030H, 0037H, 0000H
...
В первом случае вообще ничего не получается, а во вторм только слово "Формулы " вывелось и далее белеберда.
Maks1978 вне форума Ответить с цитированием
Старый 13.09.2011, 04:28   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Maks1978
Поставь GetMessageW, DefWindowProcW, DispatchMessageW
И для набора Unicode-строк воспользуйся моим макросом DU
Код:
.686p
.model flat
include windows.inc
includelib user32.lib
includelib kernel32.lib
.code
;--------используемые функции----------------------------------
extern _imp__RegisterClassW@4:dword
extern _imp__DefWindowProcW@16:dword
extern _imp__DispatchMessageW@4:dword
extern _imp__GetMessageW@16:dword
extern _imp__CreateWindowExW@48:dword
extern _imp__ExitProcess@4:dword
;-------макрос для создания юникод-строк------------------
du macro string
local bslash
bslash = 0
irpc c,<string>
if bslash eq 0
	if '&c' eq "\";;управляющая последовательность символов
	bslash = 1
	elseif '&c' gt 127
	db ('&c'- 0B0h),4;;кириллица
	else
	dw '&c'          ;;латиница
	endif
else
bslash = 0
	if '&c' eq "n"    ;;  \n = новая строка
        DW 0Dh,0Ah
        elseif '&c' eq "\";;  \\ = обратная косая черта (\)
        dw '\'
        elseif '&c' eq "r";;  \r = возврат каретки
        dw 0Dh
        elseif '&c' eq "l";;  \l = LF
        dw 0Ah
        elseif '&c' eq "s"
        dw 20h
        elseif '&c' eq "c"
        dw 3Bh
        elseif '&c' eq "t";;  \t = табуляция*
        dw 9
	endif
endif
endm
dw 0
endm
;----начало программы-----------------
start:	xor ebx,ebx
	mov esi,400000h
	mov edi,offset wTitle
;------------------------------
; registering the window class 
;------------------------------
	push edi
	push ebx
	push COLOR_WINDOW+1
	push 10011h
	push ebx
	push esi
	push ebx
	push ebx
	push offset window_procedure
	push ebx
	push esp
	call _imp__RegisterClassW@4        
;--------------------------+
; creating the main window |
;--------------------------+
	push ebx
	push esi
	shl esi,9
	push ebx
	push ebx
	push esi
	push esi
	push esi
	push esi
	push WS_OVERLAPPEDWINDOW or WS_VISIBLE
	push edi
	push edi
	push ebx
	call _imp__CreateWindowExW@48
	mov ebp,esp
;---------------------------+
; entering the message loop |
;---------------------------+
message_loop: push ebx
	push ebx
	push ebx
	push ebp
	call _imp__GetMessageW@16
	push ebp
	call _imp__DispatchMessageW@4
	jmp message_loop
;----------------------+
; the window procedure |
;----------------------+
window_procedure: cmp dword ptr [esp+08],WM_DESTROY
	je short wmDESTROY
	jmp _imp__DefWindowProcW@16
wmDESTROY: push ebx
	call _imp__ExitProcess@4
;---------данные------------------------------------                         
wTitle: du <Формулы в Word 2007>
end start

Последний раз редактировалось Mikl___; 13.09.2011 в 14:23.
Mikl___ вне форума Ответить с цитированием
Старый 13.09.2011, 13:52   #5
Maks1978
Пользователь
 
Аватар для Maks1978
 
Регистрация: 25.05.2008
Сообщений: 53
Хорошо

Сработало, поставил вместо GetMessage, DefWindowProc, DispatchMessage - GetMessageW, DefWindowProcW, DispatchMessageW. Не знал, что у этих функций могут быть Unicode-аналоги.
Только с первой строкой, почему-то русские буквы транслятор моленько не тот код ставит. Вторая строка прекрасно выводится в заголовке окна.
Вопрос закрыт. Спасибо.
Maks1978 вне форума Ответить с цитированием
Старый 13.09.2011, 14:17   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Maks1978
Для набора русских надписей должна стоять CP-1251 кодировка в той IDE (Integrated Development Environment), где ты набираешь асм-файл, наверное, у тебя стоит DOS-кодировка (CP-866). А макрос для юникод-строк попробовал использовать?

Последний раз редактировалось Mikl___; 13.09.2011 в 14:58.
Mikl___ вне форума Ответить с цитированием
Старый 13.09.2011, 17:46   #7
Maks1978
Пользователь
 
Аватар для Maks1978
 
Регистрация: 25.05.2008
Сообщений: 53
По умолчанию

Я точно не знаю, но если я не ошибаюсь макросы генерют коды в сегменте
Код:
...
.code
...
и получается по факту так, что Unicode-строки - переменные. А мне надо Unicode-строки как константы в сегменте
Код:
...
.data
...
Макросы в этом сегменте работают? И можно ли управлять кодировкой при трансляции и как?
Maks1978 вне форума Ответить с цитированием
Старый 14.09.2011, 04:05   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Maks1978
макросом можно создавать как код так и данные, тебя ведь не смущает конструкция
db 4 dup (1,'string')
а это тоже макрос.
Макрос DU создает юникод-строки, хочешь в секции .data -- хочешь в секции .code Всё что от тебя требуется -- поставить после имени строки двоеточие, а саму строку заключить в "уголки", завершающий ноль макрос подставит сам wTitle: du <Формулы в Word 2007>.
Для управления кодировкой при трансляции нужны не макросы, а директивы условной трансляции...
Директивы IF и IFE - условная трансляция по результату вычисления логического выражения.
Директивы IFDEF и IFNDEF - условная трансляция по факту определения символического имени.
Директивы IFB и IFNB - условная трансляция по факту определения фактического аргумента при вызове макрокоманды.
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI - условная трансляция по результату сравнения строк символов.
Условные директивы компиляции имеют общий синтаксис и применяются в составе следующей синтаксической конструкции: IFxxx логическое_выражение_или_аргументы
фрагмент_программы_1
ELSE
фрагмент_программы_2
ENDIF

Заключение некоторых фрагментов текста программы - фрагмент_программы_1 и фрагмент_программы_2 - между директивами IFxxx, ELSE и ENDIF приводит к их выборочному включению в объектный модуль. Какой именно из этих фрагментов - фрагмент_программы_1 или фрагмент_программы_2 - будет включен в объектный модуль, зависит от конкретного типа условной директивы, задаваемого значением xxx, и значения условия, определяемого операндом (операндами) условной директивы логическое_выражение_или_аргумент(ы ).
Синтаксические конструкции, соответствующие директивам условной компиляции, могут быть вложенными друг в друга
Директивы IF и IFE
Синтаксис этих директив следующий: IF(E) логическое_выражение
фрагмент_программы_1
ELSE
фрагмент_программы_2
ENDIF

Обработка этих директив макроассемблером заключается в вычислении логического_выражения и включении в объектный модуль фрагмент_программы_1 или фрагмент_программы_2 в зависимости от того, в какой директиве IF или IFE это выражение встретилось:
если в директиве IF логическое выражение истинно, то в объектный модуль помещается фрагмент_программы_1.
Если логическое выражение ложно, то при наличии директивы ELSE в объектный код помещается фрагмент_программы_2. Если же директивы ELSE нет, то вся часть программы между директивами IF и ENDIF игнорируется и в объектный модуль ничего не включается. Кстати сказать, понятие истинности и ложности значения логического_выражения весьма условно. Ложным оно будет считаться, если его значение равно нулю, а истинным - при любом значении, отличном от нуля.
директива IFE аналогично директиве IF анализирует значение логического_выражения. Но теперь для включения фрагмент_программы_1 в объектный модуль требуется, чтобы логическое_выражение имело значение "ложь".
Директивы IF и IFE очень удобно использовать при необходимости изменения текста программы в зависимости от некоторых условий.

Последний раз редактировалось Mikl___; 14.09.2011 в 09:59.
Mikl___ вне форума Ответить с цитированием
Старый 25.09.2011, 22:20   #9
Maks1978
Пользователь
 
Аватар для Maks1978
 
Регистрация: 25.05.2008
Сообщений: 53
Хорошо

Макрос работает, только одно но
wTitle: du <Формулы в Word 2007>
- в таком виде MASM32 не понимает
сдеалал отдельно
wTitle PROC
du <Формулы в Word 2007>
wTitle ENDP
- все прекрасно
Может потому, что у тебя формат программы:
start:
...
начало экзешника
...
процедура окна
...
end start
а у меня:
...
1 PROC
начало экзешника
1 ENDP
...
2 PROC
процедура окна
2 ENDP
...
Maks1978 вне форума Ответить с цитированием
Старый 26.09.2011, 05:07   #10
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Maks1978
Всё может быть! Я добавляю секции код атрибут "запись" и поэтому обхожусь без сегментов ".data", ".const", ".data?"
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пустой заголовок окна Хамяг Общие вопросы Delphi 6 28.05.2011 19:58
заголовок окна s1s1s1 Общие вопросы Delphi 1 06.02.2010 22:49
Заголовок окна doniyor Общие вопросы Delphi 3 14.07.2009 01:23
Ник и заголовок окна Патрон Общие вопросы Delphi 9 12.04.2008 20:39
Заголовок у окна Михаил Юрьевич Общие вопросы Delphi 1 22.02.2008 00:08