Как отобразить фоновое изображение и центрировать панель в форме DLL?

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

DLL вызывается из приложения Vcl Form, но возникают проблемы, когда невозможно загрузить фоновое изображение в форме, 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

Главный:

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 ответ

Решение

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

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

  2. Эта строка ужасно неверна:

    Form1 := TForm1.Create(Form1);  
    

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

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

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

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

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

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

    Для отладки библиотеки DLL см. Меню "Run->Parameters". Определите там хост- приложение, которое будет загружать вашу DLL. Если ошибкой является DLL, отладчик возьмет управление на себя и поместит курсор на строку кода, которая вызвала сбой.

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

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

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

Другие вопросы по тегам