Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.61 MB
Время: 0.032 c
1-2938
werr
2003-05-20 17:10
2003.06.02
как определить каталог, откуда запускалась программа?


1-3003
JS
2003-05-21 18:54
2003.06.02
Перерисовка компонента


1-2956
AFrolov
2003-05-20 18:09
2003.06.02
Как сделать главную форму приложения невидимой


3-2825
VeLeS
2003-05-15 15:24
2003.06.02
как заставить маску понимать значение NULL?


14-3060
Knight
2003-05-08 09:43
2003.06.02
9 МАЯ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский