Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Access violation в Indy

Добрый день!

Что-то не догоняю как возможен "Access violation at address 00000000. Read of address 00000000" в следующем коде:

Стек:
(00001574){MonitorOutr.dll} [062E2574] System.SysFreeMem (Line 1139, "GETMEM.INC" + 87) + $E
(00001845){MonitorOutr.dll} [062E2845] System.@FreeMem (Line 2477, "system.pas" + 10) + $0
(00003BE0){MonitorOutr.dll} [062E4BE0] System.@LStrClr (Line 11327, "system.pas" + 11) + $0
(003AA86D){MonitorOutr.dll} [0668B86D] IdSSLOpenSSLHeaders.LoadFunctionCLib (Line 4690, "IdSSLOpenSSLHeaders.pas" + 2) + $26
(003AAE11){MonitorOutr.dll} [0668BE11] IdSSLOpenSSLHeaders.Load (Line 4830, "IdSSLOpenSSLHeaders.pas" + 123) + $5
................
(003A7304){MonitorOutr.dll} [06688304] IdHTTP.TIdCustomHTTP.Get (Line 767, "IdHttp.pas" + 1) + $E
(003AFF97){MonitorOutr.dll} [06690F97] ip2City.HttpPost (Line 209, "ip2City.pas" + 28) + $7


4687 function LoadFunctionCLib(FceName:String):Pointer;
4688 begin
4689  FceName := FceName+#0;
4690  Result := GetProcAddress(hIdCrypto, @FceName[1]); <<<-------- Здесь Access violation???
4691 //  if (Result = nil) then ShowMessage('Error loading: ' + FceName);  {Do not localize}
4692 end;

FceName - Константа fn_ERR_free_strings = 'ERR_free_strings'
Indy - 10.0.52
Ответ: GunSmoker
Ваше последнее предположение оказалось верным:

Function Load:Boolean;
begin
  result := True;
  {$IFDEF LINUX}
  // Workaround that is requered under Linux
  if hIdCrypto = 0 then hIdCrypto := HMODULE(dlopen(SSLCLIB_DLL_name, RTLD_GLOBAL));
  If hIdSSL = 0 Then hIdSSL := HMODULE(dlopen(SSL_DLL_name, RTLD_GLOBAL));
  If hIdIndySSL = 0 Then hIdIndySSL := LoadLibrary(SSL_Indy_DLL_name) else exit;
  {$ELSE}
  if hIdCrypto = 0 then hIdCrypto := LoadLibrary(SSLCLIB_DLL_name);
  If hIdSSL = 0 Then hIdSSL := LoadLibrary(SSL_DLL_name) else exit;
  // If hIdIndySSL = 0 Then hIdIndySSL := LoadLibrary(SSL_Indy_DLL_name);
  {$ENDIF}
............................
  @IdSslLoadErrorStrings := LoadFunction(fn_SSL_load_error_strings);
............................
end

function LoadOpenSLLibrary: Boolean;
begin
............................
  IdSslLoadErrorStrings; <-- Вылетаем здесь так как IdSslLoadErrorStrings = nil
............................
end;

метод трассировки стека - RAW, с кучей ложно-положительных вызовов

initialization
//--------------------------------------------------------------------------------------------------
// JclDebug initialization and finalization for VCL application
//--------------------------------------------------------------------------------------------------
  // Enable raw mode (default mode uses stack frames which aren't always generated by the compiler)
  Include(JclStackTrackingOptions, stRawMode);
  // Disable stack tracking in dynamically loaded modules (it makes stack tracking code a bit faster)
  Include(JclStackTrackingOptions, stStaticModuleList);

  // Initialize Exception tracking
  JclStartExceptionTracking;


Большое спасибо за помощь. Ошибку исправил добавив функцию проверяющую возможность загрузки ssleay32.dll и libeay32.dll библиотек, и вслучае их отсутствия, принудительной загрузки библиотек с корпоративного ресурса.
Вопрос: Ошибка "Access violation at address."

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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button15: TButton;
    Button16: TButton;
    Button17: TButton;
    Button18: TButton;
    Button19: TButton;
    Button20: TButton;
    Button21: TButton;
    Button22: TButton;
    Button23: TButton;
    Button24: TButton;
    Button14: TButton;
    Button28: TButton;
    Button29: TButton;
    Button30: TButton;
    Button31: TButton;
    Button32: TButton;
    Button25: TButton;
    Button26: TButton;
    Button27: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure BitBtn1Click[FLEFT][/FLEFT](Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 var
i, pik, a, b: integer;
 
function rando(x: integer): integer;
begin
randomize;
  result := random(32);
end;
 
 
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var NumberBtn: integer;
begin
Bitbtn1.Visible:=false;
 
button1.Visible:=true;
button10.Visible:=true;
button11.Visible:=true;
button12.Visible:=true;
button13.Visible:=true;
button14.Visible:=true;
button15.Visible:=true;
button16.Visible:=true;
button17.Visible:=true;
button18.Visible:=true;
button19.Visible:=true;
button2.Visible:=true;
button20.Visible:=true;
button21.Visible:=true;
button22.Visible:=true;
button23.Visible:=true;
button24.Visible:=true;
button28.Visible:=true;
button29.Visible:=true;
button3.Visible:=true;
button30.Visible:=true;
button31.Visible:=true;
button32.Visible:=true;
button25.Visible:=true;
button26.Visible:=true;
button27.Visible:=true;
button4.Visible:=true;
button5.Visible:=true;
button6.Visible:=true;
button7.Visible:=true;
button8.Visible:=true;
button9.Visible:=true;
NumberBtn:=rando(a);
(*Name:='Button'+ inttostr(NumberBtn);
TButton(FindComponent(Name)).Font.size:=15;
label2.Caption:=inttostr(strtoint(label2.Caption)+1);
  *)
end;
 
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
edit1.Text := inttostr(key);
label1.Caption := edit1.Text;
//if (strtoint(label1.Caption)= 70) then button18.default := true else button18.Default := false;
 
 
end;
 
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var a:integer;
begin
if (Ord(Key)=81) then button1.default := true else button1.Default := false;
if (Ord(Key)=85) then button10.default := true else button10.Default := false;
if (Ord(Key)=73) then button11.default := true else button11.Default := false;
if (Ord(Key)=79) then button12.default := true else button12.Default := false;
if (Ord(Key)=65) then button13.default := true else button13.Default := false;
if (Ord(Key)=90) then button14.default := true else button14.Default := false;
if (Ord(Key)=222) then button15.default := true else button15.Default := false;
if (Ord(Key)=186) then button16.default := true else button16.Default := false;
if (Ord(Key)=83) then button17.default := true else button17.Default := false;
if (Ord(Key)=68) then button18.default := true else button18.Default := false;
if (Ord(Key)=70) then button19.default := true else button19.Default := false;
if (Ord(Key)=221) then button2.default := true else button2.Default := false;
if (Ord(Key)=71) then button20.default := true else button20.Default := false;
if (Ord(Key)=72) then button21.default := true else button21.Default := false;
if (Ord(Key)=74) then button22.default := true else button22.Default := false;
if (Ord(Key)=75) then button23.default := true else button23.Default := false;
if (Ord(Key)=76) then button24.default := true else button24.Default := false;
if (Ord(Key)=88) then button28.default := true else button28.Default := false;
if (Ord(Key)=67) then button29.default := true else button29.Default := false;
if (Ord(Key)=219) then button3.default := true else button3.Default := false;
if (Ord(Key)=86) then button30.default := true else button30.Default := false;
if (Ord(Key)=66) then button31.default := true else button31.Default := false;
if (Ord(Key)=78) then button32.default := true else button32.Default := false;
if (Ord(Key)=77) then button25.default := true else button25.Default := false;
if (Ord(Key)=188) then button26.default := true else button26.Default := false;
if (Ord(Key)=190) then button27.default := true else button27.Default := false;
if (Ord(Key)=80) then button4.default := true else button4.Default := false;
if (Ord(Key)=87) then button5.default := true else button5.Default := false;
if (Ord(Key)=69) then button6.default := true else button6.Default := false;
if (Ord(Key)=82) then button7.default := true else button7.Default := false;
if (Ord(Key)=84) then button8.default := true else button8.Default := false;
if (Ord(Key)=89) then button9.default := true else button9.Default := false;
a:=0;
label1.caption:=inttostr(rando(a));
 
 
end;
 
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var NumberBtn,a:integer;
begin
 
//while (strtoint(label2.caption)>0) do begin
  if (strtoint(label2.caption)>0) and
  (Tbutton(FindComponent(name)).default = true) and
  (Tbutton(FindComponent(name)).font.size = 15) then begin
 Tbutton(FindComponent(name)).font.size := 8;
 label2.Caption:=inttostr(strtoint(label2.Caption)-1);
 label4.Caption:=inttostr(strtoint(label4.Caption)+1) end; (*else
 if (Tbutton(FindComponent(name)).default = false) then
 label2.Caption:='1';
                                                           *)
//end;
 
if (strtoint(label2.caption)=0) then  begin
NumberBtn:=rando(a);
if (NumberBtn<>strtoint(label3.Caption)) then begin
Name:='Button'+ inttostr(NumberBtn);
TButton(FindComponent(Name)).Font.size:=15;
label2.Caption:=inttostr(strtoint(label2.Caption)+1);
label3.Caption:=inttostr(NumberBtn);
end else if (NumberBtn=strtoint(label3.Caption)) then begin
  NumberBtn:=rando(a);
Name:='Button'+ inttostr(NumberBtn);
TButton(FindComponent(Name)).Font.size:=15;
label2.Caption:=inttostr(strtoint(label2.Caption)+1);
label3.Caption:=inttostr(NumberBtn);
  end;
 end;
end;
 
 
 
 
 
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var numberbtn:integer;
begin
if (Ord(Key)=81) then button1.Default := false;
if (Ord(Key)=85) then button10.Default := false;
if (Ord(Key)=73) then button11.Default := false;
if (Ord(Key)=79) then button12.Default := false;
if (Ord(Key)=65) then button13.Default := false;
if (Ord(Key)=90) then button14.Default := false;
if (Ord(Key)=222) then button15.Default := false;
if (Ord(Key)=186) then button16.Default := false;
if (Ord(Key)=83) then button17.Default := false;
if (Ord(Key)=68) then button18.Default := false;
if (Ord(Key)=70) then button19.Default := false;
if (Ord(Key)=221) then button2.Default := false;
if (Ord(Key)=71) then button20.Default := false;
if (Ord(Key)=72) then button21.Default := false;
if (Ord(Key)=74) then button22.Default := false;
if (Ord(Key)=75) then button23.Default := false;
if (Ord(Key)=76) then button24.Default := false;
if (Ord(Key)=88) then button28.Default := false;
if (Ord(Key)=67) then button29.Default := false;
if (Ord(Key)=219) then button3.Default := false;
if (Ord(Key)=86) then button30.Default := false;
if (Ord(Key)=66) then button31.Default := false;
if (Ord(Key)=78) then button32.Default := false;
if (Ord(Key)=77) then button25.Default := false;
if (Ord(Key)=188) then button26.Default := false;
if (Ord(Key)=190) then button27.Default := false;
if (Ord(Key)=80) then button4.Default := false;
if (Ord(Key)=87) then button5.Default := false;
if (Ord(Key)=69) then button6.Default := false;
if (Ord(Key)=82) then button7.Default := false;
if (Ord(Key)=84) then button8.Default := false;
if (Ord(Key)=89) then button9.Default := false;
 
end;
 
 
end.
Помогите, пожалуйста, я пишу тренажер. Цель программы: при нажатии на клавишу, которая была выбрана рандомом , шрифт(то, что написано в Caption), вместо 15, становился 8 и при этом выбиралась новая клавиша и у неё менялся шрифт на 15... Если нажата клавиша, которая не имеет на данный момент шрифт 15, всё оставалось как прежде, пока не будет нажата нужная нам клавиша.... Всё реализовал, но иногда при выполнении выскакивает ошибка (после нажатия клавиши): "Access violation at address 005CEB83 in module 'Project1.exe'. Read of address 00000074."
Ответ: Я просил мне написать по поводу ошибки, точнее, из-за чего она появляется, а не писать мне новую программу....
Сообщение от openclo
Всё реализовал, но иногда при выполнении выскакивает ошибка (после нажатия клавиши): "Access violation at address 005CEB83 in module 'Project1.exe'. Read of address 00000074."
Вопрос: Access Violation (Read of Adress 000000) при подключении ClientDataSet

Здравствуйте, уважаемые форумчане! Столкнулся с такой проблемой: писал программу по обработке строковых данных. Но не суть. Структура такая: ClientDataSet подключается к xml базе. Далее ClientDataSet->DataSource->DBGrid
Т.е. при запуске программы должно происходить подключение в этой самой базе. Код при запуске
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.TimerTimer(Sender: TObject);
 begin
 if clientdataset1.Active=false then
 begin
   try
  clientdataset1.FileName:='C:\Program Files\DirectHelperSoft\base.xml';
   clientdataset1.Active:=true;
   datasource1.Enabled:=true;
   dbgrid1.Enabled:=true;
 with dbgrid1 do
begin
   columns[3].Visible:=false;
   columns[0].title.caption:='Ключ';
   columns[1].title.caption:='Заголовок';
   columns[2].title.caption:='Объявление';
   columns[0].title.Alignment:=taCenter;
   columns[1].title.Alignment:=taCenter;
   columns[2].title.Alignment:=taCenter;
   columns[0].Width:=2*(width div 10);
   columns[1].Width:=2*(width div 10);
   columns[2].Width:=6*(width div 10)-trunc(0.3*(width div 10));
end;
Сначала этот код висел на обработчике formCreate, но это было не правильно. Поэтому повесил на таймер. ЕСТЬ ОДНА ВАЖНАЯ ДЕТАЛЬ: данная проблема возникает на любом другом компьютере, на моем, где установлена среда разработки все работает! Примечание: на других компьютерах создавал файл C:\Program Files\DirectHelperSoft\base.xml . Даже библиотеку Midas перекидывал со своего компа на другие. Эффекта ноль.
Пишет Access Violation in module XXXX project1. Read of adress 0000000
Ответ:
Сообщение от Александр_absub
как я понимаю таймер включается сразу после загрузки формы. Я просто изначально в object inspector установил время и поставил enabled: true;
Очень зря. Не надо так делать никогда.
Сообщение от Александр_absub
Я пробовал вешать процедуру на обработчик кнопки, та же проблема
Тогда нужно больше кода показывать. Лучше всего тогда прикрепить архив с проектом и всеми необходимыми файлами к сообщению.
P,S. Access Violation с "Read of adress 0000000х" означает что идёт обращение к не созданному объекту или к динамическому массву, для которого не выделили память.
Вопрос: Создал компонент, выдает Access violation in vcl140.bpl

Создал новый компонент на базе TRzCustomPanel. Он установился, нормально кладется на форму.
Но когда заполнил код процедурами, и переустановил, стал выдавать Access violation in module vcl140.bpl при попытке положить компонент на форму. Куда копать?
Ответ:
Feg16
DarkMaster
Destructor где?
А зачем?


А шоб було ;) Вдруг какой StringList захочется прилепить... А FLabelCaption - так я вообще обращения к нему не увидел.
Вопрос: Access violation при обращении по указателю

C++
1
2
3
_CommandPtr pCmd = NULL;
_ParameterPtr Var1;
Var1 = pCmd->CreateParameter(_bstr_t("@T"), adInteger, adParamOutput, 0, codRet);
Почему я получаю "Access Violation writing..." в моей dll в этой строке?
Ответ: Спасибо, а как правильно?
Убрал присвоение нулю в первой строчке - всё то же самое.

Вообще, это не весь код. Вот так правильнее будет:
C++
1
2
3
4
5
6
7
8
_CommandPtr pCmd = NULL;
_ParameterPtr Var1;
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(... данные для подключения..);
TESTHR(pCmd.CreateInstance(__uuidof(Command)));
        pCmd->CommandText = PrcName; 
        pCmd->CommandType = adCmdStoredProc;
Var1 = pCmd->CreateParameter(_bstr_t("@T"), adInteger, adParamOutput, 0, codRet);
Добавлено через 31 минуту


size (4-й параметр) поставил 1 вместо 0 и заработало

Добавлено через 7 минут
Теперь та же ошибка в следующей строке:
C++
1
pCmd->Parameters->Append(Var1);
Добавлено через 17 минут
C++
1
2
Par1 = pCmd->CreateParameter(_bstr_t("@P1"), adInteger, adParamOutput, sizeof(_bstr_t("@P1")), codRet);
        pCmd->Parameters->Append(Par1);
Сделал так. На последней строке access violation...

Добавлено через 16 часов 31 минуту
К сожалению, до сих пор access violation и параметр size в CreateParameter() не особо на то влияет.
pCmd равен нулю (первая строчка).
В третьей строке происходит попытка его разыменования: pCmd->...
Отсюда и Access violation.
Вот смотрите аналогичный пример

Тоже там
C++
1
 _CommandPtr pcmdByRoyalty = NULL;
В чем же у меня ошибка?

Добавлено через 14 минут
Я извиняюсь, похоже, я неправильно прописал подключение msado15.dll.
У меня было вообще так:
#import "C:\Program Files\Common Files\System\ado\msado60.tlb"

Изменил, вроде, нет больше ошибки.
Вопрос: DBX: Access violation при обращении к свойству InTransaction объекта SQLConnection

Добрый день. В программе возникает ошибка "Access Violation" при попытке обратиться к свойству InTransaction объекта TSQLConnection. Пример кода:

begin
  if assigned(SQLConnectrion) then
    if SQLConnectrion.InTransaction then SQLConnection.StartTransaction(TransDesc);
  try
    // здесь код работы с БД (вызовы хранимых процедур)
  except
    on e: exception do
        begin
          if Assigned(SQLConnectrion) then
            if SQLConnectrion.InTransaction then SQLConnectrion.Rollback(TransDesc);
          raise;
        end;
  end;
end;


Обращение к свойству SQLConnection.InTransaction до блока try срабатывает корректно, а обращение в блоке except вызывает Access Violation. В чем может быть причина?
Ответ:
_Vasilisk_
Interloper
Ссылка на компонент передается в процедуру как параметр.
Interloper
пропущено...

Компонент.
Одно из этих утверждений ложно

Это компонент на форме, который передается в процедуру по ссылке. А мог бы быть динамически создаваемый в ран-тайме объект.
Вопрос: Создание объекта в объекте - access violation. Код прилагаю, помогите!

В общем работаю с MySQL в виде embedded в программе. Динамически создаю подключения и работаю с базой. Но думаю это не имеет отношения к вопросу. А теперь вопрос:

Если всё делать в основном юните или в вызываемом объекте, то всё прекрасно работает. Но я пытаюсь сократить код и создал еще один объект чисто для работы с MySQL. Переношу код один=в=один в новый класс, потом подключаю его и вот этот новый объект не работает, получаю access violation.

Есть основной юнит, там прописано: uses Winapi.Windows, Winapi.Messages, мой_класс и т.д.
Есть мой класс, там было ранее прописано: uses Winapi.Windows, Winapi.Messages, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error и так далее. И там шла работа с MySQL.
А сейчас в моём классе прописано такое: Winapi.Windows, Winapi.Messages,mysql_класс и т.д. Т.е. я подключил класс и перенес туда код работы с MySQL.

Так вот, пока код работы с MySQL находился в моём классе, всё работало. Перенёс в объект, ничерта не работает. Что я делаю не так?

Вот что я теперь делаю в моём классе (пытаюсь вызвать новый mysql объект):

var
  mc: TMyMysql;
begin
  mc.Create;


и сразу получаю здесь access violation. Если перенести сюда код работы с MySQL то всё будет работать.

Вот код нового MySQL класса:

unit MyMysql;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, FireDAC.Stan.Intf,
  FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef, FireDAC.Comp.Client, FireDAC.Stan.Param,
  FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.VCLUI.Wait, FireDAC.Comp.UI;

type
  TMyMysql = class(TObject)
  private
    //
  public
    conn: TFDConnection;
    query: TFDQuery;
    constructor Create;
    destructor Destroy; override;
  end;

implementation

constructor TMyMysql.Create;
begin
  inherited Create;
  conn := TFDConnection.Create(nil);
  query := TFDQuery.Create(nil);
  conn.DriverName := 'MySQL';
  conn.LoginPrompt := false;
  conn.Params.DriverID := 'MySQL';
  conn.Params.Database := 'mydatabase';
  conn.Params.Values['CharacterSet'] := 'utf8';
  query.Connection := conn;
end;

destructor TMyMysql.Destroy;
begin
  query.Close;
  conn.Close;
  query.Free;
  conn.Free;
  inherited Destroy;
end;

end.


Простите что путаю слова про объект, класс и т.д. но думаю вы понял и о чём я. В чём может быть проблема? Что я делаю не так?
Ответ: JaDi,

Мда, смешной косяк. Вот что значит работать с красными глазами на ночь глядя))) Прошу прощения, заработался. Огромное спасибо за помощь!
Вопрос: FireDAC - Access Violation

Что это за фигня в ФаирДаке ?

type
 TMyMemTable=class(TFDMemTable)
   private
    FAdapter: TFDTableAdapter
   public
    constructor Create(AOwner:TComponent); Override;
 end;

constructor TXDataSet.Create(AOwner: TComponent);
begin
  inherited;
  FAdapter:= TFDTableAdapter.Create(nil);
  Adapter:=FAdapter; // << Access Violation, version 1
  Adapter:= TFDTableAdapter.Create(Self); // << Так тоже Access Violation, version 2
end;
Ответ: Всё, удалите эту тему)
3 часа таращился в экран
FCommand:=TFDCommand(Self);

И забыл написать .Create
Вопрос: Access Violation

ошибка типа "Access Violation....modul... ...",
отладчик казал на строки типа:

delete[] name;

без них перестал ругацца, как же чистить кучу?
Ответ:
заметил такую чтуку, сборка была в режиме дебуг, а после перезагрузки и запуска exeшника выдавал access violation, после перелинковки стало нормуль, а в режиме релиз тож нормуль, тестим дальше
Вопрос: А можно ли как-то проверить память перед обращением во избежание Access violation ?

Перед завершением потока мне нужно запустить callback-функцию в этом же потоке. Всё работает хорошо. Но если поток завершается во время завершения всей программы, то получаю 0xC0000005: Access violation reading location 0xdddddddd. Т.к. адрес в памяти для функции обратного вызова становится недоступным.
Можно ли как-то перед вызовом каллбак как-то проверить доступность этой области памяти, чтобы не возникала эта ошибка ? Есть какая-нибудь функция типа "IsValidMemory(pointer)" ? Проверять на NULL и nullptr бесполезно. Указатель не пустой.
Ответ:
pointer1
Перед завершением потока мне нужно запустить callback-функцию в этом же потоке. Всё работает хорошо. Но если поток завершается во время завершения всей программы, то получаю 0xC0000005: Access violation reading location 0xdddddddd. Т.к. адрес в памяти для функции обратного вызова становится недоступным.
Можно ли как-то перед вызовом каллбак как-то проверить доступность этой области памяти, чтобы не возникала эта ошибка ? Есть какая-нибудь функция типа "IsValidMemory(pointer)" ? Проверять на NULL и nullptr бесполезно. Указатель не пустой.


Можно.

Есть фунция Win API IsValidPointer или что-то в этом роде.

Можно и самому такую сделать -- попытаться записать и прочитать что-то по этому адресу. Под SEH.