Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: addhaloka
Дата сообщения: 11.09.2014 17:02
А как в FASM'е правильно определять MAX_PATH при сборке в юникоде? Т. е., например в masm32 ansi это так определено:
path TCHAR MAX_PATH dup(?)
для fasm ansi рекомендуют так:
path rb MAX_PATH
(в KERNEL32.INC из SDK прописано так "cFileName     db MAX_PATH dup (?)", но у них на форуме советуют через rb (и в примерах тоже обычно rb MAX_PATH))
для fasm unicode по идее должно быть так:
path rw MAX_PATH
но есть сомнения, в примерах встречалось и такое: rd MAX_PATH, работают и rw, и rd (но вариант с rd мне представляется уже точно неправильным).
Автор: MERCURY127
Дата сообщения: 11.09.2014 19:52
Унисекскод бывает разный
UTF-8 - от 1 до 4 (возможно до 6) байт;
UTF-16LE/BE - по два байта на знак, возможны суррогатные пары с префиксом;
UTF-32LE/BE - все знаки по 4 байта, самая простая обработка всех языков, но неэкономичен и малораспространен

Вам какой? если для винды, то, наверное, rw MAX_PATH...
Автор: Benchmark
Дата сообщения: 11.09.2014 20:08
addhaloka

Может что-то вроде

path rb MAX_PATH*sizeof.TCHAR

Если используются юникодные inc-файлы, то sizeof.TCHAR будет = 2, иначе 1.
Вообще виндовый юникод - это кодировка UCS-2, являющаяся частным случаем UTF16 LE
Автор: addhaloka
Дата сообщения: 11.09.2014 22:03
MERCURY127 20:52 11-09-2014
Цитата:
если для винды, то, наверное, rw MAX_PATH...

Наверно, для винды (KERNEL32.INC как бы намекает )

Benchmark 21:08 11-09-2014
Цитата:
path rb MAX_PATH*sizeof.TCHAR

Думаю, что rw вместо rb должно быть достаточно, по идее, то же самое умножение на 2 получается. MAX_PATH*sizeof.TCHAR - не встречалось, чтобы так указывали, для fasma'а по-моему достаточно просто MAX_PATH.
Автор: Benchmark
Дата сообщения: 11.09.2014 22:18
addhaloka

Цитата:
по-моему достаточно просто MAX_PATH


MAX_PATH - максимальное количество символов (а не байт) в пути. Для ANSI-функций это будет 260 байт, для юникодных - 260*2, т.е. 520 байт. И не забываем про финальный нулевой символ (в порядке перестраховки).

А MAX_PATH*sizeof.TCHAR - всего лишь умножаются две константы, одна из которых (sizeof.TCHAR) зависит от inc-файлов.

Так что, видимо, наиболее правильный вариант:

path rb (MAX_PATH+1)*sizeof.TCHAR
Автор: addhaloka
Дата сообщения: 12.09.2014 05:25
Benchmark
Собрал я exeшки под каждый вариант и глянул в дизассемблере - получилось вот что:
rb MAX_PATH*sizeof.TCHAR == rw MAX_PATH ;520 байт
rb (MAX_PATH+1)*sizeof.TCHAR == rw MAX_PATH+1 ;522 байт
Работают все варианты, но наверно, по фэншую лучше второй вариант юзать? Упомянутый ранее rd MAX_PATH - похоже точно неправильно, там 1040 байт, а куда столько нужно?
Из-за нулевого символа в конце, получается вызов функции надо так делать:

Код: invoke ExpandEnvironmentStrings,'%MYDOCS%',path,MAX_PATH+1
Автор: ne_viens
Дата сообщения: 12.09.2014 07:53

Если ExpandEnvironmentStringsW, тогда
path rw MAX_PATH
если ExpandEnvironmentStringsА, тогда
path rb (MAX_PATH + 1)
и
invoke ExpandEnvironmentStrings,'%MYDOCS%', path, sizeof path
Автор: MERCURY127
Дата сообщения: 12.09.2014 10:05

Цитата:
Если ExpandEnvironmentStringsW, тогда
path rw MAX_PATH
а куда делся "плюс адын"?
Автор: Benchmark
Дата сообщения: 12.09.2014 12:52
addhaloka

Цитата:
Из-за нулевого символа в конце

Этот символ - просто гарантия того, что даже путь максимальной длины (260 символов) всегда будет заканчиваться нулем. А вызывать надо, как написал выше ne_viens:

invoke ExpandEnvironmentStrings,'%MYDOCS%', path, sizeof path

ne_viens

Цитата:
Если ExpandEnvironmentStringsW, тогда
path rw MAX_PATH

В этом случае тоже будет MAX_PATH+1, ибо нам нужен нулевой word в конце строки.

Вообще я выбрал
Цитата:
rb (MAX_PATH+1)*sizeof.TCHAR
по простой причине - если есть и ANSI-, и Unicode-версии, эта строчка будет одинаково работать в обоих случаях.

Автор: addhaloka
Дата сообщения: 12.09.2014 19:58
Benchmark 13:52 12-09-2014
Цитата:
А вызывать надо, как написал выше ne_viens:

invoke ExpandEnvironmentStrings,'%MYDOCS%', path, sizeof path

В FASM'е макроса sizeof нет, что зачастую осложняет многое. Вообще всё и так работает, без проблем.
в fasm unicode:
;mdargs rw MAX_PATH
invoke ExpandEnvironmentStrings,'%MYDOCS%',mdargs,MAX_PATH

в masm32 ansi:
;mydocvar db '%MYDOC%',0
;mdocs TCHAR MAX_PATH dup(?)
fn ExpandEnvironmentStrings,addr mydocvar,addr mdocs,MAX_PATH

Непонятка была с этими юникодными определениями, но вроде всё разъяснилось. Спасибо всем, кто участвовал.
Автор: Benchmark
Дата сообщения: 12.09.2014 20:44
addhaloka

Цитата:
В FASM'е макроса sizeof нет

Ну это... кагбэ... вот:
http://board.flatassembler.net/topic.php?t=12116&view=previous
Автор: addhaloka
Дата сообщения: 12.09.2014 21:15
Benchmark
Ну это же чёто неофициальное, в отличие от masm'ского sizeof? В SDK из оф. дистрибутива этого нет, а самому то конечно можно наопределять, но только нужно ли?
Автор: binkat
Дата сообщения: 02.11.2014 07:05
хуй блядь суки
Автор: MERCURY127
Дата сообщения: 02.11.2014 09:21
binkat, мальшик, где твой мам-пап? надобно напомнить им основы воспитания дитей...
Автор: SALLFRIS
Дата сообщения: 11.11.2014 21:49
Подскажите как из хука на WH_GETMESSAGE получить код символа из lparam?

Есть вызов в основной программе

Код: invoke    SetWindowsHookEx, WH_GETMESSAGE, eax, [hinstDLL], NULL
Автор: MERCURY127
Дата сообщения: 12.11.2014 10:35
SALLFRIS

Цитата:

LRESULT CALLBACK GetMsgProc(
int code,
WPARAM wParam,
LPARAM lParam
);

Параметры

code
[in] Устанавливает, должна ли процедура фильтра (hook) обрабатывать сообщение. Если code - HC_ACTION, процедура фильтра (hook) должна обработать сообщение. Если code - меньше чем нуль, процедура фильтра (hook) должна передать сообщение в функцию CallNextHookEx без дальнейшей обработки и должна возвратить значение, возвращенное CallNextHookEx.

wParam
[in] Устанавливает, было ли сообщение удалено из очереди. Этим параметром могут быть одно из ниже перечисленных значений.

Значение     Предназначение
PM_NOREMOVE     Устанавливает, что сообщение не было удалено из очереди. (Приложение вызвало функцию PeekMessage, определяя флажок PM_NOREMOVE.)
PM_REMOVE     Устанавливает, что сообщение было удалено из очереди. Прикладная программа вызвала GetMessage, или вызванная ею функция PeekMessage, определила флажок PM_REMOVE.)

lParam
[in] Указатель на структуру MSG, которая содержит детали о сообщении.

Возвращаемое значение

Если code - меньше чем нуль, процедура фильтра (hook) должна возвратить значение, возвращенное CallNextHookEx.

Если параметр code больше или равен нулю, очень рекомендуется, чтобы Вы вызвали CallNextHookEx и возвратили величину, которое она возвращает; в противном случае, другие прикладные программы, которые установили фильтр (hook) WH_GETMESSAGE, не будут получать уведомления фильтра и, в результате, могут повести себя неправильно. Если процедура фильтра (hook) не вызывает CallNextHookEx, возвращаемое значение должно быть нуль.

Замечания

Процедура фильтра (hook) GetMsgProc может проверить или изменить сообщение. После того, как процедура фильтра (hook) возвращает управление системе, функция GetMessage или PeekMessage возвращает сообщение, вместе с любыми изменениями, в приложение, которое первоначально вызвало процедуру.

соответственно, в LPARAM будет указатель на структуру MSG

Цитата:

typedef struct {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;

Члены структуры

hwnd

Дескриптор окна, оконная процедура которого принимает сообщение.

message

Определяет код сообщения. Приложения могут использовать только младшее слово; старшее слово зарезервировано системой.

wParam

Определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message.

lParam

Определяет дополнительную информацию о сообщении. Точное значение зависит от значения члена структуры message.

time

Определяет время, в которое сообщение было помещено в очередь.

pt
Устанавливает позицию курсора, в экранных координатах, в момент, когда сообщение было помещено в очередь.

в которой уже и надо смотреть, есть ли там вообще код символа, и если есть — там же его и менять.
Автор: CTAC88
Дата сообщения: 22.11.2014 13:25
[more]
Заранее спасибо [/more]
Автор: akaGM
Дата сообщения: 23.11.2014 01:14
пожалуйста...
Автор: CTAC88
Дата сообщения: 23.11.2014 14:34
[more] Здравствуйте уважаемые Гуру.Помогите пожалуйста советом или "дайте пинка".
Суть проблемы: у меня есть программа (JDPaint 5.5) для чпу станка Фото1(https://yadi.sk/i/hOTe_7OUcq9z3), на этом фото где обведено в кружок должна быть кнопочка как на фото2(https://yadi.sk/i/8WBvv1Recq9z5) ( фото2 это таже программа только переведена на русский. Nikolay63 смог каким-то образом активировать кнопку, как он это сделал, говорить не хочет и есть его видео http://www.youtube.com/watch?v=Mof0HEemfwM кнопка будет видна на 39 секунде). Я в программировании новичок (10 дней всего) но я покопался в файлах программы и нашел 2 файла которые относятся к этой кнопке и которые нужно подправить, один это .dll а второй .plg .В файле .dll при помощи Ogregui я нашел сообщения которые должны выводиться когда эта кнопка станет видимой Фото3(https://yadi.sk/i/LUbqOm7Dcq9yt) и на этом же фото видно сообщение про активацию, но каким образом это сделать я не могу врубиться Первые два расширения они есть а вот третье появляется потом, это так же можно видеть из видео. Автор видео поделился, что править нужно файл .plg (https://yadi.sk/d/hKk0TD9BcrmzW) и в IDA Pro в котором нужно поменять всего лишь несколько значений и заново провести компиляцию файла. Но какие значения и какие функции, увы не знаю. Может у вас есть какая-нибудь светлая мысль в этом направлении. [/more]
Автор: MERCURY127
Дата сообщения: 23.11.2014 17:55
CTAC88, причем тут ассемблер? тебе сюда http://forum.ru-board.com/topic.cgi?forum=55&bm=1&topic=11525&glp
Автор: xpin2013
Дата сообщения: 26.11.2014 17:40
А правдо если выполнить "nop" без цикла 311 раз, то хард диск отключится? Извините.
Автор: bomzzz
Дата сообщения: 26.11.2014 17:44
трудно проверить? думаю неправда
Автор: akaGM
Дата сообщения: 26.11.2014 19:19
отключится, если выполнить 311 с половиной...
Автор: xpin2013
Дата сообщения: 26.11.2014 22:52
Ещё раз простите 311 это Win3.11.
Автор: strange2007
Дата сообщения: 22.12.2014 13:43
xpin2013
Вот ни когда подобного не проверял.
Автор: xpin2013
Дата сообщения: 22.12.2014 23:44
strange2007
Уверяю 3.11 не пробуйте, это советские Вузы преподают эту хрень, но имейте разум. Первое, - хотите Линукс, флаг в руки. Второе - хотите понимать процессор - куда без ассемблерной вставки? Хотите драйвер, Вы точно уверены что Вам нужен Ембаркадеро или Микрософт? Всё легко, для драйверов эти киты не нужны, проще на родном. Но если драйвер не делаем, то Ассемблер. Ключь к победе.
Автор: strange2007
Дата сообщения: 23.12.2014 02:51
xpin2013
С 1998 на асме сижу. Конечно, только для себя по вечерам, но проблем ни каких нет. Хотя нет, есть, уже года как 3 пересел на Pure Basic, что-бы облегчить разработку тех-же интерфейсов.
Автор: sewell
Дата сообщения: 23.12.2014 08:33
strange2007

Цитата:
Хотя нет, есть, уже года как 3 пересел на Pure Basic, что-бы облегчить разработку тех-же интерфейсов.

Да и драйвера на Pure Basic писать можно. Видел даже специальные сборки на нем под драйвера. Иногда без асма не обойтись, но зачастую его возможности не нужны, а вот скорость написания программ на асме существенно ниже.
P.S. Да и найти ошибку в коде асма иногда - скорее поседеешь...
Автор: strange2007
Дата сообщения: 23.12.2014 13:05
sewell
Я для себя в ПБ нашёл множество готовых объектов. Например, для работы с различными СУБД. Это очень удобно. А тонкие места так-же пишутся на асме. Правда fasm я раньше не использовал, но это мелочи. К тому-же кроссплатформенность, это типа, модно
Автор: sewell
Дата сообщения: 23.12.2014 16:05
strange2007

Цитата:
Правда fasm  я раньше не использовал

Что по мне, то FASM мне больше всего по нраву. Да и справка у него очень подробная и понятная (если в английском понимаешь ). Да и IDE под него хватает: Fresh или SASM, например.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.