Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Process.WaitForExit() null reference exception

Îåêßíçóå áðü ôï ìÝëïò Q-apprentice. Τελευταία δημοσίευση από το μέλος cap στις 02-10-2012, 14:47. Υπάρχουν 13 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-10-2012, 13:09 71322

    Process.WaitForExit() null reference exception

    Καλημέρα σε όλους. Αντιμετωπίζω το εξής θέμα σε μια εφαρμογή που φτιαχνω. Ξεκινήσω να ανοίξω μέσω κώδικα ένα αρχείο (πχ μια φωτογραφία) μέσω της κλήσης του process.start και χτυπάει null reference exception γιατί το process δεν έχει value. Αυτό γιατί το default app (windows photo viewer) δεν δίνει τιμή. Αν αλλάξω το default app δουλεύει κανονικά. Ο σκοπός είναι αν μπορώ να το κάνω να δουλέψει χωρίς να χτυπάει , χωρίς να αλλάξω το default app. Το ίδιο έχει παρατηρηθεί και σε αρχεία τύπου mp3 ή video τα οποία έχουν σαν default app προγράμματα εκτός του windows media player . (πχ vlc ή Winamp) το δοκίμασα με κλήση του shell() αλλά κάνει το ίδιο. Έχει αντιμετωπίσει κανείς κάτι αντίστοιχο ;
    Αντώνης Ε. Κόλλιας
  •  01-10-2012, 13:35 71324 σε απάντηση της 71322

    Απ: Process.WaitForExit() null reference exception

    Μήπως το process τρέχει ήδη και το κάνεις απλά reuse; Κοίτα μήπως ο windows photo viewer ειναι "ζωντανός" ως process όταν καλείς την Start(). 
    (Long shot, αλλά ποτέ δεν ξέρεις).


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  01-10-2012, 14:47 71325 σε απάντηση της 71324

    Απ: Process.WaitForExit() null reference exception

    To process το οποίο τρέχει όταν ανοίγει ο Windows Photo Viewer είναι το dllhost.exe ...όταν λές για reuse ...τι ακριβώς μπορώ να κάνω ; δεν κατάλαβα ακριβώς τι πρέπει να γίνει. επίσης δουλεύω σε VB.net δεν ξέρω αν το είχα διευκρινίσει πριν.
    Ευχαριστώ εκ των προτέρων...

    Αντώνης Ε. Κόλλιας
  •  01-10-2012, 15:25 71326 σε απάντηση της 71325

    Απ: Process.WaitForExit() null reference exception

    Μάλλον το dllhost.exe δεν είναι μοναδικό και το process δεν καταλαβαίνει.

    Χωρίς να έχω μεγάλη εμπειρία, διαβάζω οτι όταν το process είναι shared με άλλους, το WaitForExit() θα σου δώσει τα παπούτσια στο χέρι. 

    Στο documentation στο msdn διαβάζω το εξής όμως:

    If you use a static overload of the Start method to start a new system process, the method creates a new Process component and associates it with the process.

    Αρα λοιπόν μπορείς να ξεκινήσεις το process με το Process.Start() και όχι με το myInstance.Start() που ίσως έχεις κάνει εσύ (δημιουργείς ένα νέο instance και το κάνεις start;)

    Χμ, μπαίνω σε νερά βαθύτερα από όσο έχω βουτήξει εδώ και δεν είμαι σίγουρος αν παω προς τη σωστή κατεύθυνση. Ομως δοκίμασε να το ξεκινάς με τη static method αν δεν το κάνεις ήδη, μπας και δουμε φως :)


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  01-10-2012, 15:45 71327 σε απάντηση της 71326

    Απ: Process.WaitForExit() null reference exception

    Ο κώδικας που χρησιμοποιώ είναι ο ακόλουθος

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
        Public Sub GetFileFromDB(PKVar As String, TableVar As String, IDLocation As String, PersonIDLocation As String)
            'select file from database...
            sqlComm = "SELECT * FROM [" & TableVar & "] WHERE FileID = @IDLocation AND PersonID = @PersonID"
            '
            Dim Command As New SqlCommand(sqlComm, Connection)
    
            With Command.Parameters
                .Add(New SqlParameter("@IDLocation", IDLocation))
                .Add(New SqlParameter("@PersonID", PersonIDLocation))
            End With
    
            DR = Command.ExecuteReader()
    
            With DR.Read
                byteArray = DR(2) 'το καθεαυτού αρχείο...
                fileExtension = DR(3).ToString 'η προέκταση του αρχείου...
                fileName = DR(5).ToString 'το όνομα του αρχείου
            End With
            DR.Close()
    
            '-----------------------------------------------------------------------------------------------------------
            ' Make a path for a temporary file
            'Dim myTempFilePath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString() + fileExtension)
            'getTempPath
            Dim myTempFilePath = System.IO.Path.Combine(getTempPath, fileName + fileExtension)
    
            ' This will contain the edited file when the user close the program that have used to edit it
            Dim editedFileData As Byte()
            Try
                System.IO.File.WriteAllBytes(myTempFilePath, byteArray)
                Using myProcess As System.Diagnostics.Process = Process.Start(myTempFilePath)
                    ' Wait for the user to close the program (editor) before continue
                    If Not myProcess Is Nothing Then myProcess.WaitForExit() Else 
                End Using
            Catch ex As Exception
                '
            Finally
                ' Take the edit file data
                editedFileData = System.IO.File.ReadAllBytes(myTempFilePath)
    
                ' Clean up
                System.IO.File.Delete(myTempFilePath)
            End Try
    
            ' Save back your edited data to the DB by using editedFileData
            'etc etc etc...
            '-----------------------------------------------------------------------------------------------------------
    
    
            Dim MStream As New MemoryStream(byteArray.Length)
            MStream.Read(byteArray, 0, byteArray.Length)
            'Process.Start(byteArray.ToString)
    
    
            ConnClose()
            MStream.Close()
            MStream.Dispose()
    
        End Sub
    Όπως βλέπεις και εσύ ξεκινάω με process.start.... δεν ξέρω τιο είδες στο MSDN αλλά δώσε μου και κανένα link να υπάρχει. Ρίξε του μια ματιά και πές μου τη γνώμη σου...

    Αντώνης Ε. Κόλλιας
  •  01-10-2012, 17:50 71328 σε απάντηση της 71327

    Απ: Process.WaitForExit() null reference exception

    Αυτό κοιτούσα:

    The other overloads of the Start method are static members. You do not need to create an instance of the Process component before you call those overloads of the method. Instead, you can call Start for the Process class itself, and a new Process component is created if the process was started. Or, a null reference (Nothing in Visual Basic) is returned if a process was reused. The process resource is automatically associated with the new Process component that is returned by the Start method.

    Βασικά κουταμάρες σου έγραφα πριν για static/instance. Από ο,τι φαίνεται, όταν το process έχει εκκινηθεί ήδη ουσιαστικά παίρνεις null reference.

    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  02-10-2012, 00:22 71331 σε απάντηση της 71328

    Απ: Process.WaitForExit() null reference exception

    Οπότε μπορώ να κάνω κάτι για αυτό, ή να μην ασχοληθώ ;

    Αντώνης Ε. Κόλλιας
  •  02-10-2012, 07:08 71332 σε απάντηση της 71331

    Απ: Process.WaitForExit() null reference exception

    Ψάχνοντας αρκετά σε παραπλήσιες αναφορές από τρίτους, δεν βρήκα δυστυχώς κάποια "γιατρειά". Αυτό που λένε μερικοί είναι να σηκώνεις explicitly τις εφαρμογές (με όνομα), πράγμα που σημαίνει οτι θα πρέπει να ελέγχεις τον τύπο του αρχείου που επεξεργάζεσαι και να είσαι σίγουρος οτι η εφαρμογή υπάρχει στο μηχάνημα (πράγμα που φαντάζομαι δεν σε βολεύει και εξάλλου και πάλι δεν μου κανει "κλικ" οτι θα ξεπεράσει το πρόβλημα). Εχεις δοκιμάσει πάντως σε κάποια από τις δύο προσέγγίσεις; Εγώ θα δοκίμαζα (π.χ. με ένα συγκεκριμένο τύπο αρχείων) να φωνάξω μια συγκεκριμένη εφαρμογή και να δω τι γίνεται. Πάντως να το ξαναπώ για να μην παρεξηγηθώ - οι απαντήσεις μου είναι καθαρά hunches, δεν έχω πρακτική εμπειρία πάνω στο συγκεκριμένο θέμα. Εχω χρησιμοποιήσει και εγώ την Process για να φωνάξω εφαρμογές, αλλά όχι με αυτόν τον τρόπο.



    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  02-10-2012, 12:28 71333 σε απάντηση της 71332

    Απ: Process.WaitForExit() null reference exception

    Το "πρόβλημα" είναι ότι καταρχήν δεν ξεκινάει καμμία εφαρμογή όταν δίνεις μόνο ένα data file. Αυτό που θα ξεκινήσει είναι το dllhost το οποίο θα πάει να βρει την εφαρμογή που θα χειριστεί το αρχείο και μετά θα κλείσει. Λογικό είναι το αποτέλεσμα της Process.Start να μην έχει νόημα. 

    Αυτό που λες στο λειτουργικό είναι "άνοιξε το αρχείο και δεν με νοιάζει πως". Το πως φαίνεται από το registry και από τα registry verbs για κάθε τύπο, τα οποία άνετα μπορεί να λένε ότι μόνο ένα process θα σηκώνεται για όλα τα documents.

    Αντί να αφήνεις στην τύχη ποιά εφαρμογή θα εμφανιστεί, καλύτερα να δώσεις στο χρήστη τη δυνατότητα να επιλέξει την εφαρμογή που θα χρησιμοποιήσει μέσα από τα Preferences και να την ανοίξεις κανονικά δίνοντας το αρχείο ως παράμετρο.

    Ακόμα και αν βρεθεί τρόπος να ανοίξει η εφαρμογή, ο κώδικας είναι προβληματικός. Το Process.Start γίνεται μέσα σε μία μέθοδο η οποία τραβάει δεδομένα από τη βάση, η οποία απ' ότι φαίνεται χρησιμοποιεί (και μπλοκάρει) ένα connection το οποίο έχει ανοίξει απέξω. 



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-10-2012, 13:01 71334 σε απάντηση της 71333

    Απ: Process.WaitForExit() null reference exception

    Παναγιώτης Καναβός:
    Αντί να αφήνεις στην τύχη ποιά εφαρμογή θα εμφανιστεί, καλύτερα να δώσεις στο χρήστη τη δυνατότητα να επιλέξει την εφαρμογή που θα χρησιμοποιήσει μέσα από τα Preferences και να την ανοίξεις κανονικά δίνοντας το αρχείο ως παράμετρο.


    Ο Παναγιώτης έχει δίκιο. Επίσης είναι καλή πρακτική να περνάς ένα ProcessStartInfo object σαν παράμετρο. Παραδείγματα θα βρεις εδώ. Τρεις χρήσιμες properties που είναι καλό να έχεις υπόψη σου, αν θες να κάνεις κάτι περισσότερο, είναι η UseShellExecute, η RedirectStandardInput και RedirectStandardOutput. Το documentation δίνει και παραδείγματα για τη χρήση τους.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  02-10-2012, 13:21 71335 σε απάντηση της 71334

    Απ: Process.WaitForExit() null reference exception

    Και γιατί με αφήσατε βρε παληκάρια και μπέρδεψα τον άνθρωπο χειρότερα και δεν μιλάγατε πιό νωρίς;

    Δεν σκέφτηκα καν οτι το dllhost δεν αφορά execution συγκεκριμένης εφαρμογής!


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  02-10-2012, 14:22 71336 σε απάντηση της 71335

    Απ: Process.WaitForExit() null reference exception

    cap:
    Και γιατί με αφήσατε βρε παληκάρια και μπέρδεψα τον άνθρωπο χειρότερα και δεν μιλάγατε πιό νωρίς;

    Δεν σκέφτηκα καν οτι το dllhost δεν αφορά execution συγκεκριμένης εφαρμογής!



    Τρεις λόγοι:
    1. Διάβασα το thread για πρώτη φορά αργά χθες το απόγευμα.
    2. Χρειάστηκε λίγο ψάξιμο (το οποίο θέλει και χρόνο), καθώς δεν τα ξέρουμε και όλα! Βασικά, θεωρώ ότι ξέρω μόνο τα... βασικά (κι αυτά, στοιχειωδώς!).
    3. Όταν ένα μέλος απαντά σε μια ερώτηση, δεν είναι ευγενικό να παρεμβαίνεις αν δεν συντρέχει σοβαρός λόγος. Ιδίως όταν πρόκειται για τον administrator ή τους moderators ή παλαιότερα μέλη με περισσότερη εμπειρία και γνώσεις.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  02-10-2012, 14:27 71337 σε απάντηση της 71335

    Απ: Process.WaitForExit() null reference exception

    cap:
    Και γιατί με αφήσατε βρε παληκάρια και μπέρδεψα τον άνθρωπο χειρότερα και δεν μιλάγατε πιό νωρίς;

    Δεν σκέφτηκα καν οτι το dllhost δεν αφορά execution συγκεκριμένης εφαρμογής!


    Πού να φανταστώ ότι ένας πάλιουρας θα είχε ξεχάσει τη VB6 και το OLE και πως λέγαμε πάλαι ποτέ πως ανοίγουν τα διάφορα extensions ???

    Μην πω τα τρικ στο registry που γίνονταν με το dllhost? (Δεν τα θυμάμαι, αλλά θυμάμαι ότι τα κάναμε)

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-10-2012, 14:47 71338 σε απάντηση της 71337

    Απ: Process.WaitForExit() null reference exception

    @Markos αστειεύομαι προφανώς :) Εξάλλου είχα πει από την αρχή οτι δεν κατέχω πολλά γυρω από το συγκεκριμένο θέμα

    @Pkanavos ο "παλαίουρας" δεν είχε ποτέ μα ποτέ μεγάλη επαφή με windows apps. :)


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems