2009-09-16 9 views
6

मेरे पास एक शुद्ध सी एप्लिकेशन है जो आईओसीटीएल को मेरे एडाप्टर ड्राइवर को कॉल करता है और जानकारी प्रदर्शित करता है, हालांकि इसे विजुअल डेवलपर स्टूडियो 5 (गैर-प्रबंधित कोड) का उपयोग करके संकलित किया गया है ... मुझे कुछ जानकारी प्राप्त करने की आवश्यकता है हालांकि डब्लूएमआई का उपयोग करके मेरे एडाप्टर से .... मेरे गुगल प्रयासों से पता चलता है कि मुझे डब्ल्यूएमआई या सी # के साथ संचार के किसी भी रूप को प्राप्त करने के लिए COM का उपयोग करके सी ++ एप्लिकेशन लिखना होगा। .NET ऐप ए) क्या वास्तव में यह मामला है? मेरे सी आवेदन के लिए कोई काम नहीं है? बी) यदि ऊपर सत्य है, तो न्यूनतम स्तर परिवर्तन क्या हैं जिन्हें मुझे अपनी परियोजना/wp/workspace सेटिंग्स करने की आवश्यकता होगी?सी अनुप्रयोग का उपयोग कर डब्लूएमआई से डेटा कैसे प्राप्त करें?

धन्यवाद सोम

उत्तर

13

आप सी से COM आह्वान कर सकते हैं वाक्य रचना कुछ हद तक कम सी के ++ उस से अनुकूल है, लेकिन यह काम करता है। COM को प्रारंभ में सी या सी ++ से काम करने के लिए डिज़ाइन किया गया था, और मूल सी भाषा समर्थन COM और WMI शीर्षलेख फ़ाइलों में शामिल किया गया है। हालांकि यह लंबा होगा ... आपका कार्यक्रम सभी आवश्यक वस्तुओं को आवंटित करने, प्रत्येक COM कॉल से त्रुटि शर्तों की जांच करने और ऑब्जेक्ट को तुरंत जारी करने के लिए जिम्मेदार होगा।

मन में C++ के साथ लिखित दस्तावेज का उपयोग कर, फार्म की COM कॉल कन्वर्ट:

pSomething->Method(arg1, ...); // C++ 

रहे हैं:

pSomething->lpVtbl->Method(pSomething, arg1, ...); // C 

नीचे सी कोड का सबसे छोटा टुकड़ा है मैं वास्तव में खींचने के लिए मिल सकता है डब्ल्यूएमआई से कुछ जानकारी। यदि सफल हो, तो इसे आपके कंप्यूटर पर प्रोसेसर को एमएचजेड में उनकी घड़ी आवृत्ति के साथ सूचीबद्ध करना चाहिए। कार्यक्रम आवंटित संसाधनों का निपटान करने का ख्याल रखता है, लेकिन यह किसी भी त्रुटि की जांच में कोई त्रुटि नहीं करता है (आपको प्रत्येक चरण को जारी रखने से पहले उन एचआर मानों को देखना चाहिए)।

यह एक दृश्य स्टूडियो 2008 "Win32 कंसोल एप्लिकेशन" है जिसका मुख्य फ़ाइल एक .c एक्सटेंशन में बदल दिया गया है, और अतिरिक्त stdafx फ़ाइलों को हटा दिया गया है। प्रोग्राम को लिंक करने के लिए, कॉन्फ़िगरेशन गुण/लिंकर/इनपुट/अतिरिक्त निर्भरता के तहत, प्रोजेक्ट गुणों में wbemuuid.lib को शामिल करना सुनिश्चित करें। यह मेरे Vista बॉक्स पर सफलतापूर्वक भाग गया।

#define _WIN32_WINNT 0x0400 
#define _WIN32_DCOM 

#include <stdio.h> 
#include <tchar.h> 
#include <windows.h> 
#include <wbemidl.h> 

void _tmain(int argc, _TCHAR* argv[]) 
{ 
    // result code from COM calls 
    HRESULT hr = 0; 

    // COM interface pointers 
    IWbemLocator   *locator = NULL; 
    IWbemServices  *services = NULL; 
    IEnumWbemClassObject *results = NULL; 

    // BSTR strings we'll use (http://msdn.microsoft.com/en-us/library/ms221069.aspx) 
    BSTR resource = SysAllocString(L"ROOT\\CIMV2"); 
    BSTR language = SysAllocString(L"WQL"); 
    BSTR query = SysAllocString(L"SELECT * FROM Win32_Processor"); 

    // initialize COM 
    hr = CoInitializeEx(0, COINIT_MULTITHREADED); 
    hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); 

    // connect to WMI 
    hr = CoCreateInstance(&CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, (LPVOID *) &locator); 
    hr = locator->lpVtbl->ConnectServer(locator, resource, NULL, NULL, NULL, 0, NULL, NULL, &services); 

    // issue a WMI query 
    hr = services->lpVtbl->ExecQuery(services, language, query, WBEM_FLAG_BIDIRECTIONAL, NULL, &results); 

    // list the query results 
    if (results != NULL) { 
     IWbemClassObject *result = NULL; 
     ULONG returnedCount = 0; 

     // enumerate the retrieved objects 
     while((hr = results->lpVtbl->Next(results, WBEM_INFINITE, 1, &result, &returnedCount)) == S_OK) { 
      VARIANT name; 
      VARIANT speed; 

      // obtain the desired properties of the next result and print them out 
      hr = result->lpVtbl->Get(result, L"Name", 0, &name, 0, 0); 
      hr = result->lpVtbl->Get(result, L"MaxClockSpeed", 0, &speed, 0, 0); 
      wprintf(L"%s, %dMHz\r\n", name.bstrVal, speed.intVal); 

      // release the current result object 
      result->lpVtbl->Release(result); 
     } 
    } 

    // release WMI COM interfaces 
    results->lpVtbl->Release(results); 
    services->lpVtbl->Release(services); 
    locator->lpVtbl->Release(locator); 

    // unwind everything else we've allocated 
    CoUninitialize(); 

    SysFreeString(query); 
    SysFreeString(language); 
    SysFreeString(resource); 
} 
+0

हाय Oren, धन्यवाद एक टन, कि Win2008 .हालांकि पर एक विजेता की तरह काम किया, जब मैं पहली बार विजुअल स्टूडियो 2005 पर यह कोशिश की, नीचे उन पर नज़र डाल मैं संकलन मुद्दों में भाग: त्रुटि C2065: 'COINIT_MULTITHREADED': अविकसित पहचानकर्ता त्रुटि C2065: 'EOAC_NONE': अविकसित पहचानकर्ता 2005 के लिए उन्हें हल करने के तरीके पर कोई विचार? धन्यवाद सोम – smam

+0

फ़ाइलों को शामिल करने से पहले #define _WIN32_WINNT 0x0400 और #define _WIN32_DCOM जोड़ने का प्रयास करें। इस समस्या का समाधान नहीं होता है, बस के साथ 0. –

+0

हाय Oren दोनों लापता स्थिरांक की जगह, हाँ, यह पहले पाउंड के साथ काम किया अपने आप में एक बहुत परिभाषित करते हैं, एक बार फिर से धन्यवाद सोम – smam

2

एक अन्य विकल्प, आप अपने मौजूदा सी आवेदन कम करने के लिए प्रभाव रखना चाहते हैं, एक DLL कि आंतरिक रूप से वांछित WMI जानकारी क्वेरी करने के लिए सी ++ और COM आवरण वर्गों का उपयोग कर सकते लिखने के लिए है।

यह डीएलएल आपके आवेदन को अनुकूलित करने के लिए एक सादा सी इंटरफेस प्रदान कर सकता है। जिस तरह से मैं जाऊंगा।

+1

बिल्कुल, सी में सभी COM सामान को न केवल दर्द, बल्कि वास्तविक अनुप्रयोग की तुलना में एक पूरी तरह से अलग अमूर्त स्तर पर भी। – Wolf

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