sepo
Сообщений: 434
Оценки: 10
Присоединился: 2009-01-13 21:19:09.150000
|
В этой статье я напишу пример создания DLL на фасме. В длл запишем процедуру которая может складывать и вычитать числа. ДЛЛ напишем на фасме, а программу которая будет вызывать функцию из длл напишем на дельфи. Эта статья для тех кто хотя-бы знает что такое DLL. Почитать можно здесь - http://ru.wikipedia.org/wiki/DLL Код DLL библиотеки: [font=verdana]format PE GUI 4.0 DLL ;формат исполняемого файла PE GUI 4.0 DLL
entry DllEntryPoint ;Инициализация DLL. Функция DllEntryPoint
include 'INCLUDE\win32ax.inc' ;Инклуид файл
section '.data' data readable writable ;дата секция
formats db "%d",0
result db 256 dup(?)
section '.code' code readable executable ;секция кода
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved ;функция инициализации DLL
mov eax,TRUE ; перемещаем в регистр eax значение True т.е Истина. Если сюда поставить False (ложь), то DLL не ;запустится
ret ;выходим из этой функции
endp
proc Calc TypeCalc,Number1,Number2 ;процедура Calc
mov eax,[TypeCalc] ;премещаем в eax значение TypeCalc
.if eax = 0 ;если значение eax равно 0, то...
mov edx,[Number1] ;перемещаем в edx значение Number1
mov ebx,[Number2] ;перемещаем в ebx значение Number2
sub edx,ebx ;вычитаем edx из ebx и сохраняем результат в edx
.endif
.if eax = 1 ;если значение eax равно 1, то...
mov edx,[Number1] ;перемещаем в edx значение Number1
mov ebx,[Number2] ;перемещаем в ebx значение Number2
add edx,ebx ; складываем edx и ebx
.endif
invoke wsprintf,result,formats,edx ;конвернтируем число (значение edx) в строку, для того чтобы вывести на экран
invoke MessageBox,0,result,'Result',MB_OK ;выводим результат на экран
ret ;выходим из процедуры
endp
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include '..\INCLUDE\api\kernel32.inc'
include '..\INCLUDE\api\user32.inc'
section '.edata' export data readable
[/font][font=verdana]export 'Calc.dll',\ ;разрешаем экспорт процедуры Calc
Calc, 'Calc'
section '.reloc' fixups data discardable[/font] Сохраните этот код в файле Calc.asm и скомпилируйте код. Всё. С длл разобрались. Теперь напишем программу которая будет использовать эту длл. Напишем эту программу на дельфи. Код: [font=verdana][b][color=#010101]unit[/color][/b] Unit1;
[b][color=#010101]interface[/color][/b]
[b][color=#010101]uses[/color][/b]
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
[b][color=#010101]type[/color][/b]
TForm1 [/font][font=verdana]= [b][color=#010101]class[/color][/b](TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
[b][color=#010101]procedure[/color][/b] Button2Click(Sender: TObject);
[b][color=#010101]procedure[/color][/b] Button1Click(Sender: TObject);
[b][color=#010101]private[/color][/b]
[i][color=#808080]{ Private declarations }[/color][/i]
[b][color=#010101]public[/color][/b]
[i][color=#808080]{ Public declarations }[/color][/i]
[b][color=#010101]end[/color][/b];
[b][color=#010101]var[/color][/b]
Form1: TForm1;
[b][color=#010101]implementation[/color][/b]
[i][color=#808080]{$R *.dfm}[/color][/i]
[b][color=#010101]procedure[/color][/b] Calc(TypeCalc,Number1,Number2 : cardinal); [b][color=#010101]stdcall[/color][/b]; [b][color=#010101]external[/color][/b] [b][color=#008000]'Calc.dll'[/color][/b]; [i][color=#808080]//статический вызов длл Calc.dll[/color][/i]
[b][color=#010101]procedure[/color][/b] TForm1.Button2Click(Sender: TObject);
[b][color=#010101]begin[/color][/b]
Calc(53[color=#0000ff]54,StrToInt(Edit1.Text),StrToInt(Edit2.Text)); [i][color=#808080]//с помощью функции Calc вычитаем содержимое Edit2 из Edit1[/color][/i]
[b][color=#010101]end[/color][/b];
[b][color=#010101]procedure[/color][/b] TForm1.Button1Click(Sender: TObject);
[b][color=#010101]begin[/color][/b]
Calc(63[/color]64,StrToInt(Edit1.Text),StrToInt(Edit2.Text)); [i][color=#808080]//с помощью функции Calc складываем содержимое Edit1 с Edit2[/color][/i]
[b][color=#010101]end[/color][/b];
[b][color=#010101]end[/color][/b].[/font] Всё. Надеюсь кому-то пригодится. Если что не так сильно бить не надо, писал на быструю руку[sm=peace.gif]
|