Консультация № 144358
19.09.2008, 08:52
0.00 руб.
0 2 2
Доброго времени суток уважаемые эксперты! У меня не получается запустить на выполнение што я зделал не так подскажыте.
Заранее спасибо.

Приложение:
код DLL
library Dll;

uses
SysUtils,
Classes,
Unit1 in 'Unit1.pas' {Form1};

function MyFunc(num1,num2,Errcode:Integer; Operation:PChar):integer;stdcall;
begin
try
if Operation='plus' then
Result:=num1+num2;
if Operation='minus' then
Result:=num1-num2;
if Operation='multiply' then
Result:=num1*num2;
if Operation='div' then
Result:=num1 div num2;
if Operation='mod' then
Result:=num1 mod num2;
except Result:=Errcode;
end;
end;

exports
MyFunc INDEX 1 NAME 'MathFunc';

begin
end.

Основная форма
unit Unit12;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Num1Edit: TEdit;
Num2Edit: TEdit;
OpEdit: TEdit;
ResultEdit: TEdit;
DoItButton1: TButton;
procedure DoItButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
function MyFunc(num1, num2, Errcode:Integer; Operation: PCHar):Integer; stdcall; external
'Project2.dll' name 'MathFunc' index 1;


procedure TForm1.DoItButton1Click(Sender: TObject);
const
Errcode:Integer=978987;
var
Num1, Num2, Result_:Integer;
Operation:String;
begin
try
Num1:=StrToInt(Num1Edit.Text);
Num2:=StrToInt(Num2Edit.Text);
except
Num1Edit.Text:='0';
Num2Edit.Text:='0';
ResultEdit.Text:='Введите целые ЧИСЛА';
exit;
end;
Operation:=OpEdit.Text;
if (Operation<>'plus')and(Operation<>'minus')and(Operation<>'multiply')
and(Operation<>'div')and(Operation<>'mod')then
begin
ResultEdit.Text:='Введите коректную команду';
exit;
end;
Result_:=MyFunc(Num1, Num2, Errcode, PChar(Operation));
if Result_=Errcode then
begin
ResultEdit.Text:='ОШИБКА';
exit;
end;
end;
end.

Обсуждение

Неизвестный
19.09.2008, 09:44
общий
это ответ
Здравствуйте, Кравченко Игорь Николаевич!

Вот исправленный ваш пример.
Код:
 library Project2;

uses
SysUtils, Classes ;
function MyFunc(num1,num2,Errcode:Integer; Operation:PChar):integer;stdcall;
begin
Result := 0;
try
if Operation='plus' then
Result:=num1+num2
else if Operation='minus' then
Result:=num1-num2
else if Operation='multiply' then
Result:=num1*num2
else if Operation='div' then
Result:=num1 div num2
else if Operation='mod' then
Result:=num1 mod num2;
except Result:=Errcode;
end;
end;

exports
MyFunc NAME 'MathFunc';

begin
end.
*************************************************************

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Num1Edit: TEdit;
Num2Edit: TEdit;
OpEdit: TEdit;
ResultEdit: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function MyFunc(num1, num2, Errcode:Integer; Operation: PCHar):Integer; stdcall; external 'Project2.dll' name 'MathFunc';
implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
Errcode:Integer=978987;
var
Num1, Num2, Result_:Integer;
Operation:String;
begin
try
Num1:=StrToInt(Num1Edit.Text);
Num2:=StrToInt(Num2Edit.Text);
except
Num1Edit.Text:='0';
Num2Edit.Text:='0';
ResultEdit.Text:='Введите целые ЧИСЛА';
exit;
end;
Operation:=OpEdit.Text;
if (Operation<>'plus')and(Operation<>'minus')and(Operation<>'multiply')
and(Operation<>'div')and(Operation<>'mod')then
begin
ResultEdit.Text:='Введите коректную команду';
exit;
end;
Result_:=MyFunc(Num1, Num2, Errcode, PChar(Operation));
if Result_=Errcode then
begin
ResultEdit.Text:='ОШИБКА';
end
else
begin
ResultEdit.Text:= IntToStr(Result_);
end;

end;

end.

Но, рекомендую, максимально, где только возможно – обходиться числовыми параметрами, и строки использовать только в крайней необходимости.
Напрмер так:
Код:
 library Project2;

uses
SysUtils, Classes ;
function MyFunc(num1,num2,Errcode,Operation:Integer):integer;stdcall;
begin
Result := 0;
try
case Operation of
0: Result:=num1+num2;
1: Result:=num1-num2;
2: Result:=num1*num2;
3: Result:=num1 div num2;
4: Result:=num1 mod num2;
else Result:= 0;
end;
except Result:=Errcode;
end;
end;

exports
MyFunc NAME 'MathFunc';

begin
end.
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Num1Edit: TEdit;
Num2Edit: TEdit;
ResultEdit: TEdit;
Button1: TButton;
ComboBox1: TComboBox; // тут храним список операций
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function MyFunc(num1, num2, Errcode,Operation: Integer):Integer; stdcall; external 'Project2.dll' name 'MathFunc';
implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
Errcode:Integer=978987;
var
Num1, Num2, Result_:Integer;
Operation:String;
begin
try
Num1:=StrToInt(Num1Edit.Text);
Num2:=StrToInt(Num2Edit.Text);
except
Num1Edit.Text:='0';
Num2Edit.Text:='0';
ResultEdit.Text:='Введите целые ЧИСЛА';
exit;
end;
Result_:=MyFunc(Num1, Num2, Errcode, ComboBox1.ItemIndex); //передаем операцию что выбрал пользователь
if Result_=Errcode then
begin
ResultEdit.Text:='ОШИБКА';
end
else
begin
ResultEdit.Text:= IntToStr(Result_);
end;

end;

end.
Неизвестный
19.09.2008, 09:50
общий
это ответ
Здравствуйте, Кравченко Игорь Николаевич!
У Вас все нормально, только почему-то потерялась ссылка на использование файла ресурсов формы.
Подправьте основной модуль как в приложении.
Кроме этого должен быть сформирован файл Project2.dll (запустить на выполнение Project2.dpr). (проверьте его наличие)
Для отладки расположить его в одном каталоге с основным модулем.

Приложение:
implementation
function MyFunc(num1, num2, Errcode:Integer; Operation: PCHar):Integer; stdcall; external
'Project2.dll' name 'MathFunc' index 1;

{$R *.dfm}

procedure TForm2.DoItButton1Click(Sender: TObject);
const
Errcode:Integer=978987;
var
Num1, Num2, Result_:Integer;
Operation:String;
begin
....
end;
Форма ответа