BSTR 差异

问题描述 投票:0回答:1

我正在编写一个程序,它从命令行获取输入并使用该输入连接到远程 WMI 服务器并执行方法。我的代码如下。

#define _WIN32_DCOM
#include <comdef.h>
#include <WbemIdl.h>
#include <stdio.h>
#pragma comment(lib, "wbemuuid.lib")

int wmain(int argc, wchar_t* argv[]) {
    // <SNIP>

    /* Build dynamic string containing the hostname of the target and namespace.
       Example: \\DSKT-390047\ROOT\CIMV2 */
    wchar_t cimv2[256] = { 0 };
    swprintf_s(cimv2, 256, L"\\\\%ls\\ROOT\\CIMV2", argv[1]);

    IWbemServices* pSvc = NULL;
    hr = pLoc->ConnectServer(BSTR(cimv2), BSTR(argv[2]), BSTR(argv[3]), NULL,
    0, NULL, NULL, &pSvc);
    if (FAILED(hr)) {
        pLoc->Release();
        CoUninitialize();
        return 1;
    }

    // <SNIP>
}

ConnectServer
需要8个参数,其中5个是
BSTR
类型。微软详细说明,要创建
BSTR
类型,我必须像下面这样
BSTR MyBstr = SysAllocString(L"foo");
这样做,但是,我看到一些开发人员在变量类型为
BSTR(variable)
的情况下也使用
wchar_t
,所以我在想有什么区别两者之间,因为我找不到关于后者的太多信息。

我现在这样做可以吗?或者我应该先分配

BSTR
类型,使用它们,然后释放它们?我认为我现在所做的方式避免了必须释放这些分配的对象的事实,但有些事情是不对的。

谢谢。

c++ c winapi com
1个回答
0
投票

wchar_t* 类型的(BSTR)强制转换是一个严重错误,当它编译和工作时,当需要 BSTR 的函数尝试对其进行操作时,将导致失败。

正确的做法是使用_bstr_t来换行。

_bstr_t f(L"Hello");
// pass f to a function that expects a BSTR.
© www.soinside.com 2019 - 2024. All rights reserved.