如何使用C应用程序,以获得WMI数据?(How to obtain data from WMI us

2019-07-18 04:36发布

我有一个纯C应用程序发出的IOCTL调用我的适配器驱动程序,并显示信息,这是使用Visual Studio的开发5(非托管代码),但是编译...我需要使用WMI从我的适配器然而得到一些信息.. ..我的谷歌搜索的努力表明,我需要使用COM实现与WMI或C#和.NET应用程序一个任何形式的通信写一个C ++应用程序)是真的吗? 没有工作围绕我的C应用程序? b)若上述是真实的,什么是我需要做我的项目/ WP /工作区设置的最低水平变化?

由于索姆

Answer 1:

您可以从C调用COM的语法比C ++稍差友好的,但它的工作原理。 COM最初设计为从C或C ++的工作,和本机C语言支持包含在COM和WMI头文件。 这将是漫长的,但...你的程序将负责分配所有必需的对象,检查每个错误情况和每一个COM调用,并释放它初始化的对象。

当使用记使用C ++编写文档,转换形式的COM调用:

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

至:

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

下面是C代码最短的那一块,我能得到真正拉从WMI的一些信息。 如果成功的话,它应该列出你的计算机上的处理器,以MHz为单位的时钟频率一起。 该项目负责处置它分配资源,但它确实没有错误检查任何(你应该看看那些小时值继续每个步骤之前)。

这是一个Visual Studio 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);
}


Answer 2:

另一种选择,如果你想保持冲击到现有的C应用程序低,是写在内部可以使用C ++和COM包装类来查询所需的WMI信息的DLL。

此DLL可以提供普通的C接口,以适应您的应用程序。 这就是我会去的方式。



文章来源: How to obtain data from WMI using a C Application?
标签: c wmi