Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / stack overflow when LoadFromStream / 10 сообщений из 10, страница 1 из 1
18.05.2017, 00:23:46
    #39455058
Delphi159
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
В интернете нашёл исходник модуля для разграничения прав доступа.
( http://www.interface.ru/home.asp?artId=17969)

FormCreate процедура загружает права доступа из rights.txt файла:
https://mega.nz/#!PclAVRzL!Sap6M1-d2su6rigyCWaBAfl224BlBgW88LsI0oAYcxo


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TRightsForm.FormCreate(Sender: TObject);
    var f: TResourceStream;
    begin
      mode := 1;
    // загружаем данные о правилах из ресурса.
      f := TResourceStream.create(Hinstance, 'rigths',  RT_RCDATA));
      try
        LoadFromStream(f);
      finally
        f.free;
      end;}
    {$IFDEF isadmin}
      RightsView.PopupMenu := PopupMenu1;
    {$ENDIF
    end;



В папке проекта есть "rights.txt" файл. В Delphi 10.1 berlin создаю "rights.rc" файл, {$R 'rigths.res' 'rigths.rc'} появляется в project1.dpr, проект компилируется но при выполнении оператор LoadFromStream(f) выводит ощибку stackoverflow. При этом в RT_RCDATA " "

Ссылка на архив
...
Рейтинг: 0 / 0
18.05.2017, 01:45:11
    #39455063
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
Delphi159,

А зачем ты заставляешь уже созданную форму загружаться из ресурса, причем в качестве ресурса ты форме подпихиваешь файл в незнамо каком формате?
...
Рейтинг: 0 / 0
18.05.2017, 12:16:44
    #39455318
Delphi159
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
DarkMaster,
на несколько минут программа заработала и потом вдруг stackoverflow.
Вот код процедуры LoadFromStream:

Код: pascal
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.
procedure TRightsForm.LoadFromStream(const T: Tstream; parent: Ttreenode = nil; count: word = 0);
var x, y: integer;
  n: Ttreenode;

  function loadnode: word;
  var s, s1: string;
    len: byte;
    dt: TrightData;
  begin
    t.read(len, 1); if len > 1 then begin setlength(s, len); t.read(s[1], len); end;
    t.read(len, 1); if len > 1 then begin setlength(s1, len); t.read(s1[1], len); end;
    t.read(result, 2);
    if parent = nil then n := RightsView.Items.AddFirst(nil, s) else
      n := RightsView.Items.AddChild(parent, s);
    dt := TrightData.Create(s1);
    if dt.IsNull then n.ImageIndex := 2 else n.ImageIndex := abs(mode - 1);
    n.SelectedIndex := n.ImageIndex;
    n.Data := dt;
  end;

begin
  RightsView.Items.BeginUpdate;
  if parent = nil then begin
    repeat
      y := loadnode; if y > 0 then LoadFromStream(T, n, y);
    until t.Position >= t.Size;
  end else
  begin
    for x := 0 to count - 1 do begin y := loadnode; if y > 0 then LoadFromStream(T, n, y); end;
  end;
  RightsView.Items.EndUpdate;
end;
...
Рейтинг: 0 / 0
18.05.2017, 12:48:12
    #39455347
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
Delphi159,

почему не можете отладить код?
...
Рейтинг: 0 / 0
18.05.2017, 14:47:05
    #39455441
Delphi159
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
goldmi45Delphi159,

почему не можете отладить код?
вот поэтому:
...
Рейтинг: 0 / 0
18.05.2017, 15:29:43
    #39455469
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
Delphi159,

string в Berlin юникодный. А какой в ресурсе?
...
Рейтинг: 0 / 0
18.05.2017, 15:43:13
    #39455479
Delphi159
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
goldmi45Delphi159,

string в Berlin юникодный. А какой в ресурсе?

в ресурсе записал только 'ABCD EFGH' и сохранил в utf-8 но всё равно никак...
...
Рейтинг: 0 / 0
18.05.2017, 20:22:03
    #39455656
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
Delphi159,

если в отладке такое показывается вместо строк, то строка или объект не инициализированы или уже были уничтожены.
...
Рейтинг: 0 / 0
18.05.2017, 20:59:40
    #39455667
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
JaDi,

Нет. Он прочитал из стрима ансишную строку и записал ее в юникодную
...
Рейтинг: 0 / 0
18.05.2017, 21:26:45
    #39455679
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
stack overflow when LoadFromStream
_Vasilisk_,

нет, в представленном скриншоте отображается мусор. Если посмотреть на код и оригинальные данные, то они записаны в бинарном формате с ДЛИНОЙ. Т.е. сначала идет байт с длиной, а потом все содержимое строки. У автора этого байта нет -- он зафигачил сразу текст, и длина берется из кода символа A (или первого байта метки utf-8, если он и ее умудрился сохранить в текстовом редакторе). Эта длина, естественно, намного больше реальных данных -- поэтому при выставлении размера строки и чтении -- строка вначале чем-то заполяется (может теми самыми анси-символами из utf-байтов), а остальная часть является мусором из памяти -- что и видно на экране.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / stack overflow when LoadFromStream / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]