Delphi runtime error 217 at

Вероятно многие встречались с таким вот «партизаном» при старте или завершении приложения: Очень информативное сообщение, сразу понятна причина ошибки, место...

Вероятно многие встречались с таким вот «партизаном» при старте или завершении приложения:

Очень информативное сообщение, сразу понятна причина ошибки, место и способ ее решения.
Впрочем, если без шуток, что это вообще такое?
Конечно-же это исключение, но ни тип исключения, ни его описание нам не доступны — просто «Runtime error 217» и адрес, а дальше сами…

Если честно, раньше я как-то даже не задумывался по поводу данного исключения, т.к. в моих проектах оно явление редкое, пока однажды у целой череды пользователей не начала воспроизводится именно 217-я ошибка.
Впрочем, даже тогда я не пошел по правильному пути и просто добавил дополнительный уровень логирования в проект, по результатам которого достаточно оперативно нашел причину и исправил ее.
Но, по сути, я просто потратил свое время…

И тратил бы его в дальнейшем, если бы на днях со мной не связался Виктор Федоренков и не рассказал о своих мыслях по поводу ошибки за номером 217.

Теория и анализ проблемы

Без теории нам никуда, иначе можем уткнуться в пределы собственных знаний.
Поэтому начнем, конечно, с теоретической части.

Для начала я немного освежил мои представления об ошибках в принципе, перечитав часть статьи «Обработка ошибок — глава 1.2.2» за авторством Александра Алексеева, откуда вынес информацию о том, что ошибка 217 будет отображена в том случае, если не инициализирован модуль SysUtils, причем это у Александра проиллюстрированно достаточно наглядно:


Открыть картинку в полный размер…

На основании данной картинки можно сделать грубый вывод: пока SysUtils жив — все исключения должны отображаться в нормальном виде, о чем идет отдельное упоминание:

Например, если вы видите сообщение о runtime-ошибке, то, судя по приведённой схеме, маловероятно, чтобы ошибка возникла в обработчиках событий на форме. Зато гораздо вероятнее, что она возникает, скажем, в какой-то секции finalization (которая выполняется после секции finalization модуля SysUtils) или в назначенной процедуре ExitProcessProc. Но, разумеется, причина ошибки может сидеть где угодно — в том числе и в упоминаемых обработчиках событий.

Ну что-ж давайте проверим, пишем код, в котором SysUtils должна быть финализирована позже модуля Unit1, в котором искусственно генерируем исключение:

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
initialization
 
finalization
 
  raise Exception.Create('finalization exception');
 
end.

Билдим, запускаем, закрываем форму и… Runtime error 217.

Утверждение о том, что 217 отображается после финализации SysUtils полностью верное, но давайте-ка посмотрим на сам код финализации:

procedure FinalizeUnits;
...
begin
...
  Count := InitContext.InitCount;
  Table := InitContext.InitTable^.UnitInfo;
...
  try
    while Count > 0 do
    begin
      Dec(Count);
      InitContext.InitCount := Count;
      P := Table^[Count].FInit;
      if Assigned(P) then
...
        TProc(P)();
...
      end;
    end;
  except
    FinalizeUnits;  { try to finalize the others }
    raise;
  end;
end;

Смотрите что происходит: в процедуре FinalizeUnits вызываются все финализирующие процедуры, адреса которых расположены в массиве InitContext.InitTable^.UnitInfo в том порядке, в котором происходила их инициализация, т.е. самые первые расположены в начале массива (а финализация идет с конца).
Где-то в самом низу расположен и SysUtils + System, ну а мы, с нашим модулем Unit1 где-то в самом верху.
Но вдруг происходит исключение в нашем модуле и «бабах», порядок катарсиса нарушен.

После «бабах» FinalizeUnits вызывается повторно, пропуская наш модуль, вызвавший исключение, вследствие чего разрушается SysUtils и разные, встречающиеся по пути, class destructor-ы, до кучи грохается System с менеджером памяти (сидящий одним из первых в начале списка), после чего идет контрольный выстрел в лоб — RAISE, вот тут-то мы и приплыли — здравствуй 217.

А что если произойдет исключение в секции инициализации любого модуля?

Да все тоже самое:

procedure InitUnits;
...
begin
...
  try
...
  except
    FinalizeUnits;
    raise;
  end;
end;

Делаем вывод: любое необработанное исключение в секциях инициализации или финализации будет приводить к потере описания исключения и приводить к ошибке 217.

На этом с теорией, думаю, закончим.
Имея на руках понимание о причине возникновения Runtime error 217, попробуем получить на руки более привычный нам вариант сообщения об исключении.

Отключаем финализацию модулей

В самом начале обсуждения Виктором был предложен достаточно эффективный способ обхода данной ошибки.

Его анализ заключался в следующем: общая инициализация обработчика исключений производится в процедуре InitExceptions модуля SysUtils, а финализация вызовом DoneExceptions.

Если каким либо образом отключить вызов DoneExceptions плюс не дать разрушиться менеджеру памяти, заблокировав вызов блока финализации System — на руки мы получим сообщение об исключении в приемлимом виде.

Как вариант решения был предложен следующий код, который нужно подключить к файлу проекта самым первым модулем (будет работать начиная с D2005 и выше):

unit suShowExceptionsInInitializeSections;
 
interface
 
uses
  SysUtils;
 
implementation
 
uses
  Windows;
 
//Получение структуры PackageInfo нашего приложения
//В System она находится в переменной InitTable, но не видна из других модулей
function GetInitTable: PackageInfo;
var
  Lib: PLibModule;
  TypeInfo: PPackageTypeInfo;
begin
  Result := nil;
 
  Lib := LibModuleList;
 
  if not Assigned(Lib) then
    Exit;
 
  //Если загружено несколько модулей (BPL пакетов), то выходим,
  //я не изучал как работает механизм загрузки/выгрузки BPL, поэтому на всякий
  //случай выходим
  if Assigned(Lib^.Next) then
    Exit;
 
  Typeinfo := Lib^.TypeInfo;
  if Assigned(TypeInfo) then
  begin
    //Мы имеем TPackageTypeInfo
    //Теперь по нему можно получить PackageInfo
    //Воспользуемся особенностями компилятора.
    //В IDA видно, что ссылка TypeInfo указывает на середину структуры
    //PackageInfo программы
    //Поэтому для того что бы вычислить PackageInfo нужно вычесть из адреса
    //TypeInfo смещение этого поля
    Result := PackageInfo(PByte(TypeInfo) - (LongWord(@PackageInfoTable(nil^).TypeInfo)));
  end;
end;
 
//Отключить секцию финализации для всех модулей
procedure DisableAllFinalization;
var
  Loop: Integer;
  OldProtect: LongWord;
  InitTable: PackageInfo;
  Table: PUnitEntryTable;
begin
  InitTable := GetInitTable;
 
  if Assigned(InitTable) then
  begin
    Table := InitTable^.UnitInfo;
    if Assigned(Table) then
      //Разрешаем изменять структуру в которой хранятся ссылки на инициализаю/финализацию всех юнитов
      if VirtualProtect(Table, SizeOf(PackageUnitEntry) * InitTable^.UnitCount, 
        PAGE_READWRITE, OldProtect) then
        for Loop := 0 to InitTable^.UnitCount - 1 do
          Table^[Loop].FInit := nil;
  end;
end;
 
initialization
 
finalization
  //Сейчас идет финализация всех модулей, модуль SysUtils создан раньше, поэтому
  //он еще не финализирован. Наша задача здесь не дать ему финализироваться,
  //Как и другим модулям которые он использует (интересует только System),
  //это нужно для правильной отработки обработчиков исключений.
 
  //Сюда мы можем попасть по двум причинам
  //1. Произошел Exception во время инициализации каком-то модуля
  //2. Нормальное завершение программы
  //
  //Мы не будем определять причину, так как процесс все равно завершается, а ОС
  //сама освободит занятые ресурсы после смерти процесса.
  //Но нужно иметь ввиду, данную технику использовать в DLL нельзя, что бы не
  //допускать утечек памяти
  if IsLibrary then
    Exit;
 
  //Мы не можем выборочно заблокировать финализацию юнитов по их имени
  //так как нет соответствующих данных в RTTI. Тем не менее, мы можем отключить
  //финализацию всех юнитов, которые идут в списке до этого
  //модуля. Таким образом если данный модуль расположить первым в DPR файле,
  //то мы минимизируем утечки.
  //Вычислять адрес процедуры финализации данного юнита не обязательно,
  //ведь к моменту выполнения данного кода уже финализированы все следующие юниты.
  //Поэтому просто заблокируем финализцию всех оставшихся
  DisableAllFinalization;
end.

Если честно — аплодировал стоя.
Вот он: хак в самом грязном виде как он есть — такие вещи могут делать только те, кто действительно понимает, чем это грозит :)
И данный модуль вывел работу нашего IT отдела примерно на три часа — это была жесткая дискуссия :)

Но, впрочем, давайте разберем логику работы данного кода:
Суть его проста, необходимо выйти на данные о загруженных модулях (включая BPL) в том виде, в котором их понимает Delphi приложение. Это было сделано посредством доступа к началу однонаправленного списка структур TLibModule. Первым элементом списка будет структура, описывающая текущий образ, откуда нам нужно всего-то и получить данные о структуре UnitInfo, которая содержит в себе данные как о количестве инициализированных модулей, так и об адресах их процедур инициализации и финализации в виде записи PackageUnitEntry.

Блокирование финализации модулей происходит посредством присвоения параметру FInit значения nil у каждой записи PackageUnitEntry.

При обниливании данного параметра FinalizeUnits не сможет произвести вызов обработчика и в итоге тот самый raise, о котором я писал выше, сможет достаточно корректно произвести отображение возникшего исключения.

Но вот дальше все сложнее.

Пытаемся причесать хорошую мысль

Идея здравая и причины понятны, но вот как-же так, ресурсы все-же не освобождены, FastMem перестанет нормально работать (она собирает утечки как раз при финализации), да и совместимости маловато, к примеру, как я и сказал выше, под Delphi 7 данный код вообще работать не сможет.

После первого часа обсуждений в IT отделе мы даже умудрились прийти и к такому выводу: «да и хрен с ними с SysUtils и System — что-то критичного они за собой не несут».
А потом, опять начали спорить — ну не устраивал нас этот подход, вроде все хорошо, но не аккуратненько как-то.

Рассматривались даже варианты прямого сплайсинга блоков финализации и до кучи деструктора Exception — но дополнительный хак, на уже существующий хак не устраивал вообще никого.

И тут, сидя в отладчике и прогоняя код по 70-му разу пришла мысля.
Дык эта… а как вообще выводится сообщение о произошедшем исключении?

А выводится оно посредством передачи управления на ExceptHandler, в коде которого нет ничего секретного.
А что мы делаем убирая финализацию модулей?
Правильно, заставляем вызваться его-же.

Попробуем-ка проэмулировать вызов ExceptHandler.
Пишем тестовый юнит и подключаем его к проекту самым первым:

unit Test;
 
interface
 
uses
  SysUtils;
 
var
  E: Exception;
 
implementation
initialization
finalization
  E := AcquireExceptionObject;
  if E <> nil then
  begin
    ShowException(E, ExceptAddr);
    E.Free;
    Halt(1);
  end;
end.

Запускаем на выполнение и…


Получилось.

Встроившись в цикл финализации, мы отобразили произошедшее исключение и продолжили финализацию дальше вызовом Halt(1).

В итоге задача решена, грамотно и документировано, и совместимо с Delphi 7, но…

А не развить ли идею?

Есть такое понятие, как «наведенные ошибки», т.е. ошибки произошедшие из-за того что перед ними тоже произошла ошибка.

Ну к примеру, функция А, которая должна возвращать экземпляр некоего класса и функция Б, использующая этот экземпляр в работе. К примеру в функции А произошло необработанное исключение (например нет доступа к файлу) и она не создала класс, а потом где-то гораздо позже по коду приложения процедура Б выполняет обращение к этому экземпляру и в итоге происходит Access Violation.

Тоже самое может произойти и в процедурах инициализации/финализации, причем исключение, произошедшее в финализации скроет от нас саму причину.

Для демонстрации напишем вот такой код, в котором при инициализации приложения будет создаваться некий логер, в который будут писаться этапы работы приложения, а в финализации будет запись о завершении работы.
Для генерации исключения заставим логер создаваться по несуществующему пути:

uses
  Classes;
 
var
  Logger: TFileStream;
 
const
  StartLog: AnsiString = 'Начало работы приложения' + sLineBreak;
  EndLog: AnsiString = 'Работа приложения завершена' + sLineBreak;
 
implementation
 
initialization
 
  Logger := TFileStream.Create('A:MyLog,txt', fmCreate);
  Logger.WriteBuffer(StartLog[1], Length(StartLog));
 
finalization
 
  Logger.WriteBuffer(EndLog[1], Length(EndLog));
  Logger.Free;
 
end.

Мало у кого в системе присутствует диск «А» поэтому результатом этого кода будет либо «Runtime error 216» (именно 216, а не 217), либо, если подключим код из предыдущей главы:

Exception EAccessViolation in module Project2.exe at 001B1593.
Access violation at address 005B1593 in module ‘Project2.exe’. Read of address 00000000.

А ведь причина то кроется в самом первом исключении, которое нами не отображается и с наскока разобраться в причине ошибки не получится.

Для того чтобы исправить эту несправедливость, можно немного причесать код и довести его до вот такого состояния:

unit ShowExceptSample;
 
interface
 
uses
  SysUtils,
  Classes;
 
implementation
 
type
  PRaiseFrame = ^TRaiseFrame;
  TRaiseFrame = packed record
    NextRaise: PRaiseFrame;
    ExceptAddr: Pointer;
    ExceptObject: TObject;
    ExceptionRecord: PExceptionRecord;
  end;
 
var
  // Указатель на вершину списка исключений
  CurrentRaiseList: Pointer = nil;
 
// Функция возвращяет текущее исключение со стека
function GetNextException: Pointer;
begin
  if CurrentRaiseList = nil then CurrentRaiseList := RaiseList;
  if CurrentRaiseList <> nil then
  begin
    Result := PRaiseFrame(CurrentRaiseList)^.ExceptObject;
    PRaiseFrame(CurrentRaiseList)^.ExceptObject := nil;
    CurrentRaiseList := PRaiseFrame(CurrentRaiseList)^.NextRaise;
  end
  else
    Result := nil;
end;
 
var
  ExceptionStack: TList;
  E: Exception;  
 
initialization
 
finalization
 
  // Смотрим, есть ли вообще исключения?
  E := GetNextException;
 
  if E <> nil then
  begin
    ExceptionStack := TList.Create;
    try
 
      // если есть, собираем о них информацию
      while E <> nil do
      begin
        ExceptionStack.Add(E);
        E := GetNextException;
      end;
 
      // и отображаем их в том порядке, в котором они произошли
      while ExceptionStack.Count > 0 do
      begin
        E := ExceptionStack[ExceptionStack.Count - 1];
        ExceptionStack.Delete(ExceptionStack.Count - 1);
        ShowException(E, ExceptAddr);
        E.Free;
      end;
    finally
      ExceptionStack.Free;
    end;
 
    // финализируем все что осталось
    Halt(1);
  end;
end.

Здесь идея проста, функция GetNextException по сути повторяет вызов AcquireExceptionObject, но после своего вызова не теряет ссылку на следующее в очереди исключение, а запоминает адрес следующего фрейма во внешней переменной.
После чего все исключения заносятся в список (самое последнее будет первым в списке) и выводятся программисту с соблюдением очередности, в результате чего нам будет сразу понятно, что сначала произошло вот это:

И уже только после него пошли всякие там AV.

Теперь по поводу остальных кодов ошибок.
Почему я начал именно с «Runtime error 217»?
Ну потому что она наиболее легко воспроизводима, а так технически, используя выше приведенный модуль, мы получим на руки вполне нормальное описание всех возможных Runtime ошибок, коих в наличии у нас вон сколько:

  reMap: array [TRunTimeError] of Byte = (
    0,   { reNone }
    203, { reOutOfMemory }
    204, { reInvalidPtr }
    200, { reDivByZero }
    201, { reRangeError }
{   210    Abstract error }
    215, { reIntOverflow }
    207, { reInvalidOp }
    200, { reZeroDivide }
    205, { reOverflow }
    206, { reUnderflow }
    219, { reInvalidCast }
    216, { reAccessViolation }
    218, { rePrivInstruction }
    217, { reControlBreak }
    202, { reStackOverflow }
    220, { reVarTypeCast }
    221, { reVarInvalidOp }
    222, { reVarDispatch }
    223, { reVarArrayCreate }
    224, { reVarNotArray }
    225, { reVarArrayBounds }
{   226    Thread init failure }
    227, { reAssertionFailed }
    0,   { reExternalException not used here; in SysUtils }
    228, { reIntfCastError }
    229, { reSafeCallError }
    235, { reMonitorNotLocked }
    236  { reNoMonitorSupport }
{$IFDEF PC_MAPPED_EXCEPTIONS}
{   230   Reserved by the compiler for unhandled exceptions }
{$ENDIF PC_MAPPED_EXCEPTIONS}
{$IF defined(PC_MAPPED_EXCEPTIONS) or defined(STACK_BASED_EXCEPTIONS)}
{   231   Too many nested exceptions }
{$ENDIF}
{$IF Defined(LINUX) or Defined(MACOS)}
{   232   Fatal signal raised on a non-Delphi thread }
    ,
    233 { reQuit }
{$ENDIF LINUX or MACOS}
{$IFDEF POSIX}
    ,
    234  { reCodesetConversion }
{$ENDIF POSIX}
    ,
    237, { rePlatformNotImplemented }
    238  { reObjectDisposed }
);

Итог

Вот таким небрежным кодом, мы можем получить то, о чем нам не хочет говорить ошибка под кодом 217.

Впрочем, я не думаю что этот подход будет незнаком опытным программистам.
Скорее всего это — здравствуй велосипед, ибо вероятнее всего данная проблема кем-то уже решалась ранее, но я просто не знал о данном решении.

А если нет — значит буду вторым.

Отдельный респект соавтору и вдохновителю данной статьи — Виктору Федоренкову.

Удачи.

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
unit Unit8;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, RpBase, RpSystem, RpDefine, RpRave, ComObj, Grids;
 
type
  TForm8 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  A:array of array of real;
  n,m,k,i:integer;
  Mx,My,Ch,Zn:real;
  x,y:real;
  Sx,Sy:real; // сигма x и y
  Rxy:real; //коэффициент корреляции
  Form8: TForm8;
  Ap : Variant;
 
implementation
 
uses Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7;
 
{$R *.dfm}
 
procedure TForm8.Button1Click(Sender: TObject);
var j:integer;
begin
 
i:=1;
m:=8;
x:=0;
y:=0;
k:=Form1.Table1.RecordCount+1;
n:=k;
SetLength(A,m,k);
 
StringGrid1.Cells[1,0]:='x';
StringGrid1.Cells[2,0]:='y';
StringGrid1.Cells[3,0]:='x-Mx';
StringGrid1.Cells[4,0]:='y-My';
StringGrid1.Cells[5,0]:='(x-Mx)*(y-My)';
StringGrid1.Cells[6,0]:='(x-Mx)^2';
StringGrid1.Cells[7,0]:='(y-My)^2';
 
Form1.Table1.First;
For j:=1 to  Form1.Table1.RecordCount+1 do   //заполнение первого поля
begin
A[1,j]:=Form1.Table1.FieldByName('Alerg').AsFloat;
Form1.Table1.Next;
StringGrid1.Cells[1,j]:=FloatToStr(A[1,j]); //просто для проверки
end;
 
Form1.Table1.First;
For j:=1 to  Form1.Table1.RecordCount+1 do  //заполнение второго поля
begin
A[2,j]:=Form1.Table1.FieldByName('pol').AsFloat;
Form1.Table1.Next;
StringGrid1.Cells[2,j]:=FloatToStr(A[2,j]); //просто для проверки
end;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  //Нахождение Mx
begin
x:=x+A[1,j];
end;
Mx:=x/n;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  //Нахождение My
begin
y:=y+A[2,j];
end;
My:=y/n;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  // отнимаем Mx от x
begin
A[3,j]:=A[1,j]-Mx;
StringGrid1.Cells[3,j]:=FloatToStr(A[3,j]); //просто для проверки
end;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  // отнимаем My от y
begin
A[4,j]:=A[2,j]-My;
StringGrid1.Cells[4,j]:=FloatToStr(A[4,j]); //просто для проверки
end;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  // вычисляем (x-Mx)*(y-My)
begin
A[5,j]:=A[3,j]*A[4,j];
StringGrid1.Cells[5,j]:=FloatToStr(A[5,j]); //просто для проверки
end;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  // возводим в квадрат (x-Mx)
begin
A[6,j]:=Sqr(A[3,j]);
StringGrid1.Cells[6,j]:=FloatToStr(A[6,j]); //просто для проверки
end;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  // возводим в квадрат (y-My)
begin
A[7,j]:=Sqr(A[4,j]);
StringGrid1.Cells[7,j]:=FloatToStr(A[7,j]); //просто для проверки
end;
 
x:=0;
For j:=1 to  Form1.Table1.RecordCount+1 do  // ищем сумму (x-Mx)^2
begin
x:=x+A[6,j];
 
end;
 
y:=0;
For j:=1 to  Form1.Table1.RecordCount+1 do  // ищем сумму (y-My)^2
begin
y:=y+A[7,j];
 
end;
 
//ниже идет непосредственно вычисление формулы ККПирсона
Ch:=0;
Zn:=0;
Sx:=0;
Sy:=0;
 
For j:=1 to  Form1.Table1.RecordCount+1 do  // считаем числитель
begin
Ch:=Ch+A[5,j];
end;
 
Sx:=Sqrt(x/(n-1));
 
Sy:=Sqrt(y/(n-1));
 
Zn:=(n-1)*Sx*Sy; // считаем знаменатель
 
Rxy:=Ch/Zn;
 
Label1.Caption:='коэффициента корреляции Пирсона = '+FloatToStr(Rxy);
 
end;
 
 
end.

Содержание

  1. Run time error 217 at 00406786
  2. 2 ответа 2
  3. Похожие
  4. Подписаться на ленту
  5. Delphi runtime error 217 at

Run time error 217 at 00406786

Delphi 2010:Run time error 217 at 00406786.

Не знаю, что за ошибка, собственно вот код:

Уже все варианты закрытия программы попробовал, но все время показывает ран-тайм ошибку. Почему? P.S: Интересно, что если комментировать строку во втором цикле

то не будет ошибки вообще. Что может быть, плиз. Жду помощи и советов.

2 ответа 2

как я понял из кода, tel_serv и inet_serv — это массивы типа array of string. если так, то в коде обращение к элементам этих массивов происходит по неправильным индексам. в динамических массивах используется zero-based индексация, в коде же используется 1-based. достаточно только заменить tel_serv[I] на tel_serv[I — 1] и inet_serv[k] на inet_serv[k — 1] и ошибка исчезнет.

Да, @maxionans прав, у вас неправильно идут обращения к элементам динамического массива.
Почитайте раздел о списках, динамических массивах и как работает SetLength.
В вашем коде надо бы как-то так:

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.1.14.43159

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Delphi runtime error 217 at

Pavelbej
Дата 30.1.2007, 00:20 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

Узучал менюшки, их оформление и все такое, все работало нормально, через какое-то время вдруг при запуске стала появлятся ошибка «Runtime error 217». Помогите разобратся, что это такое и куда копать. В Делфи появляется страница System с указанием на этот код:

Код
begin
errorCode := errorCode and 127;
if Assigned(ErrorProc) then
ErrorProc(errorCode, ErrorAddr);
if errorCode = 0 then //вот тут подчеркивание
errorCode := InOutRes
else if errorCode
bems
Дата 30.1.2007, 03:54 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88

Шустрый

Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5

В описании было что-то такое «STATUS_CONTROL_C_EXIT:217».
Что это — не знаю. Не понимаю причем тут CONTROL_C.

Насколько я знаю, Delphi-йская прога часто дает runtime error 217 когда ошибка возникает до инициализации
SysUtils или сразу после ее финализации (сам не наблюдал).

Когда эта ошибка возникала у меня:
1. При работе с фришным XPMenu компонентом (очень часто!)
2. Неправильный формат date (иногда, закономерности не выявил)
3. Попытка доступа с сетевым ресурсам без достаточных привилегий (всегда)
4. Инициализация BDE в сети с неверным путем (почти всегда)

dimazu
Дата 30.1.2007, 07:34 (ссылка) | (нет голосов) Загрузка .
Pavelbej
Дата 30.1.2007, 09:56 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

В последний раз я удалил из проекта XPMenu, и добавил код который нашел на этом форуме, чтобы красивое меню сделать, и все работало, но после нескольких запусков все и началось. Удалил Дельфи и все сторонние компоненты, поставил заново только необходимое для проекта и ничего все таже проблема.

При запуске показывает «Project Project1.exe raised exception class ERangeError with message ‘Range check error’.

CatATonik
Дата 30.1.2007, 10:02 (ссылка) | (нет голосов) Загрузка .

Шустрый

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Pavelbej
Дата 30.1.2007, 15:06 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

CatATonik, ну я не так уж и хорошо знаю Делфи и вообще программирование, непонятно о чем ты.

Народ помогите, невозможно дальше работать. Че Виндозу уже переустановить? Вроде бы изза этих меню все случилось, но поставил все заново и все равно не хочет фунциклировать. Очень надо, уже день бездельничаю.

CatATonik
Дата 30.1.2007, 15:24 (ссылка) | (нет голосов) Загрузка .

Шустрый

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Pavelbej
Дата 30.1.2007, 15:33 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

Цитата(CatATonik @ 30.1.2007, 15:24 )
Когда вываливается ошибка нажимаешь Ctrl+Alt+S, появится окошко Call Stack, это список вызовов функций в которых возникла ошибка. Т.е. если у тебя ошибка в функции f3 которая вызвается из функция f2 та из f1, то будет список f3, f2, f1. Сможешь увидеть где у тебя ошибка.

понял, но показывает то что я уже написал в первом посте: указывает на модуль System и подчеркивает строку

Код
if errorCode = 0 then
CatATonik
Дата 30.1.2007, 15:47 (ссылка) | (нет голосов) Загрузка .

Шустрый

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Pavelbej
Дата 30.1.2007, 16:19 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

Код
if smallTab <> nil then begin
for i:= low(smallTab^) to high(smallTab^) do // остановка здесь и на нижней строке
smallTab[i] := nil;
CatATonik
Дата 30.1.2007, 16:35 (ссылка) | (нет голосов) Загрузка .

Шустрый

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Pavelbej
Дата 30.1.2007, 16:57 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

Что посоветуеш? Что это значит?

CatATonik
Дата 30.1.2007, 17:10 (ссылка) | (нет голосов) Загрузка .

Шустрый

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Beltar
Дата 30.1.2007, 17:39 (ссылка) | (нет голосов) Загрузка .

Опытный

Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7

Что-то ты делаешь тут мегасложное.
Кстати.

In Delphi, ErrorProc is a procedure variable pointing to the runtime error handler. The standard ErrorProc procedure reports the runtime error and terminates the program.

The ErrorProc variable is retained primarily for compatibility with older code. Newer applications should not specify an alternate runtime error procedure using ErrorProc as SysUtils uses this variable to convert runtime errors into exceptions.
If you use SysUtils in your program, it will force ErrorProc to its own routine and convert the runtime error into an exception. When a runtime library error occurs, the ErrorProc is called. The ErrorCode parameter contains the runtime error number and the ErrorAddr parameter contains the machine code address that caused the runtime error.

Т. е. с ней связываться не рекомендуется. Почему ты не используешь try except?

Шустрый

Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5

Унинсталируй нафиг Jedi
Oни используют ХР меню компонент и
кроме того (по просьбе ) устанавливают редакторы пропертиз.
Отредактируй dclusr и убери из него даже
упоминание о сторонних компонентах.

Если и после этого будет ошибка, то будем удалять дальше.

dimazu
Дата 30.1.2007, 22:08 (ссылка) | (нет голосов) Загрузка .

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

Правила форума «Delphi: Общие вопросы»
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

[ Время генерации скрипта: 0.1374 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Источник

Adblock
detector

Delphi 2010:Run time error 217 at 00406786.

Не знаю, что за ошибка, собственно вот код:

procedure TForm1.FormCreate(Sender: TObject);
var 
    Params:TStringList;
    InetParams:TStringList;

    i,k:Integer;
    inipath:string;
begin

{Settings section start}
inipath:=GetCurrentDir+'services.ini';
 Settings:=TIniFile.Create(inipath);
  Params:= TStringList.Create;
  InetParams:=TStringList.Create;
  try
    Params.StrictDelimiter:= True;
    Params.CommaText:= Settings.ReadString('Telephone', 'catidx_values', '-1');
    TEL_SERV_COUNT:=Params.Count;
    SetLength(tel_serv, TEL_SERV_COUNT);
    i:=1;k:=1;
    while i<=TEL_SERV_COUNT do
    begin
      tel_serv[I] := Trim(Params[I-1]);
      inc(i);
    end;

    InetParams.CommaText:= Settings.ReadString('Internet', 'catidx_values', '-1');
    INET_SERV_COUNT:=InetParams.Count;
    SetLength(inet_serv, INET_SERV_COUNT);
   while k<=INET_SERV_COUNT do
   begin

     inet_serv[k]:= Trim(InetParams[k-1]);
     //ShowMessage(Inet_serv[i]);
    // ShowMessage(InetParams[k-1]);
    Inc(k);
    end;

  finally
    Params.Free;
    InetParams.Free;
    Settings.Free;
  end;

    {Settings section end}
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Application.Terminate;
end;

Уже все варианты закрытия программы попробовал, но все время показывает ран-тайм ошибку. Почему?
P.S: Интересно, что если комментировать строку во втором цикле

inet_serv[k]:= Trim(InetParams[k-1]);

то не будет ошибки вообще… Что может быть, плиз… Жду помощи и советов.


Форум программистов Vingrad

Модераторы: Poseidon, Snowy, bems, MetalFan

Страницы: (2) Все [1] 2 
( Перейти к первому непрочитанному сообщению )

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Помогите исправить ошибку! Runtime error 217 

V

   

Опции темы

Pavelbej
Дата 30.1.2007, 00:20 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

Узучал менюшки, их оформление и все такое, все работало нормально, через какое-то время вдруг при запуске стала появлятся ошибка «Runtime error 217». Помогите разобратся, что это такое и куда копать. В Делфи появляется страница System с указанием на этот код:

Код

begin
  errorCode := errorCode and 127;
  if Assigned(ErrorProc) then
    ErrorProc(errorCode, ErrorAddr);
  if errorCode = 0 then   //вот тут подчеркивание
    errorCode := InOutRes
  else if errorCode <= Byte(High(TRuntimeError)) then
    errorCode := reMap[TRunTimeError(errorCode)];
  RunErrorAt(errorCode, ErrorAddr);
end;

PM MAIL   Вверх
bems
Дата 30.1.2007, 03:54 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88

эта штука констатирует факт ошибки. Что ты конкретно делаешь и какой последний твой код перед ошибкой?

———————

Обижено школьников: 8

PM MAIL   Вверх
dimazu
Дата 30.1.2007, 07:34 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5

В описании было что-то такое «STATUS_CONTROL_C_EXIT:217».  smile 
Что это — не знаю… Не понимаю причем тут CONTROL_C…  smile

Насколько я знаю, Delphi-йская прога часто дает runtime error 217 когда ошибка возникает до инициализации 
SysUtils или сразу после ее финализации (сам не наблюдал).  

Когда эта ошибка возникала у меня:
1. При работе с фришным XPMenu компонентом (очень часто!)
2. Неправильный формат date (иногда, закономерности не выявил)
3. Попытка доступа с сетевым ресурсам без достаточных привилегий (всегда)
4. Инициализация BDE в сети с неверным путем (почти всегда)

PM MAIL   Вверх
Pavelbej
Дата 30.1.2007, 09:56 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

В последний раз я удалил из проекта XPMenu, и добавил код который нашел на этом форуме, чтобы красивое меню сделать, и все работало, но после нескольких запусков все и началось. Удалил Дельфи и все сторонние компоненты, поставил заново только необходимое для проекта и ничего все таже проблема. 

При запуске показывает  «Project Project1.exe raised exception class ERangeError with message ‘Range check error’….

PM MAIL   Вверх
CatATonik
Дата 30.1.2007, 10:02 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

А Call Stack посмотреть слабо? Где ошибка то возникает?

PM MAIL   Вверх
Pavelbej
Дата 30.1.2007, 15:06 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

CatATonik,  ну я не так уж и хорошо знаю Делфи и вообще программирование, непонятно о чем ты.

Народ помогите, невозможно дальше работать. Че Виндозу уже переустановить? Вроде бы изза этих меню все случилось, но поставил все заново и все равно не хочет фунциклировать. Очень надо, уже день бездельничаю.

PM MAIL   Вверх
CatATonik
Дата 30.1.2007, 15:24 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Когда вываливается ошибка нажимаешь Ctrl+Alt+S, появится окошко Call Stack, это список вызовов функций в которых возникла ошибка. Т.е. если у тебя ошибка в функции f3 которая вызвается из функция f2 та из f1, то будет список f3, f2, f1. Сможешь увидеть где у тебя ошибка.

PM MAIL   Вверх
Pavelbej
Дата 30.1.2007, 15:33 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

Цитата(CatATonik @  30.1.2007,  15:24 Найти цитируемый пост)
Когда вываливается ошибка нажимаешь Ctrl+Alt+S, появится окошко Call Stack, это список вызовов функций в которых возникла ошибка. Т.е. если у тебя ошибка в функции f3 которая вызвается из функция f2 та из f1, то будет список f3, f2, f1. Сможешь увидеть где у тебя ошибка. 

понял, но показывает то что я уже написал в первом посте: указывает на модуль System и подчеркивает строку 

Код
 if errorCode = 0 then

PM MAIL   Вверх
CatATonik
Дата 30.1.2007, 15:47 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

И больше ничего нет? Только System?
Тогда попробуй запустить в пошаговом режиме (все время нажимай F7), наверное у тебя гдето в Initialization ошибка. Заодно посмотришь все-ли ты удалил  smile 

PM MAIL   Вверх
Pavelbej
Дата 30.1.2007, 16:19 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

CatATonik,  я зделал, но все остановилось на странице GETMEM.INC, вот код: 

Код

if smallTab <> nil then begin
      for i:= low(smallTab^) to high(smallTab^) do            // остановка здесь и на нижней строке
        smallTab[i] := nil;

PM MAIL   Вверх
CatATonik
Дата 30.1.2007, 16:35 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Ты отключи в свойствах проекта опцию Use Debug DCU и сразу легче станет, а то что ты библиотечные функции показываешь, тебе надо найти где у тебя оно вываливается.

PM MAIL   Вверх
Pavelbej
Дата 30.1.2007, 16:57 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 419
Регистрация: 5.7.2005

Репутация: нет
Всего: 6

CatATonik,  месага появилась в конец 

Код
unit JvConsts;

Что посоветуеш? Что это значит?

PM MAIL   Вверх
CatATonik
Дата 30.1.2007, 17:10 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 95
Регистрация: 12.1.2007
Где: Москва

Репутация: 6
Всего: 8

Ну вот, а говоришь все сторонние компонеты удалил smile 
Это видимо JCL, такая сторонняя библиотека. Удали из Uses вообще все лишние модули, глядишь заработает. Только не спрашивай какие сторонние а какие нет, отсюда я тебе сказать не могу.

PM MAIL   Вверх
Beltar
Дата 30.1.2007, 17:39 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7

Что-то ты делаешь тут мегасложное.
Кстати.

In Delphi, ErrorProc is a procedure variable pointing to the runtime error handler. The standard ErrorProc procedure reports the runtime error and terminates the program.

 The ErrorProc variable is retained primarily for compatibility with older code. Newer applications should not specify an alternate runtime error procedure using ErrorProc as SysUtils uses this variable to convert runtime errors into exceptions. 
If you use SysUtils in your program, it will force ErrorProc to its own routine and convert the runtime error into an exception. When a runtime library error occurs, the ErrorProc is called. The ErrorCode parameter contains the runtime error number and the ErrorAddr parameter contains the machine code address that caused the runtime error.

Т. е. с ней связываться не рекомендуется. Почему ты не используешь try except?

———————

Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.

PM MAIL   Вверх
dimazu
Дата 30.1.2007, 22:08 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Шустрый
*

Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5

Унинсталируй нафиг Jedi
Oни используют ХР меню компонент и
кроме того (по просьбе  smile ) устанавливают редакторы пропертиз…
Отредактируй  dclusr и убери из него даже
упоминание о сторонних компонентах.

Если и после этого будет ошибка, то будем удалять дальше…   smile

PM MAIL   Вверх



















Страницы: (2) Все [1] 2 

Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Общие вопросы»
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

I did a clean install of Delphi 10.4.2. One of the first steps is to compile and install GExperts. SVN revision 3449 compiled fine, but when running the «Register-GExperts-XX104.cmd» it fails with «Runtime error 217 at 50CDB390», followed by «Problem beim Starten von .GExpertsRS104.dll. Eine DLL-Initialisierungsroutine ist fehlgeschlagen.»

To trace the error I compiled GExperts in Debug mode, using Debug-DCUs. Then I used Run->Parameters to set «C:WindowsSystem32rundll32.exe» as «Host», and the full path to the compiled GExpertsRS104.dll and «,InstallGExperts» as parameter:

Host application:
C:WindowsSystem32rundll32.exe

Parameters:
C:FullPathToGExpertsRS104.dll,InstallGExperts

Now I could debug the installation from within the Delphi IDE.

The startup-code InitUnits (in System.pas) initializes all units and calls class constructors; and in Vcl.WinXCtrls.pas it calls a class constructor TSearchBox.Create. This code creates an internal TImageCollection and adds two default images, which finally leads to TWICImage.Create in Vcl.Graphics.pas (Line 10624 ff).

The call to CoCreateInstance(CLSID_WICImagingFactory, …) fails with error code $800401F0 = CO_E_NOTINITIALIZED =  ‘CoInitialize has not been called’ and an exception is raised with message ‘Cannot create instance of class CLSID_WICImagingFactory’.

To solve this problem, I need to insert CoInitialize(nil) somewhere, and because I won’t change VCL and RTL units I had to find another place. Finally I found that the initialization block in GX_GenericUtils.pas is called some steps before the exception is raised, and already uses unit ActiveX, so I placed a CoInitialize(nil) in GX_GenericUtils.pas initialization block.

initialization
  CoInitialize(nil);  // this line added
  Initialize;
...

And the error is gone!

Finally I could install GExperts into Delphi 10.4.2 😉 [Yes, I know how to use RegEdit].

@dummzeuch : Maybe there is a better place to insert that missing CoInitialize(nil). Also I don’t know if that call has side effects on older Delphi versions and should be surrounded by some IFDEFs. Since it is only one line inserted, I did not create a patch.

I’m going to report this new VCL bug to quality portal.

Thanks for reading,

Achim


Edited March 1, 2021 by Achim Kalwa

QC -> Quality Portal

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    error 217
    , что это такое?

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    29.01.07, 21:16

      Full Member

      ***

      Рейтинг (т): 8

      Узучал менюшки, их оформление и все такое, все работало нормально, через какое-то время вдруг при запуске стала появлятся ошибка «Runtime error 217». Помогите разобратся, что это такое и куда копать. В Делфи появляется страница System с указанием на этот код:

      ExpandedWrap disabled

        begin

          errorCode := errorCode and 127;

          if Assigned(ErrorProc) then

            ErrorProc(errorCode, ErrorAddr);

          if errorCode = 0 then   //вот тут подчеркивание

            errorCode := InOutRes

          else if errorCode <= Byte(High(TRuntimeError)) then

            errorCode := reMap[TRunTimeError(errorCode)];

          RunErrorAt(errorCode, ErrorAddr);

        end;


      Аэтерос



      Сообщ.
      #2

      ,
      30.01.07, 04:55

        pavelbej, а DelphiHelp по этому поводу что говорит?


        AnalogXP



        Сообщ.
        #3

        ,
        30.01.07, 06:49

          Full Member

          ***

          Рейтинг (т): 8

          Говорит что-то про Ctrl+C, но непонятно при чем тут эти клавиши?


          AnalogXP



          Сообщ.
          #4

          ,
          30.01.07, 12:09

            Full Member

            ***

            Рейтинг (т): 8

            Люди, помогите. На другом форуме сказали что может проблема изза XPMenu, и действительно все началось после того как я его убрал. Но уже и Делфи переустановил, и этот компонент убрал, и всеже не работает. Может кто сталкивался?


            Domino



            Сообщ.
            #5

            ,
            30.01.07, 15:08

              Цитата pavelbej @ 30.01.07, 12:09

              Но уже и Делфи переустановил, и этот компонент убрал, и всеже не работает.

              А винду переустановил? :D
              Суть вот в чем: у тебя где-то остались ссылки на модулм, в которых есть инициализация библиотеки, которой у тебя нет. Попробуй сделать так: посмотри, какие модули подключаются в XPMenu и поищи их в разделах uses своего проекта.
              Если не поможет, то методом научного перебора удали из этих разделов своих модулей все неиспользуемые явно модули (метод проверки — контрольная компиляция).

              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

              0 пользователей:

              • Предыдущая тема
              • Delphi: Общие вопросы
              • Следующая тема

              Рейтинг@Mail.ru

              [ Script execution time: 0,0270 ]   [ 16 queries used ]   [ Generated: 9.02.23, 09:52 GMT ]  

              RXL, вот листовка, решил попробовать длл написать. ее я взял из книжки по дельфи.

              unit Unit1;

              interface

              uses
                Windows, ShareMem, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                Dialogs, StdCtrls;

              type
                TForm1 = class(TForm)
                  Edit1: TEdit;
                  Edit2: TEdit;
                  Edit3: TEdit;
                  Edit4: TEdit;
                  Edit5: TEdit;
                  Edit6: TEdit;
                  Button1: TButton;
                  Button2: TButton;
                  Button3: TButton;
                  Edit7: TEdit;
                  Edit8: TEdit;
                  Edit9: TEdit;
                  procedure Button1Click(Sender: TObject);
                  procedure Button2Click(Sender: TObject);
                  procedure Button3Click(Sender: TObject);
                private
                  { Private declarations }
                public
                  { Public declarations }
                end;

              var
                Form1: TForm1;

              implementation

              {$R *.dfm}
              function AddIntegers(a,b:integer):integer;
              external ‘project2.dll’

              function AddReals(c,d:real):real;
              external ‘project2.dll’

              function AddStringsFromDll(e,f:string):string;
              external ‘project2.dll’
              procedure TForm1.Button1Click(Sender: TObject);
              begin
              Edit7.Text:=IntToStr(AddIntegers(StrToInt(edit1.Text),StrToInt(Edit2.Text)));
              end;

              procedure TForm1.Button2Click(Sender: TObject);
              begin
              Edit8.Text:=FloatToStr(AddReals(StrToFloat(edit3.Text),StrToFloat(edit4.Text)));
              end;

              procedure TForm1.Button3Click(Sender: TObject);
              begin
              Edit9.Text:=AddStringsFromDll(edit5.Text,edit6.Text);
              end;
              end.

              6 Effective Ways to Fix Runtime 217 Error in Windows 10/8.1/8/7

              While running an application there can be a possibility that you come face to face with an error called Runtime Error 217. This error is irritating for Windows user as it prevents them from executing any program. This error 217 occurs when a user tries to run any installed application or software. Sometimes this error also appears when the user boots or start their computer.

              This error is one of the most irritating and dangerous error so it is necessary to get rid of this as soon as possible. Below are some of the methods given that will help you to fix Runtime Error 217 in Windows 10/8.1/8/7. But before discussing the methods first, let us find out what does runtime error 217 mean and the reason behind this error.

              What does Runtime Error 217 Mean?

              Runtime Error 217 can cause a big problem if you are using your computer for business purpose or you have stored any confidential data/documents in your system.

              This runtime error 217 is quite risky. It can slow down your PC performance, can lead your system to failure and crash, make your system vulnerable to hacker’s attack and also can corrupt important files on your system.

              Reason Behind Runtime Error 217

              There are several causes that can trigger the runtime error 217, few of them are:

              • When one or more DLL file gets misplaced or damaged or fail to register.
              • Improper installation of any program.
              • When Msvcrt.dll which is a Microsoft Visual C++ file gets damaged or outdated then this error code may appear.
              • Wrong regional settings may also generate a runtime error.
              • An outdated or damaged Stdole32.dll file.
              • Computer viruses or malware can also cause a runtime error.
              • Corrupted Windows registry entries
              • Outdated MS DCOM

              In order to fix this issue, you have to apply several solutions as there is more than one cause. Follow the below-given solutions one by one and check for the problem after applying each of them.

              How to Fix Runtime Error 217 in Windows 10/8.1/8/7

              Method 1: Perform Clean Boot

              • Press Windows + R key
              • Type “msconfig” and hit enter

              • Click on the “Services” tab, check the box “Hide all Microsoft services” and then click on “Disable all” option.
              • Click on Apply and then Click on OK.
              • Now, restart your computer.

              Method 2: Update Msvcrt.dll File

              Msvcrt.dll file belongs to Microsoft Visual C++ Runtime Library. Runtime error 217 is also known to appear on the systems that have an outdated msvcrt.dll file present in it.

              This specific file is used by third-party applications, but is usually outdated on older OS; resulting in runtime error 217.

              You can simply update this file by updating Windows.

              Follow the steps to update file:

              • Start your computer as an Admin
              • Press Windows + R key
              • Type wuauclt.exe /updatenow

              Note: This error also occurs when the MS DCOM file on the system is outdated. If this is the same case in with your, then updating Windows will also update the Msvcrt.dll file.

              Method 3: Correct the Regional Settings

              Incorrect regional settings can cause runtime error 217 Windows. In order to fix runtime error 217, you need to correct the regional settings. Follow the steps to do so:

              • Press Windows + R key
              • Type control panel and click OK

              • When the control panel opens up, Type Region in the search box
              • Click on Region and Language

              • When region and language applet appears, set the regional settings and correct them all.

              • After it is completed click OK

              Method 4: Disable Startup Programs

              If the runtime error 217 display on the screen right after the operating system gets started, then it means that the problem is caused by startup programs. It is possible that one or two programs are incompatible and may result in the error message. To correct this problem, first, you will need to identify and then disable the culprit program.

              Follow the steps given below to disable the startup programs:

              • Press Windows + R key
              • Type msconfig and click OK

              • Click on startup tab
              • Click on Disable all and then click OK

              After performing the steps restart your system, the runtime error should no longer appear.

              If no error appears, then repeat the process, until you encounter the runtime error 217. At this point, you should be able to locate which Startup program is causing the error. Then you can update or uninstall that particular program.

              Method 5: Run a Virus Scan

              Runtime errors are also known to occur on systems only when it has been infected with a virus/malware file that has corrupted key areas of OS, such as system files, boot sector, and program files. To avoid viruses from corrupting your system, you need to have a dependable antivirus tool installed and running on your computer. You should also run system scans on a daily basis so that it can detect and remove virus files that cause an error in your system.

              If you don’t have a good antivirus tool then it is recommended to use Spyhunter.

              Get Spyhunter to remove the virus and other malicious programs from your PC.

              Method 6: Run Registry Scan

              Windows registry is the main culprit for many errors that appears on your computer, not just runtime error 217. When any problems occur in the registry it can clear itself in a different number of ways, such as random error messages, degraded system performance, and constant windows restarting.

              To fix this error, you need to clear the registry keys. Cleaning the registry key is quite a time taking process and risky so it is recommended to use third party Registry Cleaner Tool.

              Get CCleaner to clean your Registry Entries

              Automatic Solution: PC Repair Tool

              Runtime error 217 is one of the common errors that appear on the windows system due to an internal issue. If you are not so technical person in computer and find the above methods difficult to perform then run PC Repair Tool. This tool will automatically fix every issue/error regarding PC.

              This Tool comes with the user interface so one can easily understand and run this tool without any hassle. It supports all Windows system and makes the performance of your PC as smooth as before.

              Get PC Repair Tool to fix PC issues.

              Conclusion

              Here I have provided you the relevant information on how to fix runtime error 217 Windows 10/8.1/8/7. Perform the above-given methods to overcome the error 217.

              Hope this article turns out to be helpful to you in solving your issue.

              Even after trying the methods the problem appears then it is recommended to use PC Repair Tool to fix the problem automatically.

              If you have any question or suggestion to give then feel free to visit us @ Facebook or Twitter.

              Hardeep has always been a Windows lover ever since she got her hands on her first Windows XP PC. She has always been enthusiastic about technological stuff, especially Artificial Intelligence (AI) computing. Before joining PC Error Fix, she worked as a freelancer and worked on numerous technical projects.

              Источник

              Runtime error at 8 217 format result longer than 4096 characters

              Pavelbej
              Дата 30.1.2007, 00:20 (ссылка) | (нет голосов) Загрузка .

              Опытный

              Профиль
              Группа: Участник
              Сообщений: 419
              Регистрация: 5.7.2005

              Репутация: нет
              Всего: 6

              Узучал менюшки, их оформление и все такое, все работало нормально, через какое-то время вдруг при запуске стала появлятся ошибка «Runtime error 217». Помогите разобратся, что это такое и куда копать. В Делфи появляется страница System с указанием на этот код:

              Код
              begin
              errorCode := errorCode and 127;
              if Assigned(ErrorProc) then
              ErrorProc(errorCode, ErrorAddr);
              if errorCode = 0 then //вот тут подчеркивание
              errorCode := InOutRes
              else if errorCode
              bems
              Дата 30.1.2007, 03:54 (ссылка) | (нет голосов) Загрузка .

              Эксперт

              Профиль
              Группа: Комодератор
              Сообщений: 3400
              Регистрация: 5.1.2006

              Репутация: 31
              Всего: 88

              Шустрый

              Профиль
              Группа: Участник
              Сообщений: 83
              Регистрация: 4.3.2006

              Репутация: 4
              Всего: 5

              В описании было что-то такое «STATUS_CONTROL_C_EXIT:217».
              Что это — не знаю. Не понимаю причем тут CONTROL_C.

              Насколько я знаю, Delphi-йская прога часто дает runtime error 217 когда ошибка возникает до инициализации
              SysUtils или сразу после ее финализации (сам не наблюдал).

              Когда эта ошибка возникала у меня:
              1. При работе с фришным XPMenu компонентом (очень часто!)
              2. Неправильный формат date (иногда, закономерности не выявил)
              3. Попытка доступа с сетевым ресурсам без достаточных привилегий (всегда)
              4. Инициализация BDE в сети с неверным путем (почти всегда)

              dimazu
              Дата 30.1.2007, 07:34 (ссылка) | (нет голосов) Загрузка .
              Pavelbej
              Дата 30.1.2007, 09:56 (ссылка) | (нет голосов) Загрузка .

              Опытный

              Профиль
              Группа: Участник
              Сообщений: 419
              Регистрация: 5.7.2005

              Репутация: нет
              Всего: 6

              В последний раз я удалил из проекта XPMenu, и добавил код который нашел на этом форуме, чтобы красивое меню сделать, и все работало, но после нескольких запусков все и началось. Удалил Дельфи и все сторонние компоненты, поставил заново только необходимое для проекта и ничего все таже проблема.

              При запуске показывает «Project Project1.exe raised exception class ERangeError with message ‘Range check error’.

              CatATonik
              Дата 30.1.2007, 10:02 (ссылка) | (нет голосов) Загрузка .

              Шустрый

              Профиль
              Группа: Участник
              Сообщений: 95
              Регистрация: 12.1.2007
              Где: Москва

              Репутация: 6
              Всего: 8

              Pavelbej
              Дата 30.1.2007, 15:06 (ссылка) | (нет голосов) Загрузка .

              Опытный

              Профиль
              Группа: Участник
              Сообщений: 419
              Регистрация: 5.7.2005

              Репутация: нет
              Всего: 6

              CatATonik, ну я не так уж и хорошо знаю Делфи и вообще программирование, непонятно о чем ты.

              Народ помогите, невозможно дальше работать. Че Виндозу уже переустановить? Вроде бы изза этих меню все случилось, но поставил все заново и все равно не хочет фунциклировать. Очень надо, уже день бездельничаю.

              CatATonik
              Дата 30.1.2007, 15:24 (ссылка) | (нет голосов) Загрузка .

              Шустрый

              Профиль
              Группа: Участник
              Сообщений: 95
              Регистрация: 12.1.2007
              Где: Москва

              Репутация: 6
              Всего: 8

              Pavelbej
              Дата 30.1.2007, 15:33 (ссылка) | (нет голосов) Загрузка .

              Опытный

              Профиль
              Группа: Участник
              Сообщений: 419
              Регистрация: 5.7.2005

              Репутация: нет
              Всего: 6

              Цитата(CatATonik @ 30.1.2007, 15:24 )
              Когда вываливается ошибка нажимаешь Ctrl+Alt+S, появится окошко Call Stack, это список вызовов функций в которых возникла ошибка. Т.е. если у тебя ошибка в функции f3 которая вызвается из функция f2 та из f1, то будет список f3, f2, f1. Сможешь увидеть где у тебя ошибка.

              понял, но показывает то что я уже написал в первом посте: указывает на модуль System и подчеркивает строку

              Код
              if errorCode = 0 then
              CatATonik
              Дата 30.1.2007, 15:47 (ссылка) | (нет голосов) Загрузка .

              Шустрый

              Профиль
              Группа: Участник
              Сообщений: 95
              Регистрация: 12.1.2007
              Где: Москва

              Репутация: 6
              Всего: 8

              Pavelbej
              Дата 30.1.2007, 16:19 (ссылка) | (нет голосов) Загрузка .

              Опытный

              Профиль
              Группа: Участник
              Сообщений: 419
              Регистрация: 5.7.2005

              Репутация: нет
              Всего: 6

              Код
              if smallTab <> nil then begin
              for i:= low(smallTab^) to high(smallTab^) do // остановка здесь и на нижней строке
              smallTab[i] := nil;
              CatATonik
              Дата 30.1.2007, 16:35 (ссылка) | (нет голосов) Загрузка .

              Шустрый

              Профиль
              Группа: Участник
              Сообщений: 95
              Регистрация: 12.1.2007
              Где: Москва

              Репутация: 6
              Всего: 8

              Pavelbej
              Дата 30.1.2007, 16:57 (ссылка) | (нет голосов) Загрузка .

              Опытный

              Профиль
              Группа: Участник
              Сообщений: 419
              Регистрация: 5.7.2005

              Репутация: нет
              Всего: 6

              Что посоветуеш? Что это значит?

              CatATonik
              Дата 30.1.2007, 17:10 (ссылка) | (нет голосов) Загрузка .

              Шустрый

              Профиль
              Группа: Участник
              Сообщений: 95
              Регистрация: 12.1.2007
              Где: Москва

              Репутация: 6
              Всего: 8

              Beltar
              Дата 30.1.2007, 17:39 (ссылка) | (нет голосов) Загрузка .

              Опытный

              Профиль
              Группа: Участник
              Сообщений: 627
              Регистрация: 11.1.2006

              Репутация: 3
              Всего: 7

              Что-то ты делаешь тут мегасложное.
              Кстати.

              In Delphi, ErrorProc is a procedure variable pointing to the runtime error handler. The standard ErrorProc procedure reports the runtime error and terminates the program.

              The ErrorProc variable is retained primarily for compatibility with older code. Newer applications should not specify an alternate runtime error procedure using ErrorProc as SysUtils uses this variable to convert runtime errors into exceptions.
              If you use SysUtils in your program, it will force ErrorProc to its own routine and convert the runtime error into an exception. When a runtime library error occurs, the ErrorProc is called. The ErrorCode parameter contains the runtime error number and the ErrorAddr parameter contains the machine code address that caused the runtime error.

              Т. е. с ней связываться не рекомендуется. Почему ты не используешь try except?

              Шустрый

              Профиль
              Группа: Участник
              Сообщений: 83
              Регистрация: 4.3.2006

              Репутация: 4
              Всего: 5

              Унинсталируй нафиг Jedi
              Oни используют ХР меню компонент и
              кроме того (по просьбе ) устанавливают редакторы пропертиз.
              Отредактируй dclusr и убери из него даже
              упоминание о сторонних компонентах.

              Если и после этого будет ошибка, то будем удалять дальше.

              dimazu
              Дата 30.1.2007, 22:08 (ссылка) | (нет голосов) Загрузка .

              1. Публиковать ссылки на вскрытые компоненты

              2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

              • Литературу по Дельфи обсуждаем здесь
              • Действия модераторов можно обсудить здесь
              • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
              • Вопросы по реализации алгоритмов рассматриваются здесь
              • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи

              Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

              Правила форума «Delphi: Общие вопросы»
              0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
              0 Пользователей:
              « Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

              [ Время генерации скрипта: 0.1408 ] [ Использовано запросов: 21 ] [ GZIP включён ]

              Источник

              Adblock
              detector

              INTELLIGENT WORK FORUMS
              FOR COMPUTER PROFESSIONALS

              Contact US

              Thanks. We have received your request and will respond promptly.

              Log In

              Come Join Us!

              Are you a
              Computer / IT professional?
              Join Tek-Tips Forums!

              • Talk With Other Members
              • Be Notified Of Responses
                To Your Posts
              • Keyword Search
              • One-Click Access To Your
                Favorite Forums
              • Automated Signatures
                On Your Posts
              • Best Of All, It’s Free!

              *Tek-Tips’s functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

              Posting Guidelines

              Promoting, selling, recruiting, coursework and thesis posting is forbidden.

              Students Click Here

              Runtime Error 217 at 004536FF…any ideas??!

              Runtime Error 217 at 004536FF…any ideas??!

              (OP)

              27 Jan 10 04:59

              Hi All,

              Thanks for taking the time to read the post, here’s whats happend;

              I’ve written a tutorial example of code which loads a Text file into a Dynamic Array.

              the problem is that at runtime I get the following;

              «Runtime Error 217 at 004536FF».

              When I tried to fix this myself the solution lead me to a help file that said this was a fatal I/O error caused by an ‘EControlC’ event. I then found out that this means that I pushed ‘Ctrl + C’.

              But here is the catch….i didn’t!!!! smile

              It would be a great help if anyone could shed any light on this…?

              Thanks to all,

              Kay   

              Red Flag Submitted

              Thank you for helping keep Tek-Tips Forums free from inappropriate posts.
              The Tek-Tips staff will check this out and take appropriate action.

              Join Tek-Tips® Today!

              Join your peers on the Internet’s largest technical computer professional community.
              It’s easy to join and it’s free.

              Here’s Why Members Love Tek-Tips Forums:

              • Tek-Tips ForumsTalk To Other Members
              • Notification Of Responses To Questions
              • Favorite Forums One Click Access
              • Keyword Search Of All Posts, And More…

              Register now while it’s still free!

              Already a member? Close this window and log in.

              Join Us             Close

              Понравилась статья? Поделить с друзьями:

              Читайте также:

            • Delete failed internal error adb
            • Del ошибка на стиральной машине lg
            • Deh 1500ubg amp error
            • Deftones error перевод песни
            • Deftones error lyrics

            • 0 0 голоса
              Рейтинг статьи
              Подписаться
              Уведомить о
              guest

              0 комментариев
              Старые
              Новые Популярные
              Межтекстовые Отзывы
              Посмотреть все комментарии