Frame + DLL + Error 1400

0

W zaożeniu miało być dynamiczne ładowanie bibliotek i wyświetlanie framsa zawartego w dll. Stworzyłem sobie taki kod:

unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  DLL = record
    Plugin_Handle: THandle;
    Plugin_Frame: procedure(ApplicationHandle, ParentHandle: THandle);
  end;
 
  PDLL = ^DLL;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
procedure TForm2.Button1Click(Sender: TObject);
var
  Plugin: PDLL;
  Plugin_Frame: procedure(ApplicationHandle, ParentHandle: THandle);
begin
  New(Plugin);
  Plugin^.Plugin_Handle := LoadLibrary('dllproj1.dll');
  if (Plugin^.Plugin_Handle = 0) then
       exit;
  @Plugin_Frame := GetProcAddress(Plugin^.Plugin_Handle, 'ShowFrame');
  if (@Plugin_Frame = nil) then
    begin
      FreeLibrary(Plugin^.Plugin_Handle);
      exit;
  end;
  Plugin^.Plugin_Frame := @Plugin_Frame;
  Plugin^.Plugin_Frame(Application.Handle, Application.MainFormHandle);
end;
 
end.

i DLL

library dllproj1;
 
 
uses
  SysUtils,
  Classes,
  Controls,
  Forms,
  Windows,
  dll in 'dll.pas' {Frame2: TFrame};
 
{$R *.res}
procedure ShowFrame(ApplicationHandle, ParentHandle: THandle); stdcall;
var
  Frame1: TFrame2;
  AppHandle: THandle;
begin
  AppHandle := Application.Handle;
  Application.Handle := ApplicationHandle;
  Frame1 := TFrame2.Create(Application);
  [b]Frame1.ParentWindow := ParentHandle[/b];
  SetParent(Frame1.Handle, ParentHandle);
  Frame1.Align := alClient;
  Frame1.Visible := True;
  Application.Handle := AppHandle;
end;
 
exports
  ShowFrame;
 
begin
end. 

I dostaję błąd 1400: Nieprawidłowe dojście okna :|
Błąd pojawia się w pogrubionej linii, bądź następnej. Dodam że jeśli załaduję sobie statycznie biliotekę to ramka elegancko się pojawia...

0

mam podobny proble, i tez nie wiem jak go rozwiązać :(

// swojego własnego problemu nie poznajesz?
// pierwszy post: (84.10.123.184 (chello084010123184.chello.pl, ) Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1...)
// ten post: (84.10.123.184 (chello084010123184.chello.pl, ) Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.8.1...)

0

Podobny problem występuje chyba przy ładowaniu okien MDI z DLL'ek. Z tego co pamiętam, można jeszcze do DLL oprócz obiektu Application, przekazać globalną zmienną Screen - może to coś pomoże, ale później może występować problem z 'takimi samymi klasami', tzn, komunikat pod tytułem 'Cannot assign TFont to TFont' czy jakos tak. Aha i pamiętaj na końcu o przywróceniu starej Application i Screen. Coś mi się zdaje że pewnie by to zadziałało na bpl zamiast na dll.

0

Tak, moze i tak, ale troche derwuje mnie ze statyczne ładowanie działa jak potrzeba a dynamicznie za za very :|
zasadniczo zapomniałem dopisać stdcall przy deklaracjach typu proceduralnego w głównym programie. Jak sie dopisze to juz błędu nie ma, tyle że ta ramka się nie pojawia :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1