Exibir componentes de uma DLL, no MainForm do executável

Delphi

17/03/2005

Consegui, a um certo tempo atrás, compartilhar componentes não visuais entre uma DLL e um arquivo executável, porém, estou tendo problemas para exibir componentes visuais agora... por exemplo:

No Executável:
procedure TMainForm.GetNewEdit;
var
  ProcAddress, P: Pointer;
  PEdit: ^TEdit;
  AEdit: TEdit;
begin
    ProcAddress := GetProcAddress(DllHandle, ´GetNewEdit´);
    P := @Self;
    asm
      push P
      call ProcAddress
      mov [PEdit], eax
    end;

    // Os problemas ocorrem na linha abaixo
    AEdit := PEdit^;

end;


Na Dll:
function GetNewEdit(P: Pointer): Pointer; stdcall;
begin
  Result := TEdit.Create(P);
end;

exports
  GetNewEdit;


Aparentemente, tudo ocorre corretamente, porém, ao verificar a variável AEdit no Inspect do delphi, aparecem várias mensagens de ´Out of bounds´ ou alguma coisa do tipo, e ao tentar acessar qualquer propriedade deste objeto, acontece um ´Access Violation´.

A variável DllHandle está sendo inicializada com sucesso no OnCreate do Form, utilizando-se a API LoadLibrary, e sendo liberada no OnDestroy utilizando FreeLibrary.

Utilizo o assembly para chamar o método na DLL, pois o Delphi tem dificuldade de passar os parametros através do stack (stdcall), costuma dar access violations, por isso, sempre faço minhas chamadas de DLL assim, e sempre funcionou.

Já tentei utilizar ponteiros tipados na procedure da DLL, e várias outras formas...

Preciso fazer isso, pois gostaria de fazer um sistema com uma PageControl, onde cada TabSheet conteria um TFrame, vindo de uma DLL, ou talvez até mesmo um sistema MDI, onde cada form MDIChild viria de uma DLL.

Fiz um sistema, que lia um objeto herdado de TPersistent da DLL, e funcionava perfeitamente, desde que tanto o executável quanto a DLL fossem compilados com a mesma versão da Unit do objeto.

Sei que é um caso muito complicado, mas conto com a ajuda de vocês, mesmo que não obtenha uma solução, já estarei agradecido com dicas sobre melhores formas de utilizar as DLLs.

Obrigado.


Thiago Vidal

Thiago Vidal

Curtidas 0
POSTAR