我正在编写一个程序,它从命令行获取输入并使用该输入连接到远程 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
类型,使用它们,然后释放它们?我认为我现在所做的方式避免了必须释放这些分配的对象的事实,但有些事情是不对的。
谢谢。
wchar_t* 类型的(BSTR)强制转换是一个严重错误,当它编译和工作时,当需要 BSTR 的函数尝试对其进行操作时,将导致失败。
正确的做法是使用_bstr_t来换行。
_bstr_t f(L"Hello");
// pass f to a function that expects a BSTR.