Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Delphi x64
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.01.2023, 18:45
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение как прописать в DLL код загрузки

Здравствуйте! как процедуру упаковать в dll на 64б D11 Alex
под 32б работает отлично, но на 64б пишет не найдет файл.
может и сам код устарел.? нужно чтобы большой файл (огромный), загружался в memo и это отображалась в progressbar
пр:
Код:
procedure TForm1.LoadFile(const FileName: string);
const
  BufferSize = 65536;
var
  StrBuffer: array[0..BufferSize - 1] of Char;
  F: file;
  MemoryStream: TMemoryStream;
  Result, Max, Curr, Progress: Integer;
begin
  AssignFile(F, FileName);
  Reset(F, 1);
  Curr := 0;
  Max := FileSize(F) div BufferSize + 1;
  MemoryStream := TMemoryStream.Create;
  try
    repeat
      BlockRead(F, StrBuffer, BufferSize, Result);
      MemoryStream.Write(StrBuffer, Result);
      Inc(Curr);
      Progress := Curr * 100 div Max;
      ProgressBar1.Position	 := Progress;
      Application.ProcessMessages;
    until Result <= 0;

    MemoryStream.Seek(0, soBeginning);
    Memo1.Lines.LoadFromStream(MemoryStream);
  finally
    MemoryStream.Free;
  end;
  CloseFile(F);
  ProgressBar1.Position	 := 0;
  form1.Caption:= ' Super_dll' + inttostr(Memo1.Lines.Count);
  Button1.Enabled:=true;
 // form1.progressbar4.Position:=0;
 end;
здесь устраивает сама загрузка из файла, НО не устраивает как это показано в progressbar
таким же образом можно :
Код:
function GetFileSize(FileName: string): Int64;
var f:TMemoryStream;SizeOfApp: Int64;
begin
    F:=TMemoryStream.Create;
try
    F.LoadFromFile(FileName);
    form1.ProgressBar1.Max:=F.Size;
    form1.ProgressBar1.Position:=F.Size;
    form1.memo1.Lines.LoadFromStream(f);
   // F.Seek(0, soBeginning);
  finally
   form1.Caption:= inttostr(SizeOfApp);
    F.Free;
end;
end;
сначала загрузит а потом отобразит
Может кто подсказать как это сделать по байтам. пр: файл весит 500кб значит progressbar.max=500;
и кусками загружать с отображением сколько байт загрузилось ....
НЕ Progressbar=progressbar+1
Ответить с цитированием
  #2  
Старый 31.01.2023, 21:41
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка супер способ

есть такой способ
Код:
procedure TForm1.ReadMyFile;
var
  i, j: integer; s:string;
begin
  ProgressBar1.Max := GetFileSize('send2100816.txt');
  ProgressBar1.position := 0;
  assignfile(f, 'send2100816.txt');
  Canceled := False;
  reset(f);
  i := 0;
  j := 0;
  while not eof(f) do
  begin
    inc(j);
    readln(f, s);
    i := i + length(s) + 2;
    if (j mod 1000) = 0 then
    begin
      ProgressBar1.position := i;
      Application.ProcessMessages;
      if canceled then
        break;
    end;
    memo1.Lines.Add(s);
  end;
  CloseFile(f);
end;
я успел попить чай, пройтись два раза во круг дома ....
Ответить с цитированием
  #3  
Старый 02.02.2023, 21:39
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Печаль проба

Код:
procedure LoadFile(FileName: TFileName);
var
 MemStr: TMemoryStream;
 Title: String;
begin
 MemStr:= TMemoryStream.Create;
 try
  MemStr.LoadFromFile(FileName);
  MemStr.Seek(0, soFromBeginning);
  //Title := ReadStreamStr( MemStr );
 finally
   MemStr.Free;
  end;
end;
exports
  LoadFile index 1;
begin
end.
Код:
function LoadFile(FileName: TFileName); external 'project1.dll' index 1;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadFile('111111.txt');
 memo1.Lines.LoadFromFile(LoadFile);
 ProgressBar1.position:= LoadFile;
end;
Ответить с цитированием
  #4  
Старый 03.02.2023, 15:15
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Я вот не понимаю для чего такие трудности. Вы же имеете дело с простым текстовым файлом, который собираетесь отображать в Memo, у которого собственная процедура LoadFromFile, работающая через TFileStream, прекрасно с этим справится.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    begin
      Memo1.Clear;
      Memo1.Lines.BeginUpdate;
      Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
      Memo1.Lines.EndUpdate;
    end;
end;
Любая визуализация значительно замедляет процессы. При загрузке больших файлов можно сообщать пользователю, что это займет некоторое время. Этого будет вполне достаточно.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #5  
Старый 03.02.2023, 16:29
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Лампочка загрузить

загрузить просто текстовый документ проблем нет.
я его гружу чуть по другому через функцию.
Код:
 function LoadFile(FileName: TFileName):string;
var
 MemStr: TMemoryStream;  i:integer;
 Title: String;
begin
 MemStr:= TMemoryStream.Create;
 try
  MemStr.LoadFromFile(FileName);
  MemStr.Seek(0, soFromBeginning);
  //Title := ReadStreamStr( MemStr );
 finally
   MemStr.Free;
  end;
end;
проблема, что не могу сообразить, чтобы функция возвращала что нибудь в замен.
пр:
label1.caption:= MemStr.size;
и
memo1.Lines.LoadFromStream(LoadFile);
Ответить с цитированием
  #6  
Старый 09.02.2023, 19:19
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка ошибка_DLL_64

опять ошибки на 64бит, под 32бит все отлично. на 64 глюк
Код:
library Project1;
uses
  System.SysUtils,
  System.Classes;

{$R *.res}
function LoadFile(const FileName: TFileName):string;
var
  MemStr: TStringStream;
begin
  MemStr:= TStringStream.Create;
  try
    MemStr.LoadFromFile(FileName);
    MemStr.Seek(0, soFromBeginning);
    Result := MemStr.DataString;
  finally
    MemStr.Free;
  end;
end;

function SaveFile(const FileName: TFileName; text:string):string;
var
  MemSave: TStringStream;
begin
  MemSave:= TStringStream.Create;
  try
    MemSave.WriteString(text);
    MemSave.savetofile(FileName);
  finally
    MemSave.Free;
  end;
end;
exports
  LoadFile, SaveFile;
begin
end.
супер_кнопка
Код:
with OpenDialog1 do
    if Execute then memo1.Lines.Text:=LoadFile(OpenDialog1.FileName);
Ответить с цитированием
  #7  
Старый 09.02.2023, 19:23
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
По умолчанию ошибки_2

ошибки: Project Project1.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
d1.jpg
d2a.jpg
Ответить с цитированием
  #8  
Старый 09.02.2023, 19:49
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение делаю так

делаю так:
Код:
MemStr.LoadFromFile(FileName);
    MemStr.Seek(0, soFromBeginning);
    Result := '111111111';
все отлично а
Цитата:
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
Result := MemStr.DataString;
Глюк
Ответить с цитированием
  #9  
Старый 09.02.2023, 20:21
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Смех ANSI

документ перекодировал в ANSI и заработало (( это теперь так каждый текст придется ? а ошибка говорит что нужно освобождать память которую беру из dll как я понял
Ответить с цитированием
  #10  
Старый 09.02.2023, 20:30
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Счастье Ответ

ShortString= правильный ответ
Ответить с цитированием
  #11  
Старый 09.02.2023, 21:14
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Лампочка еррор

забивается - ошибки: два раза файл не откроешь
Ответить с цитированием
  #12  
Старый 10.02.2023, 09:45
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Восклицание

ошибка возникает когда я открываю маленькие файлы кб если файл открываю 5 мб работает, меньше глюк.
and dword ptr [r8 + rdx * 4], eax

Последний раз редактировалось leon2009, 10.02.2023 в 10:33.
Ответить с цитированием
  #13  
Старый 10.02.2023, 13:33
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение File

если функция находится в форме = то все отлично работает, но если функция уже в DLL _= то файлы которые меньше 164000 б = выскакивает ошибка (выше).
Ответить с цитированием
  #14  
Старый 10.02.2023, 19:27
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,055
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если правильно помню, то там с передачей строк из/в dll есть заморочка. Надо добавить в uses специальный модуль. Или передавать как PChar и, соответсвенно, танцы с выделением и освобождением памяти.
Ответить с цитированием
  #15  
Старый 11.02.2023, 08:06
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка ошибка_DLL_64_Memory

Когда передаешь Pchar -> Китайские иероглифы в мемо.
если возможность почистить блок? в моем случае.
Код:
function LoadFile(const FileName: TFileName):String; stdcall;
var
  MemStr: TStringStream;
begin
  MemStr:= TStringStream.Create;
  try
    MemStr.LoadFromFile(FileName);
    MemStr.Seek(0, soFromBeginning);
    if MemStr.Size >= 262144 then Result := MemStr.DataString
    else Result:='File_Size_Error '+inttostr(MemStr.Size);
    finally
    MemStr.Free;
  end;
end;
или выделять небольшие блоки, только я столкнулся, если файл большой, то можно сходить за кофе

Последний раз редактировалось leon2009, 11.02.2023 в 08:10.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter