Exibir componentes de uma DLL, no MainForm do executável
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:
Na Dll:
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.
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
Curtidas 0