आप सी से 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);
}
हाय Oren, धन्यवाद एक टन, कि Win2008 .हालांकि पर एक विजेता की तरह काम किया, जब मैं पहली बार विजुअल स्टूडियो 2005 पर यह कोशिश की, नीचे उन पर नज़र डाल मैं संकलन मुद्दों में भाग: त्रुटि C2065: 'COINIT_MULTITHREADED': अविकसित पहचानकर्ता त्रुटि C2065: 'EOAC_NONE': अविकसित पहचानकर्ता 2005 के लिए उन्हें हल करने के तरीके पर कोई विचार? धन्यवाद सोम – smam
फ़ाइलों को शामिल करने से पहले #define _WIN32_WINNT 0x0400 और #define _WIN32_DCOM जोड़ने का प्रयास करें। इस समस्या का समाधान नहीं होता है, बस के साथ 0. –
हाय Oren दोनों लापता स्थिरांक की जगह, हाँ, यह पहले पाउंड के साथ काम किया अपने आप में एक बहुत परिभाषित करते हैं, एक बार फिर से धन्यवाद सोम – smam