| Index: base/wmi_util.cc
|
| ===================================================================
|
| --- base/wmi_util.cc (revision 8298)
|
| +++ base/wmi_util.cc (working copy)
|
| @@ -3,23 +3,45 @@
|
| // found in the LICENSE file.
|
|
|
| #include <windows.h>
|
| -#include <atlbase.h>
|
| +#include "base/basictypes.h"
|
| +#include "base/scoped_bstr_win.h"
|
| +#include "base/scoped_comptr_win.h"
|
|
|
| #pragma comment(lib, "wbemuuid.lib")
|
|
|
| #include "base/wmi_util.h"
|
|
|
| +namespace {
|
| +// Simple class to manage the lifetime of a variant.
|
| +// TODO(tommi): Replace this for a more useful class.
|
| +class VariantHelper : public VARIANT {
|
| + public:
|
| + VariantHelper() {
|
| + vt = VT_EMPTY;
|
| + }
|
| + explicit VariantHelper(VARTYPE type) {
|
| + vt = type;
|
| + }
|
| + ~VariantHelper() {
|
| + ::VariantClear(this);
|
| + }
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(VariantHelper);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| bool WMIUtil::CreateLocalConnection(bool set_blanket,
|
| IWbemServices** wmi_services) {
|
| - CComPtr<IWbemLocator> wmi_locator;
|
| - HRESULT hr = wmi_locator.CoCreateInstance(CLSID_WbemLocator, NULL,
|
| - CLSCTX_INPROC_SERVER);
|
| + ScopedComPtr<IWbemLocator> wmi_locator;
|
| + HRESULT hr = wmi_locator.CreateInstance(CLSID_WbemLocator, NULL,
|
| + CLSCTX_INPROC_SERVER);
|
| if (FAILED(hr))
|
| return false;
|
|
|
| - CComPtr<IWbemServices> wmi_services_r;
|
| - hr = wmi_locator->ConnectServer(CComBSTR(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL,
|
| - 0, 0, &wmi_services_r);
|
| + ScopedComPtr<IWbemServices> wmi_services_r;
|
| + hr = wmi_locator->ConnectServer(StackBstr(L"ROOT\\CIMV2"), NULL, NULL, 0,
|
| + NULL, 0, 0, wmi_services_r.Receive());
|
| if (FAILED(hr))
|
| return false;
|
|
|
| @@ -46,16 +68,17 @@
|
| IWbemClassObject** class_instance) {
|
| // We attempt to instantiate a COM object that represents a WMI object plus
|
| // a method rolled into one entity.
|
| - CComBSTR b_class_name(class_name.c_str());
|
| - CComBSTR b_method_name(method_name.c_str());
|
| - CComPtr<IWbemClassObject> class_object = NULL;
|
| + ScopedBstr b_class_name(class_name.c_str());
|
| + ScopedBstr b_method_name(method_name.c_str());
|
| + ScopedComPtr<IWbemClassObject> class_object;
|
| HRESULT hr;
|
| - hr = wmi_services->GetObject(b_class_name, 0, NULL, &class_object, NULL);
|
| + hr = wmi_services->GetObject(b_class_name, 0, NULL,
|
| + class_object.Receive(), NULL);
|
| if (FAILED(hr))
|
| return false;
|
|
|
| - CComPtr<IWbemClassObject> params_def = NULL;
|
| - hr = class_object->GetMethod(b_method_name, 0, ¶ms_def, NULL);
|
| + ScopedComPtr<IWbemClassObject> params_def;
|
| + hr = class_object->GetMethod(b_method_name, 0, params_def.Receive(), NULL);
|
| if (FAILED(hr))
|
| return false;
|
|
|
| @@ -81,34 +104,37 @@
|
| // http://msdn2.microsoft.com/en-us/library/aa389388(VS.85).aspx
|
|
|
| bool WMIProcessUtil::Launch(const std::wstring& command_line, int* process_id) {
|
| - CComPtr<IWbemServices> wmi_local;
|
| - if (!WMIUtil::CreateLocalConnection(true, &wmi_local))
|
| + ScopedComPtr<IWbemServices> wmi_local;
|
| + if (!WMIUtil::CreateLocalConnection(true, wmi_local.Receive()))
|
| return false;
|
|
|
| const wchar_t class_name[] = L"Win32_Process";
|
| const wchar_t method_name[] = L"Create";
|
| - CComPtr<IWbemClassObject> process_create;
|
| + ScopedComPtr<IWbemClassObject> process_create;
|
| if (!WMIUtil::CreateClassMethodObject(wmi_local, class_name, method_name,
|
| - &process_create))
|
| + process_create.Receive()))
|
| return false;
|
|
|
| - CComVariant b_command_line(command_line.c_str());
|
| + VariantHelper b_command_line(VT_BSTR);
|
| + b_command_line.bstrVal = ::SysAllocString(command_line.c_str());
|
| +
|
| if (!SetParameter(process_create, L"CommandLine", &b_command_line))
|
| return false;
|
|
|
| - CComPtr<IWbemClassObject> out_params;
|
| - HRESULT hr = wmi_local->ExecMethod(CComBSTR(class_name),
|
| - CComBSTR(method_name), 0, NULL,
|
| - process_create, &out_params, NULL);
|
| + ScopedComPtr<IWbemClassObject> out_params;
|
| + HRESULT hr = wmi_local->ExecMethod(StackBstr(class_name),
|
| + StackBstr(method_name), 0, NULL,
|
| + process_create, out_params.Receive(),
|
| + NULL);
|
| if (FAILED(hr))
|
| return false;
|
|
|
| - CComVariant ret_value;
|
| + VariantHelper ret_value;
|
| hr = out_params->Get(L"ReturnValue", 0, &ret_value, NULL, 0);
|
| if (FAILED(hr) || (0 != ret_value.uintVal))
|
| return false;
|
|
|
| - CComVariant pid;
|
| + VariantHelper pid;
|
| hr = out_params->Get(L"ProcessId", 0, &pid, NULL, 0);
|
| if (FAILED(hr) || (0 == pid.intVal))
|
| return false;
|
|
|