是这样的我需要调用冰点还原也就是deep freeze里的dfc.exe来查询冰点状态
而shell运行dfc.exe get / isfrozen后dfc.exe会运行大约3秒左右然后返回来个退出码,注意不是文本信息.
然后我用vb来获取它,试了好几次总是获取不到正确的退出码.参考的网上程序是autoit的也就是au3,autoit里面有一句Runwait可以直接待等程序运行完并获取退出码,vb没有此命令,该怎么办呢?shell并获取退出码的vb代码我已经找到了但没法正确获取估计跟dfc.exe不会立即返回退出码有关.望大家帮忙.

解决方案 »

  1.   

    因为Shell不会等待3秒你可以手动 Sleep 3000 (这个API函数要自己添加)或者用 OpenProcess WaitForSingleObject的办法等 程序运行结束
      

  2.   

    模块中声明:   
      Public   Declare   Sub   ExitProcess   Lib   "kernel32"   (ByVal   uExitCode   As   Long)   
      Public   Declare   Function   TerminateProcess   Lib   "kernel32"   (ByVal   hProcess   As   Long,   ByVal   uExitCode   As   Long)   As   Long   
        
      窗体代码:   
      Private   Sub   Command1_Click()   
        
            '   TerminateProcess   -1,   1125   'also   can     
              ExitProcess   1234   
                
      End   Sub   
        
      测试程序:   
        
      模块声明:   
      Public   Declare   Function   GetExitCodeProcess   Lib   "kernel32"   (ByVal   hProcess   As   Long,   uExitCode   As   Long)   As   Long   
        
      Public   Declare   Function   OpenProcess   Lib   "kernel32"   (ByVal   dwDesiredAccess   As   Long,   ByVal   bInheritHandle   As   Long,   ByVal   dwProcessId   As   Long)   As   Long   
        
                
      Public   Declare   Function   CloseHandle   Lib   "kernel32"   (ByVal   hProcess   As   Long)   As   Long   
        
      窗体代码:   
      Const   PROCESS_QUERY_INFORMATION   =   &H400   
      Const   PROCESS_TERMINATE   =   &H1   
      Dim   ret   As   Long   
      Dim   h   As   Long   
      Dim   pid   As   Long   
        
      Private   Sub   Command1_Click()   
        
        
        
      If   h   Then   
              GetExitCodeProcess   h,   ret   
              MsgBox   ret   
                
      Else   
              MsgBox   "fail"   
      End   If   
        
      End   Sub   
        
        
        
      Private   Sub   Form_Load()   
      pid   =   1448   
        
      h   =   OpenProcess(PROCESS_QUERY_INFORMATION   +   PROCESS_TERMINATE,   0,   pid)   
      End   Sub   
        
      Private   Sub   Form_Unload(Cancel   As   Integer)   
      If   h   Then   CloseHandle   h   
      End   Sub   
      

  3.   

    试试 ring3  或者ring0
      

  4.   

    上在那段程序,好向以前CSDN上有,试过没成功。
    我还试过sleep 1000-5000也没成功,sleep后是能获取但不正确.
      

  5.   

    为什么要用sleep?????
    试试用这个:Type POINTAPI
        X As Long
        Y As Long
    End TypeType Msg
        hWnd As Long
        Message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End TypeDeclare Function timeGetTime Lib "WINMM.DLL" () As Long
    Declare Function GetMessage Lib "user32" Alias "GetMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
    Declare Function TranslateMessage Lib "user32" (lpMsg As Msg) As Long
    Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As Msg) As LongSub Delay(ByVal lngMillisecond As Long)
        Dim lngStartTime As Long, lngProcTime As Long
        Dim wMsg As Msg
        
        lngStartTime = timeGetTime()
        
        Do
            GetMessage wMsg, 0&, 0, 0
            TranslateMessage wMsg
            DispatchMessage wMsg
            
            lngProcTime = timeGetTime - lngStartTime
            
        Loop While lngProcTime < lngMillisecond
    End Sub