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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
4-3223
UNIVERSAL
2003-04-04 19:40
2003.06.02
Как сделать окно поверх всех окон данного приложения


1-2970
Azbul
2003-05-21 10:26
2003.06.02
запись шестнадцатиричного значения в файл


14-3082
Saracin
2003-05-14 10:18
2003.06.02
Работа с системным журналом.


14-3165
*pavel
2003-05-15 14:43
2003.06.02
tif & Delphi


1-2902
serikoff
2003-05-22 19:18
2003.06.02
tListView, auto scroll