Oppure

Loading
04/08/09 10:31
fusebyte
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 04/08/09 10:33
aaa
04/08/09 11:06
manvb.net
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ì:

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 04/08/09 11:31
aaa
04/08/09 21:14
fusebyte
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
aaa
04/08/09 21:37
fusebyte
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 04/08/09 21:38
aaa
04/08/09 23:53
manvb.net
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:

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 05/08/09 2:01
aaa
05/08/09 8:15
Il Totem
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.
aaa
05/08/09 11:16
fusebyte
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 05/08/09 13:28
aaa
05/08/09 11:49
manvb.net
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.
aaa