2009-09-17 10 views
9

मैं एक ऑफिस एप्लिकेशन (वीबीए) लपेट रहा हूं जो एप्लिकेशन के लिए भारी भारोत्तोलन करने के लिए सी # कंसोल एप्लिकेशन को कॉल करता है (बड़े सिमुलेशन प्रोग्राम)। मैं कंसोल एप्लिकेशन को पूरा करने के साथ ही कंसोल एप्लिकेशन से निकास कोड को पुनः प्राप्त करने के लिए वीबीए एप्लिकेशन का इंतजार करने में सक्षम होना चाहता हूं। मैं पूर्व करने में सक्षम हूं, लेकिन अभी तक एप्लिकेशन से निकास कोड पुनर्प्राप्त करने में सक्षम नहीं हूं। क्या कोई तरीका है कि मैंवीबीए शैल और बाहर निकलने के कोड के साथ प्रतीक्षा करें

Diagnostics.Process.Start(filePath) 

मैंने इसे वीबी में देखा है लेकिन वीबीए के बारे में निश्चित नहीं है। अन्यथा, कोई अन्य सुझाव?

उत्तर

12

WaitForSingleObject और GetExitCodeProcess फ़ंक्शंस पर एक नज़र डालें।

उदाहरण उपयोग:

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long 
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long 
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long 

Public Const INFINITE = &HFFFF 
Public Const PROCESS_ALL_ACCESS = &H1F0FFF 

Sub RunApplication(ByVal Cmd as String) 

    lTaskID = Shell(Cmd, vbNormalFocus) 
    //Get process handle 
    lPID = OpenProcess(PROCESS_ALL_ACCESS, True, lTaskID) 
    If lPID Then 
     //Wait for process to finish 
     Call WaitForSingleObject(lPID, INFINITE) 
     //Get Exit Process 
     If GetExitCodeProcess(lPID, lExitCode) Then 
      //Received value 
      MsgBox "Successfully returned " & lExitCode, vbInformation 
     Else 
      MsgBox "Failed: " & DLLErrorText(Err.LastDllError), vbCritical 
     End If 
    Else 
     MsgBox "Failed: " & DLLErrorText(Err.LastDllError), vbCritical 
    End If 
    lTaskID = CloseHandle(lPID) 
End Sub 

Public Function DLLErrorText(ByVal lLastDLLError As Long) As String 
    Dim sBuff As String * 256 
    Dim lCount As Long 
    Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100, FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000 
    Const FORMAT_MESSAGE_FROM_HMODULE = &H800, FORMAT_MESSAGE_FROM_STRING = &H400 
    Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000, FORMAT_MESSAGE_IGNORE_INSERTS = &H200 
    Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF 

    lCount = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0) 
    If lCount Then 
     DLLErrorText = Left$(sBuff, lCount - 2) \\Remove line feeds 
    End If 

End Function 
+1

मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। मैं सी # कंसोल एप्लिकेशन से निकास कोड को पुनः प्राप्त करने के लिए वीबीए फ़ंक्शन की तलाश में हूं, ऐसा लगता है कि यह दूसरी तरफ है। –

+1

वे विंडोज एपीआई कॉल हैं, आप उन्हें वीबीए एप्लिकेशन में उपयोग कर सकते हैं। – James

+1

इसके बारे में क्षमा करें, मैं इसे और देखेंगे। धन्यवाद –

3

यह कार्यक्षमता ShellAndWait समारोह में ऊपर लपेट कर दिया गया है।

here पर उत्कृष्ट लिखना।

+2

लेख के लिए धन्यवाद। मैंने अतीत में इसकी समीक्षा की थी; यह कॉल किए गए एप्लिकेशन से निकास कोड वापस नहीं करता है। यह केवल तभी होता है जब गोलाकार आवेदन सफलतापूर्वक समाप्त हो जाता है, यह एप्लिकेशन द्वारा भेजे गए निकास कोड के लिए जिम्मेदार नहीं है। उदाहरण के लिए, यदि कंसोल एप्लिकेशन को फ़ाइल नहीं मिलती है तो यह 1 के एक्जिट कोड के साथ समाप्त हो जाती है, हालांकि खोल और प्रतीक्षा कोड सफल के रूप में वापस आ जाएगा क्योंकि एप्लिकेशन सही ढंग से समाप्त हो गया है। –

+0

आह, मेरे बुरे, मैंने इसकी समीक्षा पर्याप्त नहीं की थी। कोई चिंता नहीं, हालांकि, मुझे लगता है कि जेम्स ने इसे ऊपर रखा है। – Mark

संबंधित मुद्दे