Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Come inserire un *.EXE in un Form o in una Textbox di un form
Forum - C# / VB.NET - Come inserire un *.EXE in un Form o in una Textbox di un form

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
fusebyte (Normal User)
Expert


Messaggi: 332
Iscritto: 24/12/2008

Segnala al moderatore
Postato alle 12:31
Martedì, 04/08/2009
Mi servirebbe sapere quali comandi si usano per richiamare un piccolo EXE di appena 1 mega dentro un Form?
Devo montare su una DLL in vb.NET o C,non so quale linguaggio si presti meglio allo scopo,
per poi richiamarla da un progetto VB6,visto che non ho scelta in quanto il comando SHELL del VB6 si limita ad aprire l'EXE a se stante e non dentro un Form o un oggetto adatto,quale textbox,richtextbox,imagebox o altro che sia.

Spero possiate esaudire la mia richiesta e vi ringrazio anticipatamente.

Ciao

Ultima modifica effettuata da fusebyte il 04/08/2009 alle 12:33
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 13:06
Martedì, 04/08/2009
Se ho capito bene vuoi che il form dell'applicazione si apra nel tuo form. Non credo proprio si possa fare, ne in c ne in vb.net.

Edit: Mi sbagliavo, l'ho fatto! Si può fare in qualsiasi linguaggio(anche in vb6), basta che usi le api FindWindow e SetParent. In vb.net verrebbe così:

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Runtime.InteropServices
  2. Public Class Form1
  3.     <DllImport("user32.dll")> _
  4.     Public Shared Function FindWindow(ByVal ZeroOnly As IntPtr, ByVal lpWindowName As String) As IntPtr
  5.     End Function
  6.     <DllImport("user32.dll")> _
  7.     Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
  8.     End Function
  9.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  10.         Dim p As New Process
  11.         p.StartInfo.FileName = "notepad.exe"
  12.         p.Start() 'per far partire il processo
  13.         Threading.Thread.Sleep(2000) 'attendo che il processo si apra
  14.         Dim winh As New IntPtr
  15.         winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow
  16.         SetParent(winh, Me.Handle) 'Setto il Form padre Con SetParent
  17.     End Sub
  18. End Class


Ultima modifica effettuata da manvb.net il 04/08/2009 alle 13:31


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Avatar
fusebyte (Normal User)
Expert


Messaggi: 332
Iscritto: 24/12/2008

Segnala al moderatore
Postato alle 23:14
Martedì, 04/08/2009
mamma mia,complimenti.
Che si poteva fare ero sicuro,ma non tutti lo sanno fare.
Possiamo fare una prova,visto che dovro' prima studiarmi quei comandi in VB6 per trascrivere il tuo codice.
Potresti ,per cortesia,compilarmi il codice come DLL (non posso farlo da me)dicendomi
come richiamare poi l'EXE?

Sono convinto che anche cosi funziona lo stesso ed avro' la soddisfazione GRAZIE A TE di aver risolto ed avuto ragione su chi mi dava per pazzo.
Poi mi rivolgo al VB6 e vedo di buttare giu' il codice direttamente,anche se saro' sincero,ci ammattiro',con le API litigo sempre.

Complimenti ancora,BRAVO davvero.

Ciao

PM Quote
Avatar
fusebyte (Normal User)
Expert


Messaggi: 332
Iscritto: 24/12/2008

Segnala al moderatore
Postato alle 23:37
Martedì, 04/08/2009
oppure..non è che fai un'eccezione e me lo procuri in VB6?

non so come e quando ma se tu avessi bisogno sarei felice di contraccambiare il favore.


Ciao

Ultima modifica effettuata da fusebyte il 04/08/2009 alle 23:38
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 1:53
Mercoledì, 05/08/2009
E cosa sono tutti questi complimenti, non ho mica fatto qualcosa di astronomico, sono solo un paio di api.
Comunque, sono anni che non tocco il vb6 e spero di non aver commesso qualche stupido errore, ecco la traduzione:

Codice sorgente - presumibilmente VB.NET

  1. Declare Function FindWindow Lib "User" (lpClassName As Integer, lpWindowName As String) As Integer
  2. Declare Function SetParent Lib "User" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer
  3. Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  4.  
  5. Function Incapsula()
  6.         Shell("c:\windows\notepad.exe", vbNormalFocus)
  7.         Sleep(2000) 'attendo che il processo si apra
  8.         Dim winh As Integer
  9.         winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow
  10.         SetParent(winh, Form1.hwnd) 'Setto il Form padre Con SetParent
  11. End Function


Spero sia corretta, ma se trovi qualche errore prova a postare nella sezione vb6 dove troverai gente più esperta di me in questo lang.

Ultima modifica effettuata da manvb.net il 05/08/2009 alle 4:01


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:15
Mercoledì, 05/08/2009
Usando linguaggi .NET era possibile fare tutto con la reflection. Dato che state parlando di vb6, devo chiudere in quanto questa sezione parla d'altro. Lascio un post per rispondere.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
fusebyte (Normal User)
Expert


Messaggi: 332
Iscritto: 24/12/2008

Segnala al moderatore
Postato alle 13:16
Mercoledì, 05/08/2009
parliamo solo di NET allora,cosi spero si possa riaprire la discussione,anche perche in VB6 alcuni EXe sono impossibili da aprire,quindi ci vuole il NET.

uso per il post solo per fare un appunto.
Ho notato che la routine NET non apre qualsiasi EXE,parliamo sempre di piccoli exe,naturalmente.
Ho un EXE che quando si apre richiama internamente un secondo processo,questo provoca che
nonostante la routine NET,l'EXE viene aperto a se stante esternamente al Form.
E' possibile in NET risolvere questo problema o casi del genere vanno considerati impossibili da gestire internamente ad un Form?

Ciao

Ultima modifica effettuata da fusebyte il 05/08/2009 alle 15:28
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 13:49
Mercoledì, 05/08/2009
Be, in teoria, il codice .net(non vb6) che ti ho dato sopra dovrebbe trovare l'handle di una finestra, a prescindere dal processo a cui appartenga, perchè la ricerca (con FindWindow) viene effettuata sul Text(o caption, o come lo vuoi chiamare) della finestra in questione, quindi dovrebbe funzionare anche su finestre non principali del processo in questione.

@Il Totem:
Non credo che questo caso possa essere gestito con la Reflection, visto che si tratta di incorporare eseguibili sia .net che nativi, e la Reflection non funziona su eseguibili nativi.


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Avatar
fusebyte (Normal User)
Expert


Messaggi: 332
Iscritto: 24/12/2008

Segnala al moderatore
Postato alle 15:27
Mercoledì, 05/08/2009
Tentar non nuoce.
A questo punto conviene fare una DLL in NET e poi richiamare esternamente (con quale comando?) l'exe desiderato in quel momento.

Codice sorgente - presumibilmente VB.NET

  1. Imports System.Runtime.InteropServices
  2. Public Class Form1
  3.     <DllImport("user32.dll")> _
  4.     Public Shared Function FindWindow(ByVal ZeroOnly As IntPtr, ByVal lpWindowName As String) As IntPtr
  5.     End Function
  6.     <DllImport("user32.dll")> _
  7.     Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
  8.     End Function
  9.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  10.         Dim p As New Process
  11.         p.StartInfo.FileName = "notepad.exe"
  12.         p.Start() 'per far partire il processo
  13.         Threading.Thread.Sleep(2000) 'attendo che il processo si apra
  14.         Dim winh As New IntPtr
  15.         winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow
  16.         SetParent(winh, Me.Handle) 'Setto il Form padre Con SetParent
  17.     End Sub
  18. End Class



Come dovrebbe essere modificato il tuo codice per fare questo?

Ciao

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo