Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.01;
Скачать: CL | DM;

Вниз

Использование DLL... вылетает ошибка   Найти похожие ветки 

 
ANikolay   (2007-03-13 08:30) [0]

Вылетает ошибка именно при выполнении функции из DLL, хотя с процедурой все нормально! Почему?...

library kartel_dll;

uses
 SysUtils,
 Classes,
 Dialogs;

{$R *.res}

// Функция
function GetAsText(i: integer): string; cdecl;
begin
 Result := IntToStr(i);
end;

// Процедура
procedure ShowText(s: string); stdcall;
begin
 ShowMessage(s);
end;

exports
 GetAsText,
 ShowText;

begin
end.


использование


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   btUseProc: TButton;
   Edit1: TEdit;
   btUseFunc: TButton;
   procedure btUseProcClick(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure btUseFuncClick(Sender: TObject);
 private
   DLLHandle: HWND;

   ShowText: procedure(s: string); stdcall;
   GetAsText: function(i: integer): string; cdecl;
 public
 end;

const
 sDLL_Name = "kartel_dll.dll";
var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 try
   DLLHandle := LoadLibrary(PChar(sDLL_Name));

   @ShowText := GetProcAddress(DLLHandle, "ShowText");
   @GetAsText := GetProcAddress(DLLHandle, "GetAsText");
 except
   MessageDlg("Не удалось загрузить DLL!", mtError, [mbOK], 0);
   Halt;
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if DLLHandle > 0 then
   FreeLibrary(DLLHandle);
end;

procedure TForm1.btUseProcClick(Sender: TObject);
begin
 try
   if @ShowText <> nil then
     ShowText(Edit1.Text);
 except
   ShowMessage("Ошибка при попытке выполнить процедуру из DLL!");
 end;
end;

procedure TForm1.btUseFuncClick(Sender: TObject);
begin
 try
   if @GetAsText <> nil then
     Caption := GetAsText(100);
 except
   ShowMessage("Ошибка при попытке выполнить функцию из DLL!");
 end;
end;

end.


 
Сергей М. ©   (2007-03-13 08:39) [1]

см. ShareMem

к тому же, cdecl тут зачем ?


 
ANikolay   (2007-03-13 09:00) [2]


> см. ShareMem


Поставит ShareMem первым модулем в DLL и клиентском приложении... теперь при закрытии формы вываливается Runtime error 217...... даже если не вызывать функции....


 
Сергей М. ©   (2007-03-13 09:01) [3]


> Поставит ShareMem первым модулем


Что значит "первым модулем" ?
ПРокомментируй ...


 
ANikolay   (2007-03-13 09:06) [4]


> Что значит "первым модулем" ?
> ПРокомментируй ...


это на всякий случай, если память будет выделяться в одном модуле, а высвобождаться - в другом

(The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs.)

а что все-таки интересно еще не так?!.....


 
Knight ©   (2007-03-13 09:09) [5]

PChar и нет проблем...


 
Сергей М. ©   (2007-03-13 09:12) [6]

program MyHostApp;
uses
 ShareMem,
 .....

library MyLib;
uses
 ShareMem,
 .....

Ссылка на ShareMem должна быть только здесь и нигде более.


 
ANikolay   (2007-03-13 09:19) [7]

компильните кто-нидь плиз... по закрытию у вас будет вываливаться ошибка?!

library kartel_dll;

uses
 ShareMem,
 SysUtils,
 Classes,
 Dialogs;

{$R *.res}

// Функция
function GetAsText(i: integer): string; stdcall;
begin
 Result := IntToStr(i);
end;

// Процедура
procedure ShowText(s: PChar); stdcall;
begin
 ShowMessage(s);
end;

exports
 GetAsText,
 ShowText;

begin
end.



unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   btUseProc: TButton;
   Edit1: TEdit;
   btUseFunc: TButton;
   procedure btUseProcClick(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure btUseFuncClick(Sender: TObject);
 private
   DLLHandle: HWND;

   ShowText: procedure(s: PChar); stdcall;
   GetAsText: function(i: integer): string; stdcall;
 public
 end;

const
 sDLL_Name = "kartel_dll.dll";
var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 try
   DLLHandle := LoadLibrary(PChar(sDLL_Name));

   @ShowText := GetProcAddress(DLLHandle, "ShowText");
   @GetAsText := GetProcAddress(DLLHandle, "GetAsText");
 except
   MessageDlg("&#205;&#229; &#243;&#228;&#224;&#235;&#238;&#241;&#252; &#231;&#224;&#227;&#240;&#243;&#231;&#232;&#242;&#252; DLL!", mtError, [mbOK], 0);
   Halt;
 end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if DLLHandle > 0 then
   FreeLibrary(DLLHandle);
end;

procedure TForm1.btUseProcClick(Sender: TObject);
begin
 try
   if @ShowText <> nil then
     ShowText(PChar(Edit1.Text));
 except
   ShowMessage("&#206;&#248;&#232;&#225;&#234;&#224; &#239;&#240;&#232; &#239;&#238;&#239;&#251;&#242;&#234;&#229; &#226;&#251;&#239;&#238;&#235;&#237;&#232;&#242;&#252; &#239;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&#243; &#232;&#231; DLL!");
 end;
end;

procedure TForm1.btUseFuncClick(Sender: TObject);
begin
 try
   if @GetAsText <> nil then
     Caption := GetAsText(Random(100));
 except
   ShowMessage("&#206;&#248;&#232;&#225;&#234;&#224; &#239;&#240;&#232; &#239;&#238;&#239;&#251;&#242;&#234;&#229; &#226;&#251;&#239;&#238;&#235;&#237;&#232;&#242;&#252; &#244;&#243;&#237;&#234;&#246;&#232;&#254; &#232;&#231; DLL!");
 end;
end;

end.


 
Сергей М. ©   (2007-03-13 09:21) [8]


> ANikolay   (13.03.07 09:19) [7]


Читать [6] внимательно !


 
ANikolay   (2007-03-13 09:23) [9]


> Читать [6] внимательно !


блин, точно!.. ступил... :)
С-П-А-С-И-Б-О!!!!!!!


 
Сергей М. ©   (2007-03-13 09:24) [10]

)

cdecl исчез, теперь на его месте stdcall появился ..

Что, так и будешь бездумно перебирать знакомые буквы ?



Страницы: 1 вся ветка

Текущий архив: 2007.04.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
2-1173437359
Polzun
2007-03-09 13:49
2007.04.01
Как задать управляющие коды принтера?


15-1173015018
Riply
2007-03-04 16:30
2007.04.01
Комментарии в dpr файле.


2-1173433604
Ega23
2007-03-09 12:46
2007.04.01
Механизм цветопередачи картинок к TAction при Enabled/Disabled


11-1152408034
Scrage
2006-07-09 05:20
2007.04.01
KOL и MCK


15-1173428362
Ega23
2007-03-09 11:19
2007.04.01
Коллеги, подскажите, как работают UPS-ы (не APC)?