Fórum DLL FORM #355717
21/03/2008
0
Estou usando isto no na execução da dll:
Form1:=TForm1.Create(Form1); Form1.ShowModal;
O que está fazendo travar a aplicação é o ShowModal, tentei varias outras formas, algumas aparecia o form da dll mas continuava travando, e outras nem aparecia o form.
Gostaria d uma ajudinha apenas para dexar o form ´livre´ do outro processo... (é também ja tentei o form.free)
Obrigado.
Faelz
Curtir tópico
+ 0Posts
21/03/2008
Marco Salles
Muito esquisito isto...
tente :
Gostei + 0
21/03/2008
Faelz
Muito esquisito isto...
tente :
Marco, é o seguinte, eu criei um form em uma dll, estou injetando em outro processo, vou dar um exemplo.
Digamos que estou injetando minha dll no ´notepad.exe´, assim que ela é injetada, o notepad fica como ´Nao respondendo´, pois o SHOWMODAL faz as janelas de tras ficarem digamos ´inacessiveis´ (certo?).
supondo que como estou injetando no notepad.exe entao o notepad.exe passa a ser parte da minha ´dll form´ que foi injetada, e passa ter o mesmo processid, sendo assim, o modal faz com que o formulario da dll fique com foco e o notepad fica como a janela ´inacessivel´ soh tendo acesso novamente se eu fechar a janela foco, que é o formulario que foi chamado na inicialização da dll. (me corrija se eu falei algo de errado).
Se eu tento o FORM1.SHOW, ele apenas aparece e some...
Talvez usando o ShowWindow(FindWindow(´ClassDoForm´,nil),SW_SHOWNORMAL) funcionaria...
Como eu faço pra discobrir a classe de uma janela?
ou se vc conseguiu me entender e tem uma maneira que funcione...
e brigadao por tentar me ajudar.
Gostei + 0
21/03/2008
Marco Salles
a primeira é injetar a dll
tem o MadCodeHook , não sei se vc esta o usando
A segunda é escrever corretamente esta Dll
eu particularmente não faço uso desta Tecnica , porém ja li a respito de como colocar um formulario numa dll . Relendo o assunto verifiquei duas coisas importantes
a)Uma que o proprietário do Formulário não é o Proprio Form como colocado por voce
Form1:=TForm1.Create(Form1);
Nen tampouco o Nil como mencionado por mim
Form1:=TForm1.Create(Nil);
mas a propria aplicação
Form1:=TForm1.Create(application);
b)Segundo a importancia do uso do Tratamento de exceçoes
De modo que qualquer exceção gerada possa ser capturada , apresentando uma mensagem correta.
veja como fica a estrutura aconselhavel pela biogravias
try Form1:=TForm1.Create(Application); try // inicializa os dados //apresenta o formulário if Form1.ShowModal = mrOk Then //apresenta o resultado finally Form1.Free; end; except on E: Exception do MessageDlg(´ERRO em FormDLL : ´+E.message , mtError , [mbOk] ,0); end;
espero que o E.message possa te dar uma luz em alguma erro que possa estar ocorrendo .
Gostei + 0
22/03/2008
Faelz
library InjectMe;
uses
SysUtils,
Forms,
Windows,
Controls,
Dialogs,
Classes,
Unit1 in ´Unit1.pas´ ;
{$R *.res}
begin
try
Form1:=TForm1.Create(Application);
try
// inicializa os dados
//apresenta o formulário
if Form1.ShowModal = mrOk Then
//apresenta o resultado
finally
Form1.Free;
end;
except
on E: Exception do
MessageDlg(´ERRO em FormDLL : ´+E.message , mtError , [mbOk] ,0);
end;
end.
Usei o seu exemplo mesmo sabendo que nao funcionaria mas apenas pra ve se haveria algum tipo de exception, e como o previsto não existem erros ao logar, mas continua na mesma coisa, aparece o form mas bloqueia o acesso ao processo injetado.
Eu vi uma dll com um form que era/é injetada em outro processo e ela rodava/roda normalmente como se fosse uma aplicação executada d uma pasta..
O meu codigo de injerção eu tenho certeza que não está errado, pois eu injetei esta dll que citei acima no bloco de notas, explorer, e outros processos e rodou normalmente, sem bloquiar o acesso ao processo injetado.
Eu percebi que quando elá é criada, ao invez dela aparecer na frente da ´aplicação target´ ela aparece atras... isso quer dizer que não é usado showmodal, e ela fica livre da janela do processo injetado.
Não irei perguntar ´será que é possivel?´, pois eu vi com meus proprios olhos que é, mas a pergunta seria, será que eu conseguirei?, talvez seje uma coisa simples, ou talvez eu terei que criar um formulario e botoes na marra usando os comandos do delphi.
Então Marco, agradeço sua ajuda e caso saiba como eu possa resolver isto e queira compartilhar seu conhecimento estou agradecendo des de já.
Continuarei pesquisando e caso eu encontre a solução terei o prazer de postar como fazer. Acredito que seria útil para muitas pessoas.
Gostei + 0
22/03/2008
Marco Salles
o problema é que formularios modais so se comunicam com o Principal atraves de mensagens do Windows . E ainda tem o problema de sincronização , que eu não sei sinceramente se se resolve com outros processos os quais não se tem acesso . (me refiro a processos do windos os quais voce que injetar esta dll ) .
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)