![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание и использование DLL
dolmat © (2005-11-29 10:48:00)Пробую запихнуть одну функцию в DLL. Раньше никогда не занимался подобным. Что я делаю не так?
library z_cod;
uses
SysUtils,
Classes;
{$R *.RES}
function z_code(s:ShortString):ShortString; stdcall;
var zc:string[1];
zk,zk1:longint;
begin
zk:=strtoint(s);
zk1:=zk mod 11;
if zk1=0 then zc:='5'
else if zk1=10 then zc:='0'
else zc:=inttostr(zk1);
z_code:=zc;
end;
exports
z_code name 'z_code';
begin
end.
И использование
unit Unit2;
interface
function z_code(i:ShortString):ShortString; external 'z_cod.dll';
implementation
end.
unit Unit1;
interface
uses
ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var s:string[1];
begin
s:=z_code('3121001');
end;
end.
Постоянно возникает Access volidation at adres 00331FE9 in module z_cod.dll
jack128 (2005-11-29 14:30:00) [1]dolmat (29.11.05 10:48)
function z_code(s:ShortString):ShortString; stdcall;
Модификатором const не избегайте пользоваться.
begin...end (2005-11-29 13:03:00) [2]> dolmat (29.11.05 12:46) [7]
Уберите ShareMem.
Anatoly Podgoretsky (2005-11-29 12:49:00) [3]Это уже к этому не относится
dolmat (2005-11-29 12:46:00) [4]begin...end © (29.11.05 10:54) [1]
Заработало. Только теперь при выходе из программы "Rantime error 217"
Это чего нужно?
wal (2005-11-29 11:45:00) [5]
> А где здесь ShareMem?
А зачем он здесь?
Ega23 (2005-11-29 11:40:00) [6]
> А где здесь ShareMem?
Он же ShortString использует...
evvcom (2005-11-29 11:39:00) [7]
> library z_cod;
>
> uses
> SysUtils,
> Classes;
А где здесь ShareMem?
Ega23 (2005-11-29 11:07:00) [8]Попробуй так:
function z_code(s:ShortString):ShortString; stdcall;
var
zk,zk1:longint;
begin
Result:=s;
zk:=strtoint(s);
zk1:=zk mod 11;
if zk1=0 then Result:='5'
else if zk1=10 then Result:='0'
end;
Ega23 (2005-11-29 11:05:00) [9]
> else zc:=inttostr(zk1);
Здесь вылет?
begin...end (2005-11-29 10:54:00) [10]По меньшей мере, добавьте stdcall в описание функции в EXE или уберите его из описания в DLL.