2011-05-16 12 views
5

मैंने स्लिम डीएक्स का उपयोग कर सी # में डायरेक्ट 3 डी 9 आधारित प्रतिपादन इंजन लिखा है। एक नई परियोजना में अब मुझे एक webservice का उपयोग कर लोड 3 डी दृश्य की तस्वीरें वितरित करने की आवश्यकता है। समस्या यह है कि कुछ भी प्रस्तुत करने के लिए मुझे डायरेक्ट 3 डी डिवाइस की आवश्यकता है। क्या किसी उपयोगकर्ता को सिस्टम में लॉग इन किए बिना डायरेक्ट 3 डी डिवाइस बनाने और डेस्कटॉप लॉक नहीं होने का कोई तरीका है?लॉक सिस्टम पर 3 डी दृश्य प्रस्तुत करें

यदि यह संभव नहीं है, तो क्या किसी को कामकाज के बारे में पता है? अंत में मुझे या तो एक निष्पादन योग्य की आवश्यकता है जिसे कुछ स्थानीय उपयोगकर्ता खाते या सेवा का उपयोग करके कार्य योजनाकार से चलाया जा सकता है, जो समय-समय पर कुछ दृष्टिकोणों से दृश्य की तस्वीरें प्रस्तुत करता है।

इंजन को दो हिस्सों में विभाजित किया गया है: इंजन स्वयं और प्रस्तुतकर्ता। तो अगर कोई दूसरा रास्ता नहीं है तो मैं ओपनजीएल या किसी अन्य तकनीक का उपयोग करके एक नया रेंडरर भी कार्यान्वित कर सकता हूं जो दृश्यमान फॉर्म के बिना प्रतिपादन की अनुमति देता है।

संपादित करें:

यह क्या मैं अब तक है:

protected override void OnContinue() { 
     base.OnContinue(); 

     NativeFunctions.SafeWindowStationHandle hwinsta = NativeFunctions.WindowStation.OpenWindowStation(
      "WinSta0", 
      true, 
      NativeFunctions.AccessMask.WINSTA_ALL_ACCESS); 

     if(hwinsta == null || hwinsta.IsClosed || hwinsta.IsInvalid) 
      Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error()); 

     if(NativeFunctions.WindowStation.SetProcessWindowStation(hwinsta.DangerousGetHandle())) { 
      NativeFunctions.SafeDesktopHandle ptrDesktop = NativeFunctions.WindowStation.OpenInputDesktop(
       0, 
       true, 
       NativeFunctions.AccessMask.DESKTOP_CREATEWINDOW); 

      if(ptrDesktop.IsClosed || ptrDesktop.IsInvalid) 
       return; 

      if(!NativeFunctions.WindowStation.SetThreadDesktop(ptrDesktop.DangerousGetHandle())) 
       return; 

      Log log = Logger.Instance.CreateLog("DXService", true, true, false); 

      log.LogMessage("Desktop set, creating D3D-Object.", LOGMESSAGELEVEL.CRITICAL, true); 

      Direct3D direct3D = new Direct3D(); 
      log.LogMessage("Direct3D object created, creating device.", LOGMESSAGELEVEL.CRITICAL, true); 

      if(direct3D.AdapterCount == 0) { 
       log.LogMessage("FATAL: direct3D.AdapterCount == 0"); 
      } 
     } 
    } 

यह एक न्यूनतम WindowsService का हिस्सा है। मैंने महत्वपूर्ण कोड ऑनकॉन्टीन्यू फ़ंक्शन में डाल दिया क्योंकि स्टार्टअप कोड से डीबग करना आसान है। मैंने इस सेवाओं को सक्रिय डेस्कटॉप से ​​बातचीत करने का अधिकार दिया है। जब मैं एक स्थानीय सिस्टम अकाउंट के रूप में सेवा चलाता हूं जो डेस्कटॉप और विंडोस्टेशन काम करता है लेकिन ग्राफिक्स एडाप्टर की संख्या अभी भी 0 है, जब मैं एक समर्पित उपयोगकर्ता खाते का उपयोग कर सेवा चलाता हूं तो मैं विंडोस्टेशन भी नहीं खोल सकता। क्या कोई और चीज है जिसे मैं कोशिश कर सकता हूं या मैं गलत कर रहा हूं? मैं विंडोज 7 मशीन पर इसका परीक्षण कर रहा हूं, जबकि मैं लॉग इन हूं क्योंकि डिबगिंग अन्यथा बहुत मुश्किल हो जाती है। क्या यह एक समस्या हो सकती है?

धन्यवाद

उत्तर

0

XP के दिनों में मैंने एक ऐसी परियोजना पर काम किया जिसने मशीन पर किसी सेवा से डायरेक्ट 3 डी हार्डवेयर प्रतिपादन को सफलतापूर्वक बुलाया, जिसमें कोई भी कंसोल में लॉग इन नहीं हुआ था। मैं पूरी तरह से (सरल) विवरण भूल जाता हूं, लेकिन किसी भी तरह से उपयोग करने योग्य HWND को पकड़ने के लिए "Window Station and Desktop Functions" API के कुछ उपयोग की आवश्यकता होती है। हालांकि सभी नई सुरक्षा सामग्री के साथ नए/सर्वर ओएस पूरी तरह से अलग हैं।

मुझे आश्चर्य होगा अगर ओपनजीएल इस क्षेत्र में डायरेक्ट 3 डी से बेहतर काम करता है, हालांकि यह एक कोशिश के लायक हो सकता है। अन्य चीजें जिन पर आप विचार कर सकते हैं:

  • एनवीडिया अपने जीपीजीपीयू/सीयूडीए सामान को दिमाग में हेडलेस सर्वर के साथ बहुत अधिक विकसित कर रहा है। यह सिर्फ काम करता है। इसका मतलब यह है कि यद्यपि गैर-ग्राफिक्स एपीआई पर आपकी सामग्री को पूरी तरह से कार्यान्वित करना है।
  • माइक्रोसॉफ्ट के RemoteFX (सर्वर 2008R2 और Win7) वीएम को सर्वर जीपीयू तक पहुंच प्राप्त करना आसान बनाता है। (इसके विपरीत, आपका सबसे आसान विकल्प सिर्फ एक वीएम में अपना रेंडरर चलाने के लिए हो सकता है।)
+0

विंडो स्टेशनों के संकेत के लिए बहुत बहुत धन्यवाद, क्या आप इस काम को करने के लिए कुछ क्रियाओं को याद रखने की कोशिश कर सकते हैं, क्योंकि यह लगभग वही है जो मुझे चाहिए। जो मैंने अभी तक पढ़ा है, उससे मुझे अपने ऐप को एक सेवा के रूप में चलाने की जरूरत है, इंटरैक्टिव डेस्कटॉप (सुरक्षा छेद) तक पहुंचने के लिए विशेषाधिकारों के साथ और फिर किसी भी तरह से मुझे एक वैध डिवाइस बनाने में सक्षम होना चाहिए। पर कैसे? ;) – Gooo

+0

क्षमा करें, यह बहुत समय पहले था और मैं वास्तव में उस कोड के साथ शामिल नहीं था।यह डेस्कटॉप स्क्रीन के लिए डेस्कटॉप एचडब्ल्यूएन प्राप्त करने के लिए आसान हो सकता है जो लॉगिन स्क्रीन (EnumDesktopWindows के माध्यम से) प्रदर्शित करने के लिए प्रयुक्त होता है या यह अधिक जटिल हो सकता है, मैं वास्तव में याद नहीं कर सकता। – timday

0

ओपन एक PBuffer संदर्भ का उपयोग करते हुए भी एक बंद डेस्कटॉप पर GPU त्वरण प्राप्त करने के लिए काम कर सकते हैं के मामले में; हालांकि यह दृढ़ता से ड्राइवर पर निर्भर करता है, जो लॉक होने पर पीबीफर को स्थायी रूप से क्षतिग्रस्त करने के लिए सेट कर सकता है, इसलिए वाईएमएमवी। मैं इसे एक शॉट दे दूंगा।

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