Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Использование dll из res файла.. как?!


Автор: Scope 11.7.2008, 17:21
Имеем файл pdf.dll, без исходников. Имеем процедуры и функции, записаные в отдельном pdfhdr.pas файле, обращающиеся к этой библиотеке.

Кусок кода: 
Код


unit pdfhdr;

interface

uses
  Windows, Classes, Graphics, ShellAPI;


blablablablabla
blablablablabla
blablablablabla


implementation

  procedure RolePDFBeginDoc(License, FileName, Title, Author, Subject, Keywords,
    Creator: PChar; PageWidth, PageHeight: integer);
    stdcall;

  external 'pdf.dll';


  procedure RolePDFNewPage; stdcall; external 'pdf.dll';
  procedure RolePDFEndDoc; stdcall; external 'pdf.dll';
  function RolePDFGetDC: HDC; stdcall; external 'pdf.dll';
  function RolePDFPageCount: integer; stdcall; external 'pdf.dll';
  function RolePDFPageWidth: integer; stdcall; external 'pdf.dll';
  function RolePDFPageHeight: integer; stdcall; external 'pdf.dll';
  function RolePDFAddOutline(Title: PChar; ParentID, PageNo, Top: integer):
    integer; stdcall; external 'pdf.dll';

procedure Register;
begin
  RegisterComponents('Roledata', [TRolePDF]);
end;

constructor TRolePDF.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FLicense := TStringList.Create;
  FCanvas := TCanvas.Create;
  PageSize := psA4;
end;

destructor TRolePDF.Destroy;
begin
  FLicense.Free;
  FCanvas.Free;
  inherited Destroy;
end;

procedure TRolePDF.SetOrientation(Value: TPageOrientation);

  procedure swap;
  var
    n: integer;
  begin
    n := FPageWidth;
    FPageWidth := FPageHeight;
    FPageHeight := n;
  end;

begin
  FOrientation := Value;
  if FOrientation = poPortrait then begin
    if FPageWidth > FPageHeight then swap;
  end
  else begin
    if FPageWidth < FPageHeight then swap;
  end;
end;


blablablablabla


procedure TRolePDF.NewPage;
begin
  RolePDFNewPage;
end;


blablablablabla
blablablablabla
blablablablabla




pdf.dll скомпилен в res файл:
pdfdll.rc=
Код

pdfdll RCDATA "pdf.dll"


Вопрос- каким образом переделать код pdfhdr, чтоб он обращался к dll'ке в res файле?

Автор: bartram 11.7.2008, 17:36
Цитата(Scope @  11.7.2008,  19:21 Найти цитируемый пост)
Вопрос- каким образом переделать код pdfhdr, чтоб он обращался к dll'ке в res файле? 

Насколько я знаю - никак. Сначала распаковываешь длл из ресурсов, а уже потом обращаешься к её функциям.

Автор: Scope 11.7.2008, 17:41
Ага.. даже так.. и как это реализовать?

Автор: aktuba 11.7.2008, 18:08
Цитата(Scope @  11.7.2008,  18:41 Найти цитируемый пост)
Ага.. даже так.. и как это реализовать? 

А зачем ты ее в ресурсы то запихнул???

Автор: Scope 11.7.2008, 19:15
Зачем- изучаю возможности языка, цель- минимум "мусора", один ехе.

По идее dll можно распаковывать в память, вопрос- как это сделать? Работает ли Delphi 2007 корректно с этой функцией? Знаю что в 5 и 6 были утечки памяти.

Автор: aktuba 11.7.2008, 20:38
Цитата(Scope @  11.7.2008,  20:15 Найти цитируемый пост)
Зачем- изучаю возможности языка, цель- минимум "мусора", один ехе.

 smile DLL как относится к языку Delphi???

Скажем так - если есть желание запихнуть все в один exe-файл, то это не проблема. Но вот распаковывать такие вещи лучше на диск, а не в память.

Цитата(Scope @  11.7.2008,  20:15 Найти цитируемый пост)
Работает ли Delphi 2007 корректно с этой функцией? Знаю что в 5 и 6 были утечки памяти. 

Ты про какую функцию?

Автор: MetalFan 11.7.2008, 21:01
стандартными методами загрузить dll в память без использования LoadLibrary(Ex) не выйдет. но есть нестандартные решения...

Автор: Scope 11.7.2008, 22:26
Цитата(aktuba @ 11.7.2008,  20:38)
smile DLL как относится к языку Delphi???

Скажем так - если есть желание запихнуть все в один exe-файл, то это не проблема. Но вот распаковывать такие вещи лучше на диск, а не в память.

Ты про какую функцию?

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

И каким образом это можно сделать, а потом убить распакованный файл?

Я про функции записи в память и успешного её высвобождения в дальнейшем.

Автор: bartram 11.7.2008, 23:11
Цитата(Scope @  12.7.2008,  00:26 Найти цитируемый пост)
Я про функции записи в память и успешного её высвобождения в дальнейшем. 

Распаковывание dll в память, не очень хороший стиль программирование, а почему не на диск распаковывать?

Автор: aktuba 11.7.2008, 23:22
Цитата(Scope @  11.7.2008,  23:26 Найти цитируемый пост)
Я не пойму- почему Вы так цепляетесь к словам?

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

Автор: Scope 12.7.2008, 10:26
Прога по сути для составления отчётов для бухгалтерии, задача максимально скрыть от пользователя файлы не стоит.

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

Автор: Alkash 12.7.2008, 20:52
Юзать temp файлы.

Автор: bems 14.7.2008, 17:09
FindResource, LoadResource, LockResource, TFileStream, DeleteFile

Автор: MetalFan 14.7.2008, 17:43
Цитата(bems @  14.7.2008,  17:09 Найти цитируемый пост)
FindResource, LoadResource, LockResource

TResourceStream ?  smile 

Автор: bems 14.7.2008, 18:07
Цитата(MetalFan @  14.7.2008,  17:43 Найти цитируемый пост)
TResourceStream ?

или так (с) Отец Народов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)