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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 85 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2023, 21:04   #1
leon2009sp
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 56
Вопрос как упаковать код в dll

Здравствуйте! как код упаковать в dll
Код:
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;
Спасибо!
leon2009sp вне форума Ответить с цитированием
Старый 24.01.2023, 21:54   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,380
По умолчанию

Создаете проект DLL, вставляете код в него как есть, переименовываете процедуру в LoadFile, а в конце дописываете
Код:
exports
  LoadFile index 1;
Еще стоит убрать строки
Код:
    Memo1.Lines.LoadFromStream(MemoryStream);
// ...
  ProgressBar1.Position	 := 0;
  form1.Caption:='Super DLL: ' + inttostr(Memo1.Lines.Count);
  Button1.Enabled:=true;
 // form1.progressbar4.Position:=0;
или перенести форму в DLL целиком.
macomics на форуме Ответить с цитированием
Старый 25.01.2023, 17:01   #3
leon2009sp
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 56
Счастье ошибка

ошибку выдает:
DLL
Код:
procedure 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:='dll super ' + inttostr(Memo1.Lines.Count);
 // Button1.Enabled:=true;
 // form1.progressbar4.Position:=0;
 end;
exports
LoadFile index 1;
forma
Код:
var
  Form1: TForm1;
  LibHandle: THandle;
  function LoadFile(const FileName: string):string;
  external 'Project1' index 1;
implementation

procedure TForm1.Button1Click(Sender: TObject);

begin
    with OpenDialog1 do
    if Execute then LoadFile(OpenDialog1.FileName);

end;
и если не убирать
Код:
 // ProgressBar1.Position	 := 0;
 // form1.Caption:='dll super ' + inttostr(Memo1.Lines.Count);
 // Button1.Enabled:=true;
 // form1.progressbar4.Position:=0;
то только форму к длл ???
leon2009sp вне форума Ответить с цитированием
Старый 25.01.2023, 17:09   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,380
По умолчанию

Так вы определитесь с функционалом. Естественно вы из функции убрали строки, которые выполняли полезную работу.

Ее можно переделать, передавая в функцию объект TMemoryStream как параметр, в который функция и будет загружать файл, а после можно из этого объекта считать данные в Memo1 на форме.

Или можно вернуть убранные строки и перенести код формы в dll, тогда создание формы придется делать вручную. Но для этого достаточно просто добавить в exports у dll еще одну функцию, которая будет создавать форму и вызвать ее при запуске программы.
macomics на форуме Ответить с цитированием
Старый 26.01.2023, 17:56   #5
leon2009sp
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 56
По умолчанию

т.е. чтобы оставить progressbar в dll нужно в dll перенести форму и по другому ни как:?
leon2009sp вне форума Ответить с цитированием
Старый 26.01.2023, 18:17   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,380
По умолчанию

Так по алгоритму получается, что не ProgressBar в нем главный. А загрузка файла в Memo.
Если хотите, тогда можете сделать CallBack функцию, которую передавать как параметр в LoadFile и вызывать ее для обновления ProgressBar
Код:
type TCallBack = procedure (progress, total: Cardinal);

procedure LoadFile(var MemoryStream: TMemoryStream; const FileName: string; cbProgress: TCallBack);
const
  BufferSize = 65536;
var
  StrBuffer: array[0..BufferSize - 1] of Char;
  F: file;
  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; // Это все будет в cbProgress
      // ProgressBar1.Position	 := Progress;
      // Application.ProcessMessages;
      cbProgress(Curr, Max);

    until Result <= 0;

    MemoryStream.Seek(0, soBeginning);
    // Memo1.Lines.LoadFromStream(MemoryStream); // А это надо будет сделать после вызова функции. Это та самая полезная работа
  finally
    // MemoryStream.Free; // Освобождение надо будет так же сделать после вызова функции LoadFile
  end;
  CloseFile(F);
  cbProgress(0, Max); // ProgressBar1.Position	 := 0;
  //  form1.Caption:='Super DLL: ' + inttostr(Memo1.Lines.Count);
  //  Button1.Enabled:=true;
  // form1.progressbar4.Position:=0;
 end;

exports
  LoadFile index 1;
Код:
type TCallBack = procedure (Curr, Max: Cardinal);

var
  Form1: TForm1;
  LibHandle: THandle;
  function LoadFile(var MemoryStream: TMemoryStream; const FileName: string; cbProgress: TCallBack):string; external 'Project1.dll' index 1; // Необходимо точно указывать имя файла во избежании недоразумений.
implementation

procedure cbProgress(Curr, Max: Cardinal);
begin
   Form1.ProgressBar1.Position := Curr * 100 div Max;
   Application.ProcessMessages;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
begin
    with OpenDialog1 do
      if Execute then begin
         MS := TMemoryStream.Create;
         LoadFile(MS, FileName, @cbProgress);
         Memo1.Lines.LoadFromStream(MS);
         MS.Free;
      end;
end;

Последний раз редактировалось macomics; 26.01.2023 в 18:19.
macomics на форуме Ответить с цитированием
Старый 27.01.2023, 17:36   #7
leon2009sp
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 56
По умолчанию

почему ругается на 64 битном?
leon2009sp вне форума Ответить с цитированием
Старый 27.01.2023, 17:54   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,380
По умолчанию

На какие именно строчки ругается и что при это написано в окне сообщений с ошибками.
macomics на форуме Ответить с цитированием
Старый 27.01.2023, 19:14   #9
leon2009sp
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 56
Сообщение error

на 32б работает отлично на 64 = стопорит. если открывать не через delphi напрямую,
то пишет не может найти файл.
Изображения
Тип файла: jpg d1.jpg (26.6 Кб, 5 просмотров)
Тип файла: jpg d2.jpg (96.8 Кб, 4 просмотров)
leon2009sp вне форума Ответить с цитированием
Старый 27.01.2023, 19:17   #10
leon2009sp
Пользователь
 
Регистрация: 22.12.2015
Сообщений: 56
По умолчанию

нет файла
Изображения
Тип файла: jpg d3.jpg (10.9 Кб, 5 просмотров)
leon2009sp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме 85 тыс рублей в месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Упаковать файл в exe rainbow Общие вопросы Delphi 10 30.10.2013 20:50
как упаковать страничку? maxvip HTML и CSS 1 14.04.2011 08:49
Как упаковать прогу (инсталлятор) HAMMAN Софт 5 06.06.2008 18:32
Помогите упаковать БД Евгений_нн БД в Delphi 2 21.02.2007 23:00