void __fastcall TForm1::Button1Click(TObject *Sender)
{
CoUninitialize();
HRESULT hr;
hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr))
{
Memo1->Lines->Add("Failed to initialise COM library");
return;
}
hr=CoInitializeSecurity(NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
if (FAILED(hr))
{
Memo1->Lines->Add("Failed to initialise security");
CoUninitialize();
return;
}
IWbemLocator *pLoc =0;
hr=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *) &pLoc);
if (FAILED(hr))
{
Memo1->Lines->Add("Failed to create IWbemLocator object");
CoUninitialize();
return;
}
IWbemServices *pSvc = 0;
hr=pLoc->ConnectServer(BSTR(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc);
if (FAILED(hr))
{
Memo1->Lines->Add("Failed to connect");
CoUninitialize();
return;
}
hr=CoSetProxyBlanket(pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE);
if (FAILED(hr))
{
Memo1->Lines->Add("Failed to set proxy blanket");
CoUninitialize();
return;
}
IEnumWbemClassObject * pEnum = NULL;
WideString ws1,ws2;;
ws1=L"WQL";
ws2=L"SELECT * FROM Win32_Process";
hr=pSvc->ExecQuery(L"WQL" ,L"SELECT * FROM Win32_Process",
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,&pEnum);
if (FAILED(hr))
{
Memo1->Lines->Add("Failed to query");
CoUninitialize();
return;
}
IWbemClassObject * pclsObj;
ULONG uReturn=0;
pEnum->Reset();
//int i=0;
while (pEnum)
{
// i++;
// if (i>10)
// {
// break;
// }
hr=pEnum->Next(WBEM_INFINITE,1,&pclsObj,&uReturn);
if (FAILED(hr))
{
break;
}
VARIANT vt1;
AnsiString asValue;
hr=pclsObj->Get(L"CommandLine",0,&vt1,0,0);
if (FAILED(hr))
{
break;
}
Memo1->Lines->Add(vt1.bstrVal);
VariantClear(&vt1);
}
CoUninitialize(); //breakpoint here is fine!
}
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
by: jkrPosted on 2009-09-23 at 07:42:28ID: 25403626
The problem is
if (FAILED(hr))
{
break;
}
inside the loop - if the enumeration has ended, 'WBEM_S_FALSE' is returned, which technically is not a failure code - try
Select allOpen in new window