fusebyte (Normal User)
Expert
Messaggi: 332
Iscritto: 24/12/2008
|
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 |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
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 |
Imports System.Runtime.InteropServices Public Class Form1 <DllImport("user32.dll")> _ Public Shared Function FindWindow(ByVal ZeroOnly As IntPtr, ByVal lpWindowName As String) As IntPtr End Function <DllImport("user32.dll")> _ Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr End Function Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim p As New Process p.StartInfo.FileName = "notepad.exe" p.Start() 'per far partire il processo Threading.Thread.Sleep(2000) 'attendo che il processo si apra Dim winh As New IntPtr winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow SetParent(winh, Me.Handle) 'Setto il Form padre Con SetParent End Sub End Class
|
Ultima modifica effettuata da manvb.net il 04/08/2009 alle 13:31 |
|
fusebyte (Normal User)
Expert
Messaggi: 332
Iscritto: 24/12/2008
|
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
|
|
fusebyte (Normal User)
Expert
Messaggi: 332
Iscritto: 24/12/2008
|
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 |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
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 |
Declare Function FindWindow Lib "User" (lpClassName As Integer, lpWindowName As String) As Integer Declare Function SetParent Lib "User" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Function Incapsula() Shell("c:\windows\notepad.exe", vbNormalFocus) Sleep(2000) 'attendo che il processo si apra Dim winh As Integer winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow SetParent(winh, Form1.hwnd) 'Setto il Form padre Con SetParent 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 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
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.
|
|
fusebyte (Normal User)
Expert
Messaggi: 332
Iscritto: 24/12/2008
|
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 |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
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.
|
|
fusebyte (Normal User)
Expert
Messaggi: 332
Iscritto: 24/12/2008
|
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 |
Imports System.Runtime.InteropServices Public Class Form1 <DllImport("user32.dll")> _ Public Shared Function FindWindow(ByVal ZeroOnly As IntPtr, ByVal lpWindowName As String) As IntPtr End Function <DllImport("user32.dll")> _ Public Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr End Function Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim p As New Process p.StartInfo.FileName = "notepad.exe" p.Start() 'per far partire il processo Threading.Thread.Sleep(2000) 'attendo che il processo si apra Dim winh As New IntPtr winh = FindWindow(winh, "Senza nome - Blocco note") 'Ottengo l'handle con FindWindow SetParent(winh, Me.Handle) 'Setto il Form padre Con SetParent End Sub End Class
|
Come dovrebbe essere modificato il tuo codice per fare questo?
Ciao
|
|