gpt4 book ai didi

c - 如何使用 C 应用程序从 WMI 获取数据?

转载 作者:太空狗 更新时间:2023-10-29 17:17:08 26 4
gpt4 key购买 nike

我有一个纯 C 应用程序,它向我的适配器驱动程序发出 IOCTL 调用并显示信息,但是这是使用 Visual Developer Studio 5(非托管代码)编译的...我需要使用我的适配器获取一些信息WMI ....我的谷歌搜索表明我需要使用 COM 编写一个 C++ 应用程序来实现与 wMI 或 C# 与 .NET 应用程序的任何形式的通信a) 真的是这样吗?我的 C 应用程序没有解决方法?b) 如果以上为真,我需要进行项目/wp/工作区设置的最低级别更改是多少?

谢谢索姆

最佳答案

您可以从 C 调用 COM。语法不如 C++ 友好,但它可以工作。 COM 最初设计用于从 C 或 C++ 运行,并且原生 C 语言支持包含在 COM 和 WMI 头文件中。不过这会很长……您的程序将负责分配所有必要的对象,检查每个 COM 调用的错误条件,并释放它实例化的对象。

在使用以 C++ 编写的文档时,请转换以下形式的 COM 调用:

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

到:

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

下面是我实际可以从 WMI 中提取一些信息的最短的 C 代码。如果成功,它应该列出您计算机上的处理器,以及它们以 MHz 为单位的时钟频率。该程序会处理它分配的资源,但不会进行任何错误检查(您应该在继续每个步骤之前查看这些 hr 值)。

这是一个 visual studio 2008“Win32 控制台应用程序”,主文件重命名为 .c 扩展名,并删除了额外的 stdafx 文件。要使程序链接,请确保在项目属性中包含 wbemuuid.lib,位于 Configuration Properties/Linker/Input/Additional Dependencies 下。它在我的 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);
}

关于c - 如何使用 C 应用程序从 WMI 获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com