Shell per avviare *.exe posizionato in una sottocartella

di il
7 risposte

Shell per avviare *.exe posizionato in una sottocartella

Salve a tutti,
non sono molto esperto ma sono molto interessato a migliorare la mia conoscenza di VB!
In Visual Basic 2010 Express ho il seguente problema:
Vorrei che cliccando su di un button si avviasse un file *.exe che chiameremo FILE.exe.
Ho provato con il seguente codice:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Shell(Application.StartupPath + "\FILE.exe", AppWinStyle.NormalFocus)
End Sub

e funziona perfettamente, se FILE.exe e MIOPROGETTOCREATOCONVB.exe sono nella stessa cartella.

però, per vari motivi, avrei necessità di inserire il file "FILE.exe" in una sottocartella, dunque il mio progetto si presenta così:

cartellaPROGETTO
cartellaPROGETTO\MIOPROGETTOCREATOCONVB.exe
cartellaPROGETTO\cartellaUNO

cartellaPROGETTO\cartellaUNO
cartellaPROGETTO\cartellaUNO\FILE.exe
cartellaPROGETTO\cartellaUNO\*.dll
cartellaPROGETTO\cartellaUNO\cartellaDUE
cartellaPROGETTO\cartellaUNO\cartellaTRE

Ho provato con il seguente codice:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Shell(Application.StartupPath + "\cartellaUNO\FILE.exe", AppWinStyle.NormalFocus)
End Sub

ma non funziona..

Sarei infinitamente grato se qualcuno potesse aiutarmi.

Grazie in anticipo,

Roocs.

7 Risposte

  • Re: Shell per avviare *.exe posizionato in una sottocartella

    Ciao rooks,
    guarda che stai facendo qualche errore stupidino, il tuo codice è giusto. Quando concateni i percorsi sarebbe meglio usare Path.Combine, ma comunque come ha scritto tu va benone, nel senso che l' ho provato e funziona. Controlla bene i nomi e i percorsi.
  • Re: Shell per avviare *.exe posizionato in una sottocartella

    Grazie mille per la rapida risposta!
    Credo di aver individuato il problema:
    il FILE.exe, che è nella cartellaUNO, dipende da file presenti nelle sottocartelle:
    cartellaPROGETTO\cartellaUNO\cartellaDUE
    cartellaPROGETTO\cartellaUNO\cartellaTRE
    mentre il MIOPROGETTOCREATOCONVB.exe deve stare (per forza) in cartellaPROGETTO.
    quindi avviando MIOPROGETTOCREATOCONVB.exe, i file presenti in cartellaDUE/cartellaTRE non vengono collegati ed allora FILE.exe non funziona, benché il collegamento:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Shell(Application.StartupPath + "\cartellaUNO\FILE.exe", AppWinStyle.NormalFocus)
    End Sub
    sia giusto.
    A riprova, se copio cartellaDUE/cartellaTRE in cartellaPROGETTO, il tutto funziona. Quindi, oserei dire che FILE.exe si collega a cartellaDUE/cartellaTRE dicendo che sono sottocartelle del'exe in esecuzione (ovvero, ahimé di MIOPROGETTOCREATOCONVB.exe e non di FILE.exe), tutto è traslato di una cartella e non funziona!

    il fatto è che, se avessi accesso al file sorgente di FILE.exe, sarebbe molto semplice (basterebbe cambiare il collegamento con le sottocartelle) ma non avendolo, devo ingegnarmi con VB!

    forse questa è una possibile soluzione:
    c'è un modo per avviare un programma attraverso un file di collegamento all'exe (tasto dx|crea collegamento)?

    grazie ancora per l'aiuto!
  • Re: Shell per avviare *.exe posizionato in una sottocartella

    Credo di aver capito (forse), probabilmente il FILE.exe cerca le sottocartelle non partendo dalla cartella in cui risiede (come giustamente fai tu usando Application.StartupPath) ma usa la directory corrente che in questo caso sarebbe la directory del processo che lo lancia.

    Puoi avviare il FILE.exe specificando la cartella di lavoro usando Process invece di Shell:
    
    Dim filePath As String = Application.StartupPath + "\cartellaUNO\FILE1.exe"
    
    Dim psi As ProcessStartInfo = New ProcessStartInfo(filePath)
    psi.WorkingDirectory = Path.GetDirectoryName(filePath)
    ' oppure  psi.WorkingDirectory = Application.StartupPath + "\cartellaUNO"
    
    Process.Start(psi)
    
  • Re: Shell per avviare *.exe posizionato in una sottocartella

    Barba59,

    non ho parole: GRAZIE!
    hai trovato la soluzione al problema, grazie davvero!

    è da domenica sera che mi struggo, non mangio e non dormo (sul serio!) per cercare di risolvere questo problema, ad un certo punto ho chiesto e trovato il file sorgente di FILE.exe e stavo impazzendo per cercare di compilarlo, nella speranza di modificare il percorso delle sottocartelle..

    quindi ci tengo a manifestare la mia sincera gratitudine, mi hai dato un grosso aiuto poiché diversamente credo che sarei rimasto ancora per lungo tempo ad impazzire per cercare una soluzione.

    grazie ancora, a buon rendere!


    P.S.: visto che ci sono ne approfitto ancora, avrei ancora un dubbio:
    il FILE.exe che si avvia è impostato di suo per avviarsi in un punto in alto a sinistra dello schermo, c'è un modo per impostare l'avvio di FILE.exe in centro allo schermo? (per intenderci, tipo StartPosition.CenterScreen, che però non so impostare perché è un FILE.exe e non un form di VB)

    grazie ancora per l'aiuto!
  • Re: Shell per avviare *.exe posizionato in una sottocartella

    Ciao rooks,
    Prova un po questo, ha quanche difetto e non sono sicuro che funzioni con qualsiasi eseguibile, giusto per provare:
    
    Imports System.IO
    Imports System.Threading
    
    Public Class Form1
        Public Declare Function MoveWindow Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal bRepaint As Boolean) As Boolean
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim filePath As String = Application.StartupPath + "\cartellaUNO\FILE1.exe"
    
            Dim psi As ProcessStartInfo = New ProcessStartInfo(filePath)
            psi.WorkingDirectory = Path.GetDirectoryName(filePath)
    
            Dim myProcess As Process = Process.Start(psi)
            Dim result As Boolean = myProcess.WaitForInputIdle()
            Thread.Sleep(1000) ' con questa funziona ma è una schifezza :)
    
            Dim hWnd As IntPtr = myProcess.MainWindowHandle
            result = MoveWindow(hWnd, 100, 100, 400, 400, True)
        End Sub
    
    End Class
    
    Ho dovuto mettere uno Sleep altrimenti myProcess.MainWindowHandle mi ritorna zero, pensavo bastasse il myProcess.WaitForInputIdle().

    L' effetto è che la finestra appare e dopo un poco viene spostata, ho provato a ridurre lo Sleep a 100 e funziona ancora e l' effetto è accettabile (magari prova pure a toglierlo del tutto, io ho usato per prova un exe fatto col Net Framework magari col tuo exe questo problema dello Sleep non c' è).
  • Re: Shell per avviare *.exe posizionato in una sottocartella

    Grazie per la risposta,

    dunque,
    ho provato con il codice che mi hai indicato ma ho dei problemi in

    Dim hWnd As IntPtr = myProcess.MainWindowHandle
    result = MoveWindow(hWnd, 100, 100, 400, 400, True)

    nel senso che di da errore su MoveWindow dicendo: "MoveWindow non dichiarato: Non é accessibile a causa del livello di protezione"

    e sinceramente non so come modificarlo..
  • Re: Shell per avviare *.exe posizionato in una sottocartella

    Ok, ho provato ancora ed adesso ho capito meglio che errore facevo..

    il tuo codice è giusto ma non funziona con il mio FILE.exe e mi da il seguente errore:

    "Errore di WaitForInputIdle. È possibile che il processo non abbia un'interfaccia grafica."

    quindi non so come fare..

    comunque grazie ancora!
Devi accedere o registrarti per scrivere nel forum
7 risposte