Форум: "Начинающим";
Текущий архив: 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("Íå óäàëîñü çàãðóçèòü 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("Îøèáêà ïðè ïîïûòêå âûïîëíèòü ïðîöåäóðó èç DLL!");
end;
end;
procedure TForm1.btUseFuncClick(Sender: TObject);
begin
try
if @GetAsText <> nil then
Caption := GetAsText(Random(100));
except
ShowMessage("Îøèáêà ïðè ïîïûòêå âûïîëíèòü ôóíêöèþ èç 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