用C++写一个WMI工具种,提示0xC0000005 Access Violation

用C++写一个WMI工具类,提示0xC0000005 Access Violation
我在写一个C++的WMI工具类。
1)getStringFromObject是从一个IWbemClassObject(对应WMI CIM里的class或者instance)里拿到属性名为strPropertyName的字符串。
2)getObjectFromObjectWithCheck是从一个IWbemClassObject里拿到名为strArgumentName的IWbemClassObject,用来解析WMI方法调用的返回值。
3)callMethod是调用WMI的一个实例的方法。

我的调用代码和这三个在下面,大体意思是枚举计算机上所有的Win32_LogicalShareSecuritySetting实例,得到他们的path到nStrPaths,调用Win32_LogicalShareSecuritySetting的GetSecurityDescriptor,解析SD到pSDInstance。然后查看pSDInstance的某个属性比如__PATH。

具体0xC0000005 Access Violation的位置在callMethod里,已经标注
我不知道是我的代码写的有问题呢(比如传com指针,但是没有释放过),还是callMethod传回来的根本就不是Win32_SecurityDescriptor的实例?还是什么别的原因?

	ADWMISearch *wmiSearcher = new ADWMISearch();
IWbemServices *pSvc = wmiSearcher->connect("xx-pc", "127.0.0.1", "", "", "");
IWbemClassObject *pLSSSClass = wmiSearcher->getWMIClass(pSvc, "Win32_LogicalShareSecuritySetting");

//获取所有的LSSS实例
vector<IWbemClassObject*> npObjects = wmiSearcher->query(pSvc, "", "", "Select * from Win32_LogicalShareSecuritySetting");
vector<CString> nStrPaths = wmiSearcher->getStringsFromObjects(npObjects, "__PATH");

//获取第一个SD
IWbemClassObject *pOutParams = wmiSearcher->callMethod(pSvc, pLSSSClass, "Win32_LogicalShareSecuritySetting",
nStrPaths[0], "GetSecurityDescriptor");
IWbemClassObject *pSDInstance = wmiSearcher->getObjectFromObjectWithCheck(pOutParams, "Descriptor"); //获取SD正常
CString strSDInstancePath = wmiSearcher->getStringFromObject(pSDInstance, "__PATH"); //出现access violation



CString ADWMISearch::getStringFromObject(IWbemClassObject* pObject, CString strPropertyName)
{
_bstr_t bstrPropertyName = strPropertyName;

VARIANT vtProperty;
CString strProperty;
// Get the value of the property
VariantInit(&vtProperty);
HRESULT hResult = pObject->Get(bstrPropertyName, 0, &vtProperty, 0, 0); //具体这里出现access violation
if (SUCCEEDED(hResult) && V_VT(&vtProperty) == VT_BSTR)
{
strProperty = vtProperty.bstrVal;
VariantClear(&vtProperty);
return strProperty;
}
else
{
VariantClear(&vtProperty);
MyMessageBox_Error(_T("getStringsFromObjects"));
return _T("");
}
}

IWbemClassObject* ADWMISearch::getObjectFromObjectWithCheck(IWbemClassObject *pOutParams, CString strArgumentName)
{
if (!pOutParams)
{
MyMessageBox_Error(_T("getObjectFromObjectWithCheck"));
return NULL;
}

HRESULT hResult;
VARIANT varReturnValue;
VARIANT varArgument;
hResult = pOutParams->Get(_bstr_t(L"ReturnValue"), 0, &varReturnValue, NULL, 0);
if (!SUCCEEDED(hResult))
{
VariantClear(&varReturnValue);
VariantClear(&varArgument);
MyMessageBox_Error(_T("getObjectFromObjectWithCheck"));
return NULL;
}
DWORD dwResult = varReturnValue.lVal;
//if (dwResult == 0)
//{
// MyMessageBox_Error(_T("getObjectFromObjectWithCheck"));
// return _T("");
//}

hResult = pOutParams->Get(_bstr_t(strArgumentName), 0, &varArgument, NULL, 0);
if (!SUCCEEDED(hResult))
{
VariantClear(&varReturnValue);
VariantClear(&varArgument);