7 / 7 / 4
Регистрация: 28.08.2010
Сообщений: 174
1

Ошибка при отключении программы...

29.12.2011, 22:46. Показов 1919. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток Господа, И как всегда ошибка, но только с ней я столкнулся в конце....
Ну поподробней....
Короче есть код, в котором при компиляции нет ошибок далее при запуске программы также нет никаких ошибок программа все делает как надо и только при отключении выполнения программы выдает, следующую ошибку:

Project <project-name> raised exception class <yyyy> with message <message-text>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2011, 22:46
Ответы с готовыми решениями:

Asynchronous socket error 10053 при отключении клиента
Собсна, всё работает, клиент отправляет сообщение серверу, сервер принимает успешно. Но при...

Запуск программы при отключении интернета
Здравствуйте! Подскажите пожалуйста каким образом мне решить проблему: мне надо чтобы моя программа...

Состояние программы при отключении питания
Доброго времени суток. Есть программа, в нём есть таймер. Как сохранить состояние таймера и пр.....

Предотвратить падение программы при отключении интернета
Имеется софт, который работает с сетью. Бывает такое, что интернет на секунду-другую разорвётся и...

8
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
29.12.2011, 22:50 2
ну или код давай, или название ошибки, 100% что-то с адресом, где-то что-то недосоздется или недоудаляется
0
7 / 7 / 4
Регистрация: 28.08.2010
Сообщений: 174
29.12.2011, 23:06  [ТС] 3
Я так и думал где-то что-то недоудаляется....
вот ошибка:
Project tst.exe raised exeception class $c0000005 with message 'access violation at 0x00ae3142: write of address 0x00b36154'.
Но все же ошибка может сказать о ином...
Кстати, может есть какой нибудь ресурс о этих адресах вечно сними сталкиваюсь)
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
29.12.2011, 23:46 4
а на код можно посмотреть?
0
7 / 7 / 4
Регистрация: 28.08.2010
Сообщений: 174
29.12.2011, 23:51  [ТС] 5
Вот код всей формы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
type strings=array[0..65535]of string;
     anbdTypeAccess=(all, limited);
{procedure ArrayInFile(row:strings; address:string); stdcall;
external 'basis.dll';
}
procedure ArrayInFile(row:strings; address:string);
var i:word;
    f:TextFile;
begin
 AssignFile(f, address); Rewrite(f);
 for i := 0 to 65535 do begin writeln(f, row[i]); end;
 CloseFile(f);
end;
{procedure FileInArray(address:string;var row:strings); stdcall;
external 'basis.dll';
}
procedure FileInArray(address:string;var row:strings);
var i:word;
    f:TextFile;
begin
 AssignFile(f, address); Reset(f);
 for i := 0 to 65535 do readln(f, row[i]);
 CloseFile(f);
end;
{function LengthArray(row:strings):word; stdcall;
external 'basis.dll';
}
function LengthArray(row:strings):word;
var i:word;
begin i:=0;
 while row[i]<>'' do i:=i+1;
 result:=i-1;
end;
function puzzle(poin:char; str:string):string; stdcall;
external 'enciphering.dll';
function AcToStr(val:anbdTypeAccess):string;
begin
 case val of
  all:result:='all';
  limited:result:='limited';
  else result:=':ERROR:02';
 end;
end;
procedure CrFile(address, title, discription, author:string);
const soEn='!'; soOCon='['; soCCon=']'; soPr='='; soAmp='&';
      Bs='BASE'; Vl='VERSIONLANG'; En='ENCIPHERING'; Pr='PROPERTIES';
      Tit='TITLE'; Ac='ACCESS'; Cr='CREATION'; Up='UPDATE'; Ds='DISCRIPTION';
      Au='AUTHOR';
var dt:string;
    row:strings;
begin
 dt:=DateToStr(now)+'-'+TimeToStr(time);
 row[0]:=soEn+Bs+soPr+'anbd'+soAmp+Vl+soPr+'1.0'+soAmp+En+soPr+'false';
 row[1]:=soOCon+Pr;
 row[2]:=Tit+soPr;
 if title='none' then row[2]:=row[2]+'noname' else row[2]:=row[2]+title;
 row[3]:=Ac+soPr+AcToStr(all);
 row[4]:=Cr+soPr+dt;
 row[5]:=Up+soPr+dt;
 row[6]:=Au+soPr;
 if author='none' then row[6]:=row[6]+'unknown' else row[6]:=row[6]+author;
 if discription='none' then row[7]:=Pr+soCCon else begin row[7]:=Ds+soPr+discription; row[8]:=Pr+soCCon; end;
 ArrayInFile(row, address);
end;
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i, ln:word;
    row:strings;
    address:string;
begin
 address:='c:\temp\00004.txt';
 CrFile(address, 'my first baseData', 'Khayzenberg');
 FileInArray(address, row); ln:=LengthArray(row);
 for i := 0 to ln do memo1.Lines.Add(row[i]);
end;
 
end.
P. S. Прошу сильно не придраться к коду так как я простой любитель! На тему того что он не оптимальный и так далее...
0
7 / 7 / 4
Регистрация: 28.08.2010
Сообщений: 174
30.12.2011, 22:56  [ТС] 6
Так вот, над этим вопросом я думаю до сих пор....
И вот есть уже прогресс....
Ситуация состоит в следующем.....
Эти библиотеки, на самом деле, должны находится в динамической библиотеке....
И только лишь в том случае когда они в динамической библиотеке вылетает ошибка....
а когда в самом модуле нет никакой ошибки вот немного отредактировал код (Здесь представлен весь модуль в этом случае нет ошибок, а вот все функции и процедуры которые до {$R *.dfm} должны находиться в динамической библиотеке):
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
type strings=array[0..65535]of string;
     anbdTypeAccess=(all, limited);
procedure ArrayInFile(const row:strings; address:string);
var i:word;
    f:TextFile;
begin
 AssignFile(f, address); Rewrite(f);
 for i := 0 to 65535 do begin writeln(f, row[i]); end;
 CloseFile(f);
end;
procedure FileInArray(const address:string; var row:strings);
var i:word;
    f:TextFile;
begin
 AssignFile(f, address); Reset(f);
 for i := 0 to 65535 do readln(f, row[i]);
 CloseFile(f);
end;
function LengthArray(const row:strings):word;
var i:word;
begin i:=0;
 while row[i]<>'' do i:=i+1;
 result:=i;
end;
function puzzle(const poin:char; str:string):string;
var i, ln:byte;
begin
 ln:=length(str); SetLength(result, ln);
 if poin='>' then begin
  for i := 1 to ln do begin
   case str[i] of
    'Q':result[i]:='U'; 'W':result[i]:='G'; 'E':result[i]:='Z'; 'R':result[i]:='B';
    'T':result[i]:='Q'; 'Y':result[i]:='O'; 'U':result[i]:='J'; 'I':result[i]:='C';
    'O':result[i]:='M'; 'P':result[i]:='A'; 'A':result[i]:='D'; 'S':result[i]:='K';
    'D':result[i]:='E'; 'F':result[i]:='W'; 'G':result[i]:='P'; 'H':result[i]:='L';
    'J':result[i]:='S'; 'K':result[i]:='T'; 'L':result[i]:='F'; 'Z':result[i]:='X';
    'X':result[i]:='V'; 'C':result[i]:='I'; 'V':result[i]:='N'; 'B':result[i]:='R';
    'N':result[i]:='H'; 'M':result[i]:='Y'; 'q':result[i]:='t'; 'w':result[i]:='e';
    'e':result[i]:='f'; 'r':result[i]:='w'; 't':result[i]:='o'; 'y':result[i]:='c';
    'u':result[i]:='g'; 'i':result[i]:='l'; 'o':result[i]:='p'; 'p':result[i]:='s';
    'a':result[i]:='j'; 's':result[i]:='v'; 'd':result[i]:='m'; 'f':result[i]:='h';
    'g':result[i]:='z'; 'h':result[i]:='q'; 'j':result[i]:='u'; 'k':result[i]:='x';
    'l':result[i]:='r'; 'z':result[i]:='k'; 'x':result[i]:='a'; 'c':result[i]:='y';
    'v':result[i]:='i'; 'b':result[i]:='b'; 'n':result[i]:='d'; 'm':result[i]:='n';
    '0':result[i]:='2'; '1':result[i]:='6'; '2':result[i]:='8'; '3':result[i]:='0';
    '4':result[i]:='4'; '5':result[i]:='3'; '6':result[i]:='7'; '7':result[i]:='1';
    '8':result[i]:='9'; '9':result[i]:='5'; '@':result[i]:='&'; '#':result[i]:='$';
    '$':result[i]:='~'; '%':result[i]:='+'; '&':result[i]:='@'; '?':result[i]:='#';
    '!':result[i]:='?'; '~':result[i]:='-'; '+':result[i]:='%'; '-':result[i]:='!';
   end;
  end;
 end else
 if poin='<' then begin
  for i := 1 to ln do begin
   case str[i] of
    'U':result[i]:='Q'; 'G':result[i]:='W'; 'Z':result[i]:='E'; 'B':result[i]:='R';
    'Q':result[i]:='T'; 'O':result[i]:='Y'; 'J':result[i]:='U'; 'C':result[i]:='I';
    'M':result[i]:='O'; 'A':result[i]:='P'; 'D':result[i]:='A'; 'K':result[i]:='S';
    'E':result[i]:='D'; 'W':result[i]:='F'; 'P':result[i]:='G'; 'L':result[i]:='H';
    'S':result[i]:='J'; 'T':result[i]:='K'; 'F':result[i]:='L'; 'X':result[i]:='Z';
    'V':result[i]:='X'; 'I':result[i]:='C'; 'N':result[i]:='V'; 'R':result[i]:='B';
    'H':result[i]:='N'; 'Y':result[i]:='M'; 't':result[i]:='q'; 'e':result[i]:='w';
    'f':result[i]:='e'; 'w':result[i]:='r'; 'o':result[i]:='t'; 'c':result[i]:='y';
    'g':result[i]:='u'; 'l':result[i]:='i'; 'p':result[i]:='o'; 's':result[i]:='p';
    'j':result[i]:='a'; 'v':result[i]:='s'; 'm':result[i]:='d'; 'h':result[i]:='f';
    'z':result[i]:='g'; 'q':result[i]:='h'; 'u':result[i]:='j'; 'x':result[i]:='k';
    'r':result[i]:='l'; 'k':result[i]:='z'; 'a':result[i]:='x'; 'y':result[i]:='c';
    'i':result[i]:='v'; 'b':result[i]:='b'; 'd':result[i]:='n'; 'n':result[i]:='m';
    '2':result[i]:='0'; '6':result[i]:='1'; '8':result[i]:='2'; '0':result[i]:='3';
    '4':result[i]:='4'; '3':result[i]:='5'; '7':result[i]:='6'; '1':result[i]:='7';
    '9':result[i]:='8'; '5':result[i]:='9'; '&':result[i]:='@'; '$':result[i]:='#';
    '~':result[i]:='$'; '+':result[i]:='%'; '@':result[i]:='&'; '#':result[i]:='?';
    '?':result[i]:='!'; '-':result[i]:='~'; '%':result[i]:='+'; '!':result[i]:='-';
   end;
  end;
 end else result:=':ERROR:01';
end;
function AcToStr(const tp:anbdTypeAccess):string;
begin
 case tp of
  all:result:='all';
  limited:result:='limited';
  else result:=':ERROR:02';
 end;
end;
function BooleanToStr(const tp:boolean):string;
begin
 case tp of
  true:result:='true';
  false:result:='false';
  else result:=':ERROR:02';
 end;
end;
function CrFile(const address, title, discription, author:string):boolean;
const soEn='!'; soOCon='['; soCCon=']'; soPr='='; soAmp='&';
      Bs='BASE'; Vl='VERSIONLANG'; En='ENCIPHERING'; Pr='PROPERTIES';
      Tit='TITLE'; Ac='ACCESS'; Cr='CREATION'; Up='UPDATE'; Ds='DISCRIPTION';
      Au='AUTHOR';
var dt:string;
    i, j, ln:word;
    row, tmp:strings;
begin
 dt:=DateToStr(now)+'-'+TimeToStr(time);
 row[0]:=soEn+Bs+soPr+'anbd'+soAmp+Vl+soPr+'1.0'+soAmp+En+soPr+'false';
 row[1]:=soOCon+Pr;
 row[2]:=Tit+soPr;
 if title='none' then row[2]:=row[2]+'noname' else row[2]:=row[2]+title;
 row[3]:=Ac+soPr+AcToStr(all);
 row[4]:=Cr+soPr+dt;
 row[5]:=Up+soPr+dt;
 row[6]:=Au+soPr;
 if author='none' then row[6]:=row[6]+'unknown' else row[6]:=row[6]+author;
 if discription='none' then row[7]:=Pr+soCCon else begin row[7]:=Ds+soPr+discription; row[8]:=Pr+soCCon; end;
 ArrayInFile(row, address); ln:=LengthArray(row); FileInArray(address, tmp); j:=0;
 for i := 0 to ln-1 do if row[i]=tmp[i] then j:=j+1;
 if ln=j then result:=true else result:=false;
end;
 
 
 
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i, ln:word;
    rs:boolean;
    row:strings;
begin
 rs:=CrFile('c:\temp\00010.txt', 'data', 'none', 'Khayzenberg');
 FileInArray('c:\temp\00010.txt', row); ln:=LengthArray(row);
 if rs=true then for i := 0 to ln-1 do memo1.Lines.Add(row[i])
 else edit1.Text:='Во время исполнения произошла ошибка! Пересмотрите код.';
end;
 
end.
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
01.01.2012, 16:56 7
прекрасно работает программа, т.е всмысле я не знаю что она делает, но разбил на 2 части на длл и на главную программу ни ошибок ничего, вот выкладываю длл и саму программу

длл
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
library Project1;
 
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss die erste
  Unit in der USES-Klausel Ihrer Bibliothek UND in der USES-Klausel Ihres Projekts
  (wдhlen Sie 'Projekt-Quelltext anzeigen') sein, wenn Ihre DLL Prozeduren oder Funktionen
  exportiert, die Strings als Parameter oder Funktionsergebnisse ьbergeben. Dies
  gilt fьr alle Strings, die an oder von Ihrer DLL ьbergeben werden, auch fьr solche,
  die in Records und Klassen verschachtelt sind. ShareMem ist die Interface-Unit zur
  gemeinsamen BORLNDMM.DLL-Speicherverwaltung, die zusammen mit Ihrer DLL
  weitergegeben werden muss. Ьbergeben Sie String-Informationen mit PChar- oder ShortString-Parametern, um die Verwendung von BORLNDMM.DLL zu vermeiden.
 }
 
uses
  SysUtils,
  Classes;
 
{$R *.res}
type strings=array[0..65535]of string;
     anbdTypeAccess=(all, limited);
procedure ArrayInFile(const row:strings; address:string);
var i:word;
    f:TextFile;
begin
 AssignFile(f, address); Rewrite(f);
 for i := 0 to 65535 do begin writeln(f, row[i]); end;
 CloseFile(f);
end;
procedure FileInArray(const address:string; var row:strings);
var i:word;
    f:TextFile;
begin
 AssignFile(f, address); Reset(f);
 for i := 0 to 65535 do readln(f, row[i]);
 CloseFile(f);
end;
function LengthArray(const row:strings):word;
var i:word;
begin i:=0;
 while row[i]<>'' do i:=i+1;
 result:=i;
end;
function puzzle(const poin:char; str:string):string;
var i, ln:byte;
begin
 ln:=length(str); SetLength(result, ln);
 if poin='>' then begin
  for i := 1 to ln do begin
   case str[i] of
    'Q':result[i]:='U'; 'W':result[i]:='G'; 'E':result[i]:='Z'; 'R':result[i]:='B';
    'T':result[i]:='Q'; 'Y':result[i]:='O'; 'U':result[i]:='J'; 'I':result[i]:='C';
    'O':result[i]:='M'; 'P':result[i]:='A'; 'A':result[i]:='D'; 'S':result[i]:='K';
    'D':result[i]:='E'; 'F':result[i]:='W'; 'G':result[i]:='P'; 'H':result[i]:='L';
    'J':result[i]:='S'; 'K':result[i]:='T'; 'L':result[i]:='F'; 'Z':result[i]:='X';
    'X':result[i]:='V'; 'C':result[i]:='I'; 'V':result[i]:='N'; 'B':result[i]:='R';
    'N':result[i]:='H'; 'M':result[i]:='Y'; 'q':result[i]:='t'; 'w':result[i]:='e';
    'e':result[i]:='f'; 'r':result[i]:='w'; 't':result[i]:='o'; 'y':result[i]:='c';
    'u':result[i]:='g'; 'i':result[i]:='l'; 'o':result[i]:='p'; 'p':result[i]:='s';
    'a':result[i]:='j'; 's':result[i]:='v'; 'd':result[i]:='m'; 'f':result[i]:='h';
    'g':result[i]:='z'; 'h':result[i]:='q'; 'j':result[i]:='u'; 'k':result[i]:='x';
    'l':result[i]:='r'; 'z':result[i]:='k'; 'x':result[i]:='a'; 'c':result[i]:='y';
    'v':result[i]:='i'; 'b':result[i]:='b'; 'n':result[i]:='d'; 'm':result[i]:='n';
    '0':result[i]:='2'; '1':result[i]:='6'; '2':result[i]:='8'; '3':result[i]:='0';
    '4':result[i]:='4'; '5':result[i]:='3'; '6':result[i]:='7'; '7':result[i]:='1';
    '8':result[i]:='9'; '9':result[i]:='5'; '@':result[i]:='&'; '#':result[i]:='$';
    '$':result[i]:='~'; '%':result[i]:='+'; '&':result[i]:='@'; '?':result[i]:='#';
    '!':result[i]:='?'; '~':result[i]:='-'; '+':result[i]:='%'; '-':result[i]:='!';
   end;
  end;
 end else
 if poin='<' then begin
  for i := 1 to ln do begin
   case str[i] of
    'U':result[i]:='Q'; 'G':result[i]:='W'; 'Z':result[i]:='E'; 'B':result[i]:='R';
    'Q':result[i]:='T'; 'O':result[i]:='Y'; 'J':result[i]:='U'; 'C':result[i]:='I';
    'M':result[i]:='O'; 'A':result[i]:='P'; 'D':result[i]:='A'; 'K':result[i]:='S';
    'E':result[i]:='D'; 'W':result[i]:='F'; 'P':result[i]:='G'; 'L':result[i]:='H';
    'S':result[i]:='J'; 'T':result[i]:='K'; 'F':result[i]:='L'; 'X':result[i]:='Z';
    'V':result[i]:='X'; 'I':result[i]:='C'; 'N':result[i]:='V'; 'R':result[i]:='B';
    'H':result[i]:='N'; 'Y':result[i]:='M'; 't':result[i]:='q'; 'e':result[i]:='w';
    'f':result[i]:='e'; 'w':result[i]:='r'; 'o':result[i]:='t'; 'c':result[i]:='y';
    'g':result[i]:='u'; 'l':result[i]:='i'; 'p':result[i]:='o'; 's':result[i]:='p';
    'j':result[i]:='a'; 'v':result[i]:='s'; 'm':result[i]:='d'; 'h':result[i]:='f';
    'z':result[i]:='g'; 'q':result[i]:='h'; 'u':result[i]:='j'; 'x':result[i]:='k';
    'r':result[i]:='l'; 'k':result[i]:='z'; 'a':result[i]:='x'; 'y':result[i]:='c';
    'i':result[i]:='v'; 'b':result[i]:='b'; 'd':result[i]:='n'; 'n':result[i]:='m';
    '2':result[i]:='0'; '6':result[i]:='1'; '8':result[i]:='2'; '0':result[i]:='3';
    '4':result[i]:='4'; '3':result[i]:='5'; '7':result[i]:='6'; '1':result[i]:='7';
    '9':result[i]:='8'; '5':result[i]:='9'; '&':result[i]:='@'; '$':result[i]:='#';
    '~':result[i]:='$'; '+':result[i]:='%'; '@':result[i]:='&'; '#':result[i]:='?';
    '?':result[i]:='!'; '-':result[i]:='~'; '%':result[i]:='+'; '!':result[i]:='-';
   end;
  end;
 end else result:=':ERROR:01';
end;
function AcToStr(const tp:anbdTypeAccess):string;
begin
 case tp of
  all:result:='all';
  limited:result:='limited';
  else result:=':ERROR:02';
 end;
end;
function BooleanToStr(const tp:boolean):string;
begin
 case tp of
  true:result:='true';
  false:result:='false';
  else result:=':ERROR:02';
 end;
end;
function CrFile(const address, title, discription, author:string):boolean;
const soEn='!'; soOCon='['; soCCon=']'; soPr='='; soAmp='&';
      Bs='BASE'; Vl='VERSIONLANG'; En='ENCIPHERING'; Pr='PROPERTIES';
      Tit='TITLE'; Ac='ACCESS'; Cr='CREATION'; Up='UPDATE'; Ds='DISCRIPTION';
      Au='AUTHOR';
var dt:string;
    i, j, ln:word;
    row, tmp:strings;
begin
 dt:=DateToStr(now)+'-'+TimeToStr(time);
 row[0]:=soEn+Bs+soPr+'anbd'+soAmp+Vl+soPr+'1.0'+soAmp+En+soPr+'false';
 row[1]:=soOCon+Pr;
 row[2]:=Tit+soPr;
 if title='none' then row[2]:=row[2]+'noname' else row[2]:=row[2]+title;
 row[3]:=Ac+soPr+AcToStr(all);
 row[4]:=Cr+soPr+dt;
 row[5]:=Up+soPr+dt;
 row[6]:=Au+soPr;
 if author='none' then row[6]:=row[6]+'unknown' else row[6]:=row[6]+author;
 if discription='none' then row[7]:=Pr+soCCon else begin row[7]:=Ds+soPr+discription; row[8]:=Pr+soCCon; end;
 ArrayInFile(row, address); ln:=LengthArray(row); FileInArray(address, tmp); j:=0;
 for i := 0 to ln-1 do if row[i]=tmp[i] then j:=j+1;
 if ln=j then result:=true else result:=false;
end;
 
exports
  ArrayInFile,
  FileInArray,
  LengthArray,
  puzzle,
  AcToStr,
  CrFile;
begin
end.
программа
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
unit Unit1;
 
interface
 
uses
  Messages, SysUtils, Variants, Classes, Graphics, Forms, Dialogs, StdCtrls,
  Controls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 type strings=array[0..65535]of string;
     anbdTypeAccess=(all, limited);
{$R *.dfm}
 
function CrFile(const address, title, discription, author:string):boolean; external 'dll.dll';
procedure FileInArray(const address:string; var row:strings); external 'dll.dll';
function LengthArray(const row:strings):word; external 'dll.dll';
 
procedure TForm1.Button1Click(Sender: TObject);
var i, ln:word;
    rs:boolean;
    row:strings;
begin
 rs:=CrFile('c:\temp\00010.txt', 'data', 'none', 'Khayzenberg');
 FileInArray('c:\temp\00010.txt', row); ln:=LengthArray(row);
 if rs=true then for i := 0 to ln-1 do memo1.Lines.Add(row[i])
 else edit1.Text:='Во время исполнения произошла ошибка! Пересмотрите код.';
end;
 
end.
1
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
01.01.2012, 18:49 8
Цитата Сообщение от Khayzenberg Посмотреть сообщение
Ситуация состоит в следующем.....
Эти библиотеки, на самом деле, должны находится в динамической библиотеке....
Управление памятью в коде вызывающей программы и в коде DLL выполняют разные менеджеры памяти. Поэтому, если, например, строка создана в вызывающей программе, затем передана в функцию DLL и в этой функции изменена длина этой строки - в этом случае управление памятью будет нарушено. Т. к., память для строки выделил менеджер памяти вызывающей программы. И он ничего не знает о том, что длина строки уже стала другой. Это в конечном итоге, как минимум, при завершении программы, приведёт к ошибке доступа к памяти.
Чтобы решить эту проблему можно пойти разными путями. Можно использовать один и тот же менеджер памяти. Сведения об этом помещаются автоматически в виде комментария в каждый новый проект DLL:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
library Project1;
 
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
 
uses
  SysUtils,
  Classes;
 
{$R *.res}
 
begin
end.
Здесь пишется о том, что для того, чтобы установить общий менеджер памяти для вызывающей программы и DLL, следует во все модули вызывающей программы (в том числе и в главный модуль проекта *.dpr) и во все модули проекта DLL поместить в раздел uses модуль ShareMem. Причём, этот модуль в каждом разделе uses должен идти обязательно первым.
Вот так и следует поступить в коде, который обсуждается в этой теме.
---
Когда в качестве параметров в функциях DLL используются специфические для Delphi динамические типы с автоматическим управлением (автоматический сборщик мусора) - это длинные строки, динамические массивы и варианты - минус этого подхода в том, что такую DLL будет затруднительно (или вовсе невозможно) использовать в программах, написанных на других языках.
---
Есть другие способы для решения проблем с управлением памятью. Например, можно договориться о том, что для выделения/освобождения памяти для данных, передаваемых в DLL, будут использоваться только функции этой DLL. Т. е., надо написать несколько функций в DLL, которые будут выделять/освобождать память, например, для длинных строк и динамических массивов.
---
В обсуждаемой задаче, я думаю, надо применить способ с установкой общего менеджера памяти - ShareMem. - Это описано выше.
---
Если используется модуль ShareMem и предполагается, что программа будет использоваться на машинах, где Delphi не установлен, тогда следует вместе с программой поставлять библиотеку BORLNDMM.DLL. В этой библиотеке, как раз, расположен API менеджера ShareMem. Библиотека BORLNDMM.DLL расположена в папке: $(DELPHI)\Bin.
Для уверенной работы следует зарегистрировать эту библиотеку в системе с помощью командного файла:
Файл RegDll.bat:
Код
RegSvr32.exe BORLNDMM.DLL
Этот файл следует запустить из той же папки, где расположена библиотека BORLNDMM.DLL.
Если понадобится убрать с компьютера приложение и эта библиотека больше там не понадобится, тогда следует сделать следующее:
1. Удалить регистрацию библиотеки с помощью запуска командного файла:
Файл UnRegDll.bat:
Код
RegSvr32.exe /u BORLNDMM.DLL
2. Удалить сам файл библиотеки.
2
7 / 7 / 4
Регистрация: 28.08.2010
Сообщений: 174
01.01.2012, 21:18  [ТС] 9
Mawrat, совершенно прав теперь все работает!!!!!!! Наконец-то спасибо вам.
Arcor, и вас я благодарю за труды!
0
01.01.2012, 21:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.01.2012, 21:18
Помогаю со студенческими работами здесь

Ошибка при отключении dep
здравствуйте. пытаюсь отключить dep командой bcdedit.exe /set {current} nx AlwaysOff но получаю...

Ошибка 0x0000007B при отключении привода
Сдохла мать на компе, 478-ой socket, поменял мать, поставил на 775-ом, DDR II, PCI-Express под...

Ошибка при отключении Build with runtime packages
Создал проект. При запуске с Build with runtime packages флажок установлен все прекрасно работает....

Клиент/сервер Socket. Ошибка при отключении
Всем привет. Дело такое. У меня появилась незадача. У меня рабочий чат клиент/сервер. Дело в том,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru