Пишу плагин к программе и решил поэксперементировать (для разгрузки мозгов) написать на FASM'е
Но в проги небольшая особенность — она работает исключительно на юникоде.
Определяется экспортируемая функция так
OV>Вопрос, как это на FASM'e написать с минимальными телодвижениями? OV>Тоесть, строка хоть и константа, но чтобы поменять легко можно было
format PE GUI 4.0 DLL
szPluginName equ "Test plugin v0.2", 0
include'%fasminc%/win32a.inc'section'.code'code readable executable
PluginName:
mov eax, @f
retn
@@: du szPluginName
section'.edata'export data readable
export'plugin.dll',\
PluginName,'PluginName'section'.reloc' fixups data discardable
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, OdesitVadim, Вы писали:
OV>А возвращаемая строка точно в юникоде будет?
Да. du преобразует каждый символ строки в 2 быйта:
The "db" and "du" directives also accept the quoted string values of any
length, which will be converted into chain of bytes when "db" is used and into
chain of words with zeroed high byte when "du" is used.
OV> Я почти так написал, но передаётся ANSI
Значит у Вас db
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, OdesitVadim, Вы писали:
GN>Значит у Вас db
Да, у меня было db. Теперь передаётся нормально, но появиласть другая проблемма — русские строки...
Здравствуйте, OdesitVadim, Вы писали:
OV>появиласть другая проблемма — русские строки...
Для русских UTF-16 символов старший байт не равен 0, нужно конвертировать. Вот макрос от автора fasm:
macro du [args]
{ common local ..times,..size,..char
virtual at 0
db args
..size = $
end virtual
repeat ..size
virtual at 0
db args
load ..char byte from $ - ..size + % - 1
end virtual
if ..char > 127
db ..char-0b0h, 04h
else
du ..char
end if
end repeat }
struc du [args] { common du args }
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, OdesitVadim, Вы писали:
OV>>появиласть другая проблемма — русские строки...
GN>Для русских UTF-16 символов старший байт не равен 0, нужно конвертировать. Вот макрос от автора fasm: GN>[skipped]
С версии эдак 1.56 эти макросы входят в стандартную поставку. du будет определять русские строки, надо только включить /include/encoding/win1251.inc.