GARANTIR DESCONTO

Fórum DLL FORM #355717

21/03/2008

0

Pessoal, estou injetando uma DLL com um form na execução dela em um processo, mas o processo que eu injeto fica como ´Nao respondendo´, e assim q eu fecho a janela que foi criada pela dll, ele volta a responder.

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

Faelz

Responder

Posts

21/03/2008

Marco Salles

eu não entendi direito o que voce quer , mas uma ajudazinha posso dar

Muito esquisito isto...
[b:4d423045fd]Form1[/b:4d423045fd]:=TForm1.Create([b:4d423045fd]Form1[/b:4d423045fd]); Form1.ShowModal;


tente :

Form1:=TForm1.Create(Nil); Form1.ShowModal;



Responder

Gostei + 0

21/03/2008

Faelz

[quote:635227642a=´Marco Salles´]eu não entendi direito o que voce quer , mas uma ajudazinha posso dar

Muito esquisito isto...
[b:635227642a]Form1[/b:635227642a]:=TForm1.Create([b:635227642a]Form1[/b:635227642a]); Form1.ShowModal;


tente :

Form1:=TForm1.Create(Nil); Form1.ShowModal;
[/quote:635227642a]

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.


Responder

Gostei + 0

21/03/2008

Marco Salles

duas coisas distintas :

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 .


Responder

Gostei + 0

22/03/2008

Faelz

Minha dll

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.


Responder

Gostei + 0

22/03/2008

Marco Salles

e se voce criar um formulário Modal ????

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 ) .


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar