Fasm и UNICODE
От: OdesitVadim Украина  
Дата: 20.04.06 10:12
Оценка:
Пишу плагин к программе и решил поэксперементировать (для разгрузки мозгов) написать на FASM'е
Но в проги небольшая особенность — она работает исключительно на юникоде.
Определяется экспортируемая функция так
#define PLUGIN_API extern "C" __declspec( dllexport )
PLUGIN_API LPWSTR PluginName()
{
        return L"Test plugin v0.2";
}

Вопрос, как это на FASM'e написать с минимальными телодвижениями?
Тоесть, строка хоть и константа, но чтобы поменять легко можно было
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Fasm и UNICODE
От: gear nuke  
Дата: 20.04.06 12:07
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Определяется экспортируемая функция так

OV>
OV>#define PLUGIN_API extern "C" __declspec( dllexport )
OV>PLUGIN_API LPWSTR PluginName()
OV>{
OV>        return L"Test plugin v0.2";
OV>}
OV>

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
Re[2]: Fasm и UNICODE
От: OdesitVadim Украина  
Дата: 20.04.06 12:35
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, OdesitVadim, Вы писали:


GN>
GN>format PE GUI 4.0 DLL

GN>szPluginName equ "Test plugin v0.2", 0

GN>include '%fasminc%/win32a.inc'


GN>section '.code' code readable executable

GN>PluginName:
GN>        mov eax, @f
GN>        retn

GN>@@:     du szPluginName


GN>section '.edata' export data readable

GN>  export 'plugin.dll',\
GN>     PluginName,'PluginName'


GN>section '.reloc' fixups data discardable 
GN>

А возвращаемая строка точно в юникоде будет? Я почти так написал, но передаётся ANSI
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Fasm и UNICODE
От: gear nuke  
Дата: 20.04.06 13:03
Оценка:
Здравствуйте, 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
Re[4]: Fasm и UNICODE
От: OdesitVadim Украина  
Дата: 21.04.06 08:53
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, OdesitVadim, Вы писали:


GN>Значит у Вас db

Да, у меня было db. Теперь передаётся нормально, но появиласть другая проблемма — русские строки...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Fasm и UNICODE
От: gear nuke  
Дата: 23.04.06 03:44
Оценка:
Здравствуйте, 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
Re[6]: Fasm и UNICODE
От: arv  
Дата: 24.04.06 03:01
Оценка: 1 (1)
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, OdesitVadim, Вы писали:


OV>>появиласть другая проблемма — русские строки...


GN>Для русских UTF-16 символов старший байт не равен 0, нужно конвертировать. Вот макрос от автора fasm:

GN>[skipped]

С версии эдак 1.56 эти макросы входят в стандартную поставку. du будет определять русские строки, надо только включить /include/encoding/win1251.inc.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.