Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

Использование 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.037 c
11-1152395331
Сергеич
2006-07-09 01:48
2007.04.01
Как без нодов жить хорошо


1-1170236837
SH@RK
2007-01-31 12:47
2007.04.01
Динамические массивы vs Статические массивы


1-1170747105
Kolan
2007-02-06 10:31
2007.04.01
Как зоблокировать TChart на время рисвания на нем?


15-1173250917
Fredy314
2007-03-07 10:01
2007.04.01
Поздравляем прекрасную половину человечества с 8 Марта


15-1173469245
lookin
2007-03-09 22:40
2007.04.01
Вот так DHL облажалась...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский