Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Компилятор выдаёт ошику! Голову сломал...


Автор: yrajoey 15.2.2008, 21:43
У меня есть dll-библиотека(project2.dll):
Код

library Project2;

uses
  SysUtils,
  Classes;

procedure SummEdit1(x:integer);
var a:integer;
begin
a:= x + 10;
end;

{$R *.res}

exports SummEdit1;

begin
end.
 

и unit1.pas основного проекта:
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure SummEdit1(x:integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SummEdit1; external 'Project2.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
SummEdit1(strtoint(Edit1.Text));
end;

end.



При компиляции последнего выдаёт ошибку:
"Точка входа в процедуру TForm1.SummEdit1 не найдена в библиотеке DLL Project2.dll" Что же делать??? подскажите


M
Alexeis
Модератор: Название темы должно отражать ее суть!

Автор: lukas 15.2.2008, 22:12
Скорее всего твоя процедура не должна быть методом формы....

Код


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

  procedure SummEdit1; external 'Project2.dll';

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SummEdit1(strtoint(Edit1.Text));
end;
end.

Автор: VICTAR 15.2.2008, 22:13
Задай процедуре имя или индекс

Автор: yrajoey 15.2.2008, 22:26
lukas,  Да! Вы правы... Работает. Только после выхода опять ошибка: "Проект Project1.exe вызвал исключение класса 'EInvalidPointer operation' Процесс остановлен" 

Автор: VICTAR 15.2.2008, 22:46
А где параметр в объявлении функции?
Код

procedure SummEdit1(x:integer); external 'Project2.dll';

Автор: yrajoey 15.2.2008, 23:47
VICTAR,  Не... Не фига... всё также...ошибка

Автор: ivan219 16.2.2008, 00:41
Нужно сночало договорится StdCall;
Код

procedure SummEdit1(x:integer);  StdCall;

procedure SummEdit1(x:integer); StdCall; external 'Project2.dll';

Автор: yrajoey 16.2.2008, 14:52
ivan219, Если бы всё так просто... это не помогает

Автор: THandle 16.2.2008, 15:05
Библиотеку чуть чуть изменил чтоб было видно что хлть делается, вот она:

Код

library Project2;
uses
  SysUtils,
  Classes, Dialogs;

procedure SummEdit1(x:integer); stdcall;
var a:integer;
begin
a:= x + 10;
ShowMessage(IntToStr(a));
end;

{$R *.res}
exports SummEdit1;

begin
end.



А вот сам модуль проги:

Код

unit Unit1;

interface

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

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

  procedure SummEdit1(x : integer); stdcall; external 'Project2.dll' name 'SummEdit1';
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SummEdit1(StrToInt(Edit1.Text));
end;

end.




Автор: lukas 16.2.2008, 17:16
Вообще должно работать и без stdcall... если в том же делфи использовать... 


Код

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

  procedure SummEdit1(x: Integer); external 'Project2.dll';

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
SummEdit1(strtoint(Edit1.Text));
end;

end.

Автор: ivan219 16.2.2008, 18:30
Цитата(yrajoey @  16.2.2008,  14:52 Найти цитируемый пост)
это не помогает

Уменя этот код невызывает никаких ошибок!

Цитата(lukas @  16.2.2008,  17:16 Найти цитируемый пост)
Вообще должно работать и без stdcall

Но правильнее делать всёже с stdcall;

Автор: yrajoey 19.2.2008, 20:11
Спасибо всем

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)