Использовать введенный dll-код в качестве плагина delphi * .dll, который содержит TForm - PullRequest
1 голос
/ 22 марта 2011

может быть, это идиотский вопрос, но тем не менее ...
Я задал несколько вопросов о плагинах в Delphi. Какой способ лучше dll, bpl, OCX, скриптовый движок ...
Я не хочу распространять все * .bpls и все его зависимости ...
Все, что мне нужно, это * .dll, который содержит TForm. И эта форма должна быть размещена в главном приложении. В delphi нет прямой поддержки этого (очень печальная ситуация). Некоторые обходные пути существуют, но есть проблемы с клавишей табуляции и т.д ...
Так что обходной путь идеален.
Но, возможно, есть другая возможность. Внедрить код dll непосредственно в хост * .exe. Таким образом, * .exe будет думать, что введенный код его собственный ... И много проблем (например, с ключом табуляции в форме) должно быть устранено. Является ли это возможным? Разве это не грязный взлом, например эта техника "программно" законна?
(У меня нет опыта внедрения кода, и, возможно, он не имеет смысла в том, что я говорю здесь;)

С наилучшими пожеланиями
Peter

[Редактировать]
Чтобы прояснить некоторые вещи ... Когда мы помещаем TForm в dll и затем пытаемся внедрить эту форму в приложение host * .exe, возникает много проблем. Во-первых, это ошибка «невозможно назначить TFont TFont», но для этого есть обходной путь.
Во-вторых, хост-приложение принимает всю встроенную форму как один компонент, поэтому вы не можете использовать клавишу табуляции. (После нажатия клавиши Tab фокус полностью выпрыгнет из встроенной формы). Также у нас есть обходной путь для этого, но он далек от идеального ...
Поэтому у меня возникла идея: если мы внедрим некоторый код в хост, возможно, хост будет думать, что изогнутая форма является его собственным кодом, поэтому будет работать клавиша табуляции.
Но, как я уже говорил, я ничего не знаю о инъекциях, просто (может быть) сумасшедшая идея;)

1 Ответ

1 голос
/ 22 марта 2011

Это вполне возможно, не прибегая к любому из описанных вами хаков. Например:

library FormDLL;

uses
  Windows,
  Forms,
  uMyForm in 'uMyForm.pas' {MyForm};

procedure ShowForm(MainFormHandle: HWND); stdcall;
begin
  Application.Handle := MainFormHandle;
  with TMyForm.Create(nil) do begin
    ShowModal;
    Free;
  end;
end;

exports
  ShowForm;

begin
end.

В TMyForm вы можете положить практически все, что захотите. С другой стороны создайте приложение Delphi и добавьте следующий код для вызова DLL:

procedure ShowForm(MainFormHandle: HWND); stdcall; external 'FormDLL.dll';

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ShowForm(Handle);
end;

Это ведет себя просто отлично.

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

...