c语言调用.c,用C语言调用WMI

这只是一篇翻译

你可以用C语言调用WMI。虽然语法有一些不够C++友好,但是它可以工作。COM在初始设计的时候就能在C或C++中工作,COM和WMI的头文件包含对纯C语言的支持。但是程序会比较长……你的程序必须负责为所有对象分配内存,检测每个COM调用的错误,释放它初始化的对象的内存。

在使用用C++格式写的文档的时候,要在心里记着将COM调用从

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

转换成

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

下面就是我可以从WMI获取一些信息的最短的C代码片段。如果运行成功,将返回你电脑上的CPU列表和它们的时钟频率(以MHz为单位)。程序小心的释放了它分配的所有资源,但是没有做任何的错误处理(你必须在继续下一步之前检测hr的值)。

这是一个visual studio 2008(Demon注:经过我的测试,VC6.0也可以)的Win32控制台程序。为了让程序成功编译,确保在工程属性中包含wbemuuid.lib,在Configuration Properties/Linker/Input/Additional Dependencies下。(Demon注:我在程序中多加了一行#pragma comment(lib,"wbemuuid.lib"),可以不用配置)

#define _WIN32_WINNT 0x0400

#define _WIN32_DCOM

#include

#include

#include

#include

#pragma comment(lib,"wbemuuid.lib")

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);

}

随机文章:

这篇文章发布于 2010年08月29日,星期日,19:03,归类于 程序设计。您可以跟踪这篇文章的评论通过 RSS 2.0 feed。

您可以留下评论,或者从您的站点trackback。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值