|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
как прописать в 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; таким же образом можно : Код:
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
|
|||
|
|||
супер способ
есть такой способ
Код:
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
|
|||
|
|||
проба
Код:
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
|
||||
|
||||
Я вот не понимаю для чего такие трудности. Вы же имеете дело с простым текстовым файлом, который собираетесь отображать в 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
|
|||
|
|||
загрузить
загрузить просто текстовый документ проблем нет.
я его гружу чуть по другому через функцию. Код:
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
|
|||
|
|||
ошибка_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); |
#8
|
|||
|
|||
делаю так
делаю так:
Код:
MemStr.LoadFromFile(FileName); MemStr.Seek(0, soFromBeginning); Result := '111111111'; Цитата:
|
#9
|
|||
|
|||
ANSI
документ перекодировал в ANSI и заработало (( это теперь так каждый текст придется ? а ошибка говорит что нужно освобождать память которую беру из dll как я понял
|
#10
|
|||
|
|||
Ответ
ShortString= правильный ответ
|
#11
|
|||
|
|||
еррор
забивается - ошибки: два раза файл не откроешь
|
#12
|
|||
|
|||
ошибка возникает когда я открываю маленькие файлы кб если файл открываю 5 мб работает, меньше глюк.
and dword ptr [r8 + rdx * 4], eax Последний раз редактировалось leon2009, 10.02.2023 в 10:33. |
#13
|
|||
|
|||
File
если функция находится в форме = то все отлично работает, но если функция уже в DLL _= то файлы которые меньше 164000 б = выскакивает ошибка (выше).
|
#14
|
|||
|
|||
Если правильно помню, то там с передачей строк из/в dll есть заморочка. Надо добавить в uses специальный модуль. Или передавать как PChar и, соответсвенно, танцы с выделением и освобождением памяти.
|
#15
|
|||
|
|||
ошибка_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. |