Assembler - язык неограниченных возможностей


Динамические библиотеки - часть 3


Как видно из примера, нам пришлось назвать все процедуры по-разному для различных ассемблеров. В случае MASM понятно, что все функции должны иметь имена типа _start@12, а иначе программам, использующим их, придется обращаться к функциям с именами типа _Jmp_start, то есть такой DLL нельзя будет использовать из программы, написанной на Microsoft С. В случае TASM и WASM процедуры могут иметь неискаженные имена (и более того, wlink.exe не позволяет экспортировать имя переменной, содержащее символ @), так как их компиляторы берут имена процедур не из библиотечного файла, а прямо из DLL при помощи соответствующей программы — implib или wlib.

Итак, чтобы воспользоваться полученным DLL, напишем простую программу, которая перекодирует одну строку из КОI-8r в Windows ср1251.

; dlldemo.asm ; Графическое приложение для Win32, демонстрирующее работу с dllrus.dll, ; выводит строку в KOI8 и затем в ср1251, перекодированную функцией koi2wins include def32.inc include user32.inc include kernel32.inc includelib dllrus.lib ifndef _MASM_ extrn koi2win__asm:near ; определения для функций из DLL для extrn koi2win:near ; TASM и WASM extrn koi2wins_asm:near ; (хотя для WASM было бы эффективнее extrn koi2wins:near ; использовать __imp__koi2win, выделив else ; его в отдельный условный блок), extrn __imp__koi2win_asm@0:dword ; а это для MASM extrn __imp__koi2win@4:dword extrn __imp__koi2wins_asm@0:dword extrn __imp__koi2wins@4: dword koi2win_asm equ __imp__koi2win_asm@0 koi2win equ __imp__koi2win@4 koi2wins_asm equ __imp__koi2wins_asm@0 koi2wins equ __imp__koi2wins@4 endif

.386 .model flat .const title_string1 db "koi2win demo: string in KOI8",0 title_string2 db "koi2win demo: string in cp1251",0

.data koi_string db 0F3h,0D4h,0D2h,0CFh,0CBh,0C1h,20h,0CEh,0C1h db 20h,0EBh,0EFh,0E9h,2Dh,28h,0 .code _start: push MB_OK push offset title_string1 ; заголовок окна MessageBox push offset koi_string ; строка на KOI push 0 call MessageBox mov eax,offset koi_string push eax call koi2wins push MB_OK push offset title_string2 push offset koi_string push 0 call MessageBox push 0 ; код выхода call ExitProcess ; конец программы

end _start

Этот небольшой DLL может оказаться очень полезным для расшифровки текстов, приходящих из сети Internet или других систем, в которых используется кодировка KOI8. Воспользовавшись таблицами из приложения 1, вы можете расширить набор функций dllrus.dll, вплоть до перекодировки из любого варианта в какой угодно.





Начало  Назад  Вперед