Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизDll error ??? Найти похожие ветки
← →
AndrewVolkov (2003-05-20 18:37) [0]Всем доброго дня.
Пытаюсь написать свою длл.
Взял все из примера на этом сайте
это проджект
procedure TForm1.Button1Click(Sender: TObject);
begin
try begin
@GetSimpleText:=nil;
LibHandle:=LoadLibrary("charcnv.dll");
if LibHandle>=32 then begin
@GetSimpleText:=GetprocAddress(LibHandle,"GetSimpleText");
if @GetSimpleText<>nil then
ShowMessage(StrPas(GetSimpleText(True)));
end;
FreeLibrary(Libhandle);
end;
except
end;
end;
это текст длл
library charcnv;
uses
SysUtils,
Classes;
function GetSimpleText(LangRus:Boolean):PChar;stdcall;
begin
if LangRus then Result:=PChar("Russian")
else Result:=PChar("English");
end;
exports GetSimpleText;
begin
end.
все находится в одном фолдере
что происходит. жму на кнопку - выдается сообщение с надписбю "Russian". Все как бы красиво. Но призакрытии окна сообщения через крестик или ок дебаггер делфи вылетает с ошибкой
access violation at address ; write of address 0x00432a40
и помогает только сброс программы через ресет в делфях
Если же ексешник запускать, то ошибок нету, но при закрытии мессаджа закрывается и вся программа.
В чем может быть проблема???
← →
Palladin (2003-05-20 18:39) [1]покажи описание процедуры в проджекте...
и для чего лишние операторные скобки? затрудняет чтение...
← →
AndrewVolkov (2003-05-20 18:41) [2]вот весь проджект, тут то и нет ничего особого.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
GetSimpleText:function(LangRus:Boolean):PChar;
LibHandle:THandle;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
try begin
@GetSimpleText:=nil;
LibHandle:=LoadLibrary("charcnv.dll");
if LibHandle>=32 then begin
@GetSimpleText:=GetprocAddress(LibHandle,"GetSimpleText");
if @GetSimpleText<>nil then
ShowMessage(StrPas(GetSimpleText(True)));
end;
FreeLibrary(Libhandle);
end;
except
end;
end;
end.
← →
VMcL (2003-05-20 18:45) [3]IMHO, надо переделать GetSimpleText:
procedure GetSimpleText(LangRus: Boolean; Res: PChar); stdcall;
← →
MBo (2003-05-20 18:45) [4]Не приведено определение GetSimpleText в программе. stdcall не забыл?
← →
Palladin (2003-05-20 18:45) [5]мда, ты уверен что ты все делал в соответствии со статьей?
попробуй заменить вот этот кусок
var
Form1: TForm1;
GetSimpleText:function(LangRus:Boolean):PChar;
LibHandle:THandle;
на этот
Type
TMyFunc=function (LangRus:Boolean):PChar; stdcall;
var
Form1: TForm1;
GetSimpleText:TMyFunc;
LibHandle:THandle;
← →
Skier (2003-05-20 18:46) [6]>AndrewVolkov
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
LibHandle:THandle;
implementation
{$R *.dfm}
type
TGetSimpleText : function(LangRus:Boolean):PChar; stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
GetSimpleText : TGetSimpleText;
begin
try begin
@GetSimpleText:=nil;
LibHandle:=LoadLibrary("charcnv.dll");
if LibHandle>=32 then begin
@GetSimpleText:=GetprocAddress(LibHandle,"GetSimpleText");
if @GetSimpleText<>nil then
ShowMessage(StrPas(GetSimpleText(True)));
end;
FreeLibrary(Libhandle);
end;
except
end;
end;
end.
2)
← →
AndrewVolkov (2003-05-20 18:49) [7]type не помог;
stdcall не хватало :))
а для чего он нужен в прождекте, разве его в длл не хватает?
Спасибо
← →
Skier (2003-05-20 18:52) [8]>type не помог;
Странно...
← →
Palladin (2003-05-20 18:53) [9]
> Skier © (20.05.03 18:52)
странно не это
> а для чего он нужен в прождекте, разве его в длл не хватает?
вот это странно
← →
AndrewVolkov (2003-05-20 18:53) [10]kak Skyer тоже работает
← →
MBo (2003-05-20 18:54) [11]> разве его в длл не хватает?
нет, конечно.
И вызываться и выполняться процедура должна с одним соглашением.
Откуда программа-то узнает, какое оно в DLL?
← →
AndrewVolkov (2003-05-20 18:54) [12]то Palladin
что странно?
← →
AndrewVolkov (2003-05-20 18:56) [13]тогда я может чего-то недопонимаю
Для чего он нужен- stdcall
← →
Palladin (2003-05-20 18:57) [14]
> AndrewVolkov (20.05.03 18:53)
соглашения о вызовах должны быть одинаковы...
доктор тебе в узкий стакан положит снотворное для бабушки и слабительное для тебя, а ты об этом не узнаешь и решишь что первая для тебя а вторая для бабушки, вот весело будет...
← →
Skier (2003-05-20 18:57) [15]>AndrewVolkov
> kak Skyer тоже работает
Ну вот...другое дело ! :)
По умолчание в Delphi используется соглашение register, но
раз уж ты написал в DLL stdcall, то будь добр и в host-приложении так же написать, а то больно будет - граблями по лбу.
← →
MBo (2003-05-20 18:58) [16]F1 Calling conventions
← →
Юрий Зотов (2003-05-20 19:24) [17]Удалено модератором
Примечание: OffTopic
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c