Как отобразить фоновое изображение и центрировать панель в форме DLL? - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу загрузить изображение, которое будет фоном развернутой формы, которая остается в dll.

DLL вызывается из приложения Vcl, но возникают проблемы, когда невозможно загрузить фоновое изображение.в форме dll всегда вылетает.

Спасибо вам за помощь.

==========================================================================

Исполняемый файл

unit Unit2;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  end;

var
  Form2: TForm2;

implementation  {$R *.dfm}

procedure LoadDLL;
type
  TShowformPtr = procedure; stdcall;
var
  HDLL: THandle;
  Recv: TShowformPtr;
begin
  HDLL := LoadLibrary('lib.dll');
  if HDLL <> 0 then
  begin
    @Recv := GetProcAddress(HDLL, 'Recv');
    if @Recv <> nil then
    Recv;
  end;
  //FreeLibrary(HDLL);
end;

procedure TForm2.btn1Click(Sender: TObject);
begin
LoadDLL;
end;

end.

Dll

Main:

library Project2;
uses
  SysUtils, Classes, Unit1, Unit2;

{$R *.res}

procedure Recv; stdcall;
begin
  showform;
end;

exports
  Recv;

begin
end.

Единица 1 (Форма):

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    img1: TImage;
    pnl1: TPanel;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
   Params.WndParent:= Application.Handle;
  Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST or WS_EX_TRANSPARENT;
  Params.ExStyle := WS_EX_TRANSPARENT or WS_EX_TOPMOST;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  brush.Style := bsclear;
  img1.Picture.LoadFromFile(IncludeTrailingBackslash(GetCurrentDir) + 'background.bmp');
  SetWindowPos(Form1.handle, HWND_TOPMOST, Form1.Left, Form1.Top, Form1.Width,
    Form1.Height, 0);

  ShowWindow(Application.handle, SW_HIDE);

  pnl1.Top := (self.Height div 2) - (pnl1.Height div 2);
  pnl1.Left := (self.Width div 2) - (pnl1.Width div 2);
end;

end.

Единица 2:

unit Unit2;

interface

Uses
  windows,
  Unit1,
  SysUtils;

  procedure showform;

implementation

procedure showform;
begin
  Form1 := TForm1.Create(Form1);
  sleep(100);
  Form1.Show;
  Form1.Pnl1.Visible := True;
end;

end.

1 Ответ

0 голосов
/ 05 декабря 2018

У вашего вопроса много проблем, поэтому я постараюсь ответить на него как можно лучше, учитывая отсутствие деталей.

  1. Вы используете формы, поэтому вы создаете приложение VCL.Вы должны позволить среде IDE назначить инфраструктуру VCL вашему проекту.

  2. Эта строка ужасно неправильна:

    Form1 := TForm1.Create(Form1);  
    

    В редкие обстоятельства показывают себя от самого себя.Я бы сказал, что , скорее всего, , поэтому ваше приложение падает.См. this для получения подробной информации о формах в DLL.

    Если вы не можете правильно отладить приложение, поставьте звуковой сигнал перед этой строкой и один после (сделайте задержку между ними).

  3. Я думаю, что ваш вопрос следует скорее назвать «как отладить проект Delphi».

    Что вам нужно сделать, это получить точную строку, по которой программасбои.Это даст вам представление о том, почему появляется ошибка / сбой (кстати, вы никогда не отображали точное сообщение об ошибке).

    Пройдите проверку HadShi (рекомендуется) или EurekaLog (глючит) или Smartinspect (я никогда не пробовал. Цена похожа на две другие).Убедитесь, что вы работаете в режиме отладки, встроенный отладчик включен (см. Параметры IDE) и содержит отладочную информацию *1033* в вашем EXE / DLL.

    PS: вы все еще можетеотладка вашего приложения без одного из трех регистраторов, показанных выше.Просто сконфигурируйте ваш проект должным образом для запуска в режиме отладки!

    Для отладки библиотеки DLL см. Меню «Выполнить -> Параметры».Определите там приложение host , которое будет загружать вашу DLL.Если ошибка - DLL, отладчик возьмет управление на себя и поместит курсор на строку кода, которая вызвала сбой.

  4. Я не знаю, какова конечная цель / что такоечто вы хотите достичь.В связи с этим я должен предупредить вас, что вам, возможно, придется принять во внимание следующие вопросы:

    • Вам нужно использовать ShareMM ?

    • Почему вы строите это как DLL?Разве приложение не может быть написано как один EXE-файл?Или два EXE-файла, которые общаются друг с другом?

...