Newsgroup: it.comp.lang.visual-basic
Titolo: Problema CreateProcess

Ho sviluppato un'applicazione che usa l'api CreateProcess per eseguire 
delle applicazioni esterne, trale quali c'č l'explorer. In particolare ho 
la necessita' di creare una finestra con dimensioni e posizione impostate 
da me. So che questi parametri possono essere passati nella struttura 
STARTUPINFO che viene passata alla CreateProcess ma per far sě che l'api 
prenda in considerazione le dimensioni e la posizione č necessario 
valorizzare il valore dwFlags della struttura STARTUPINFO usando 
STARTF_USEPOSITION e STARTF_USESIZE.
In C gli esempi che ho trovato li concatenano cosě: 
STARTF_USESIZE|STARTF_USEPOSITION che non č altri che un OR ma se in VB 
scrivo STARTF_USESIZE Or STARTF_USEPOSITION La CreateProcess mi crea sě 
la finestra ma con posizione e dimensioni di default. 
Come posso creare una finestra di explorer con dimensioni e posizione 
custom?
-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~ KiavICQ:61810110 ~ KiavikHOO!:Kiavick ~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 custom?
 mmmm...così è un pò difficile posta la dichiarazione e la definizione della
struttura STARTUPINFO, se puoi!
Ciaoo
--------------------------------
Inviato via 
http://usenet.libero.it

 
eccola:
Private Type STARTUPINFO
   cb As Long
   lpReserved As String
   lpDesktop As String
   lpTitle As String
   dwX As Long
   dwY As Long
   dwXSize As Long
   dwYSize As Long
   dwXCountChars As Long
   dwYCountChars As Long
   dwFillAttribute As Long
   dwFlags As Long
   wShowWindow As Integer
   cbReserved2 As Integer
   lpReserved2 As Long
   hStdInput As Long
   hStdOutput As Long
   hStdError As Long
End Type
Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
  lpApplicationName As String, ByVal lpCommandLine As String, ByVal _
  lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
  ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
  ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, _
  lpStartupInfo As STARTUPINFO, lpProcessInformation As _
  PROCESS_INFORMATION) As Long
Private Const STARTF_USEPOSITION = &H4
Private Const STARTF_USESHOWWINDOW = &H1
Private Const STARTF_USESIZE = &H2



 Puoi postare anche il pezzo di codice nel valorizzi i parametri e chiami la
funzione?
Ciao


> eccola:

With StartInfo
  .cb = Len(StartInfo)
  .dwFlags = STARTF_USESHOWWINDOW
  .wShowWindow = SW_SHOWNORMAL
  .dwFlags = STARTF_USEPOSITION Or STARTF_USESIZE
  .dwX = AppModule.Xpos '=0
  .dwY = AppModule.Ypos '=0
  .dwXSize = AppModule.Width  '=200
  .dwYSize = AppModule.Height '=200
End With
'CommandLine = C:\Winnt\explorer.exe /root,c:\           
Ret = CreateProcess(vbNullString, _
                    CommandLine & " " & AppModule.Param, _
                    ByVal 0&, _
                    ByVal 0&, _
                    0&, _
                    0&, _
                    0&, _
                    vbNullString, _
                    StartInfo, _
                    ProcInfo)
Dovrebbe crearmi una finestra di explorer nell'angolo in alto a sx (0,0) 
di larghezza e altezza 200 ma me ne crea una come dice lui...



  Ho fatto qualche pro e in effetti sembre che la posizione e le dimensioni
vengano ignorate. Mi riservo di "spulciare" l'MSDN e se trovo qualcosa ti
faccio sapere.


 
Io avevo la stessa applicazione fatta in VC e lě funzionava tutto, ho 
deciso di passarla in VB perche il VC non lo conosco molto bene ed in Vb 
č piů manutenibile...
Ho pensato che potesse essere un problema del tipo di dati usato nella 
struttura STARTUPINFO... Ho fatto diverse prove ma senza risultato...


 struttura STARTUPINFO... Ho fatto diverse prove ma senza risultato...
 Anche io sospetto ciņ...sto spulciando e provando.
 Mo m'hai messo la curiositą heheeheh
Ciaoo


 
Cercando su google ho trovato altre persone col mio stesso problema dal 
lontano 1997 ma mai una risposta... Perň forse ho trovato un workaround: 
dopo aver creato la finestra richiamo la SetWindowPos... L'unico problema č 
ritrovarmi l'handle della finestra dal PID.


 ritrovarmi l'handle della finestra dal PID.
  Infatti, la SetWindowPos è la prima cosa che ho pensato, ma me so incaponito
con la CreateProcess...mo vedo de pensà pure a come trovare l'hWnd dal
PID...ciaooo


 ritrovarmi l'handle della finestra dal PID.
 Questo č per ricavare l'hWnd di una top window associata ad un processo.
 Non č il max ma funzia heheeheheh ( intanto che riesco a capě perchč la
CreatePorcess non va ).
Const GW_HWNDNEXT = 2
Function Pid2Wnd(ByVal v_lSrcPID As Long) As Long
    Dim hWnd As Long,
    Dim lPID As Long, lThreadID As Long
    hWnd = FindWindow(vbNullString,vbNullString)
    Do While hWnd <> 0
       If GetParent(hWnd) = 0 Then '* Verifica che sia una Top Window
          lThreadID = GetWindowThreadProcessId(hWnd, lPID)
          If lPID = v_lSrcPID Then Pid2Wnd = hWnd : Exit Do
        End If
        hWnd = GetWindow(hWnd, GW_HWNDNEXT) '* Finestra successiva
    Loop
End Function
Ciaooooooo


 ritrovarmi l'handle della finestra dal PID.
 Questo è il codice per ricavare l'hWnd della finestra dal PID, non è il max
ma funzia, nel frattempo che si riesca a capire il mistero della
CreateProcess...Ciaooo
Function Pid2Wnd(ByVal v_lSrcPID As Long) As Long
    Dim hWnd As Long
    Dim lPID As Long, lThreadID As Long
    hWnd = FindWindow(vbNullString, vbNullString)
    Do While hWnd <> 0
       If GetParent(hWnd) = 0 Then '* Verifica che sia una Top Window
          lThreadID = GetWindowThreadProcessId(hWnd, lPID)
          If lPID = v_lSrcPID Then Pid2Wnd = hWnd: Exit Do
        End If
        hWnd = GetWindow(hWnd, GW_HWNDNEXT) '* Finestra successiva
    Loop
End Function


 
Grazie ora lo integro subito...
