2012-12-03 22 views
7

मैंने एक विंडोज़ एप्लीकेशन बनाया है। जब मैं अपने निष्पादन योग्य मैन्युअल रूप से निष्पादित करता हूं तो यह ठीक काम कर रहा है, लेकिन जब मैं एक विंडोज सेवा का उपयोग कर अपना एक्सई चलाता हूं तो यह असफल त्रुटि प्रदान करता है। मैं इकाई फ्रेमवर्क का उपयोग कर रहा हूँ। क्या इकाई फ्रेमवर्क के साथ कोई समस्या है?Exe फ़ाइल डेटाबेस कनेक्टिविटी के साथ मेरी विंडोज सेवा से नहीं चल रही है?

यहाँ मेरी कोड है:

private void Threadfun() 
    { 
     try 
     {    
      System.Diagnostics.Process.Start(@"D:\V-Tec\bin\Debug\VibrantIndexerForm.exe"); 
      if (System.IO.File.Exists(@"D:\VibrantIndexerSetup\MarcExport1.txt")) 
      { 
      } 
      else 
      { 
       System.IO.File.Create(@"D:\VibrantIndexerSetup\MarcExport1.txt").Dispose(); 
      } 

      System.IO.File.WriteAllText(@"D:\VibrantIndexerSetup\MarcExport1.txt", System.DateTime.Now.ToString()); 
      System.Threading.Thread.Sleep(100); 
     } 
     catch (Exception ex) 
     { 
     }  
    } 

private void time_Elapsed(object sender, ElapsedEventArgs e) 
    { 

     m_thread = new System.Threading.Thread(new System.Threading.ThreadStart(Threadfun)); 
     if (m_thread.IsAlive) 
     { 
     } 
     else 
     { 
      m_thread.Start(); 
     } 
    } 

    protected override void OnStart(string[] args) 
    { 
     if (time.Enabled == false) 
     {  
      time.Elapsed += new ElapsedEventHandler(time_Elapsed); 
      time.Interval = 2000; 
      time.Enabled = true; 
     } 
    } 

    protected override void OnStop() 
    { 
     time.Enabled = false; 
    } 

मैं अपने वेब सेवा की जाँच की और मेरी नोटपैड के लिए अपवाद संदेश मुद्रित, और इस त्रुटि मिली:

The underlying provider failed on Open.

लेकिन मैं केवल इस त्रुटि जब चलाने के एक विंडोज सेवा के रूप में। अगर मैं अपने exe मैन्युअल रूप से चलाता है यह ठीक काम करता है। क्या विंडोज सेवाओं में संदर्भ जोड़ने की कोई ज़रूरत है?

+2

विंडोज़ लॉग देखने की कोशिश करें। विन्डोज़ सेवा ने यहां अपवाद लिखा – Frank59

+0

हाँ मुझे अपने विंडोज़ लॉग में त्रुटि विवरण मिला, लेकिन मैं इसे कैसे हल कर सकता हूं। –

+0

क्या आप अपनी पोस्ट में त्रुटि विवरण जोड़ सकते हैं? – Frank59

उत्तर

1

मैं विंडोज़ सेवा के माध्यम से अपना आवेदन भी शुरू करता हूं। अगर मेरे कोड अपने विधि

try 
    { 
     IntPtr UserTokenHandle = IntPtr.Zero; 
     WindowsApi.WTSQueryUserToken(WindowsApi.WTSGetActiveConsoleSessionId(), ref UserTokenHandle); 
     WindowsApi.PROCESS_INFORMATION ProcInfo = new WindowsApi.PROCESS_INFORMATION(); 
     WindowsApi.STARTUPINFOW StartInfo = new WindowsApi.STARTUPINFOW(); 
     StartInfo.cb = Convert.ToUInt32(System.Runtime.InteropServices.Marshal.SizeOf(StartInfo)); 
     string arguments = " nonGUI"; 
     WindowsApi.CreateProcessAsUser(UserTokenHandle, pathToExe + "\\YourAppName.exe", arguments, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref StartInfo, ref ProcInfo); 

    catch (Exception ex) 
    { 
     //Catch excpetion 
    } 

यह वर्तमान उपयोगकर्ता खाते में एक प्रक्रिया पैदा करेगा में आप

public class WindowsApi 
{ 

    [DllImport("Wtsapi32.dll", EntryPoint = "WTSQueryUserToken", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool WTSQueryUserToken(uint SessionId, ref IntPtr phToken); 

    [DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUserW", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool CreateProcessAsUser([InAttribute()]IntPtr hToken, InAttribute(), MarshalAs(UnmanagedType.LPWStr)]string lpApplicationName, [InAttribute(), MarshalAs(UnmanagedType.LPWStr)] string lpCommandLine, [InAttribute()] IntPtr pProcessAttributes, [InAttribute()] IntPtr lpThreadAttributes, MarshalAs(UnmanagedType.Bool)] bool bInheritHandles, uint dwCreationFlags, [InAttribute()] IntPtr lpEnvironment, [InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)] string pCurrentDirectory, ref STARTUPINFOW lpStartupInfo, ref PROCESS_INFORMATION lpProcessInformation); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct SECURITY_ATTRIBUTES 
    { 
     public uint nLength; 
     public IntPtr lpSecurityDescriptor; 
     [MarshalAs(UnmanagedType.Bool)] 
     public bool bInheritHandle; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct STARTUPINFOW 
    { 
     public uint cb; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string lpReserved; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string lpDesktop; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string lpTitle; 
     public uint dwX; 
     public uint dwY; 
     public uint dwXSize; 
     public uint dwYSize; 
     public uint dwXCountChars; 
     public uint dwYCountChars; 
     public uint dwFillAttribute; 
     public uint dwFlags; 
     public ushort wShowWindow; 
     public ushort cbReserved2; 
     public IntPtr lpReserved2; 
     public IntPtr hStdInput; 
     public IntPtr hStdOutput; 
     public IntPtr hStdError; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct PROCESS_INFORMATION 
    { 
     public IntPtr hProcess; 
     public IntPtr hThread; 
     public uint dwProcessId; 
     public uint dwThreadId; 
    } 

} 

प्लेस निम्नलिखित कोड मदद कर सकते हैं देखें। यह कोड ऊपर है और फ़ाइल चल रहा है।

मेरी इच्छा है कि इससे मदद मिलेगी !! चीयर्स!

+0

windowsapi का नामस्थान प्राप्त करने में सक्षम नहीं है? –

+0

अब आप प्राप्त कर सकते हैं! मैंने जवाब संपादित किया है :-) –

+0

मैं अपनी वेब सेवा की जांच करता हूं और अपने नोटपैड पर अपवाद संदेश प्रिंट करता हूं, यह त्रुटि मिली: "अंतर्निहित प्रदाता ओपन पर विफल रहा।" लेकिन यह त्रुटि केवल तभी आती है जब मैं विंडो सेवा का उपयोग करता हूं। अगर मैं अपने exe मैन्युअल रूप से चलाने के लिए यह ठीक काम कर रहे हैं –