Problem mit WMI und wchar
-
Folgendes klappt:
#define _WIN32_DCOM #include <iostream> using namespace std; #include <comdef.h> #include <Wbemidl.h> # pragma comment(lib, "wbemuuid.lib") int main(int argc, char *argv[]) { IWbemLocator *pLocator = NULL; IWbemServices *pServices = NULL; IEnumWbemClassObject *pEnumerator = NULL; IWbemClassObject *pClsObj = NULL; unsigned long ulReturn = 0L; SetDebugPrivilege(); if(FAILED(CoInitializeEx(0, COINIT_MULTITHREADED))) { cout << "Fehler #100" << endl; return EXIT_FAILURE; } if(FAILED(CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL))) { cout << "Fehler #101" << endl; return EXIT_FAILURE; } if(FAILED(CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLocator))) { cout << "Fehler #102" << endl; CoUninitialize(); return EXIT_FAILURE; } if(FAILED(pLocator->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pServices))) { cout << "Fehler #103" << endl; pLocator->Release(); CoUninitialize(); return EXIT_FAILURE; } if(FAILED(CoSetProxyBlanket(pServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE))) { cout << "Fehler #104" << endl; pServices->Release(); pLocator->Release(); CoUninitialize(); return EXIT_FAILURE; } if(FAILED(pServices->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Process"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator))) { cout << "Fehler #105" << endl; pServices->Release(); pLocator->Release(); CoUninitialize(); return EXIT_FAILURE; } while(pEnumerator) { pEnumerator->Next(WBEM_INFINITE, 1, &pClsObj, &ulReturn); if(ulReturn == NULL) break; VARIANT vtProp; pClsObj->Get(L"Name", 0, &vtProp, 0, 0); wcout << vtProp.bstrVal << endl; VariantClear(&vtProp); pClsObj->Release(); } pEnumerator->Release(); pServices->Release(); pLocator->Release(); CoUninitialize(); cin.get(); return EXIT_SUCCESS; }Ändere ich jedoch die Zeile
pClsObj->Get(L"Name", 0, &vtProp, 0, 0);zu
pClsObj->Get(L"CommandLine", 0, &vtProp, 0, 0);erhalte ich zur Laufzeit einen "Access violation" Fehler (wcslen.c).
Was mache ich denn falsch?
Vielen Dank!!
-
Hallo,
Rückgabewert von
pClsObj->Get(L"Name", 0, &vtProp, 0, 0);prüfen, den Wert von:
vtProp.vt prüfen (kommt da vielleicht VT_EMPTY zurück, wenn keine CommandLine für einen Prozess existiert?), z.B. mit:
if (SUCCEEDED(hr) && (V_VT(&v) == VT_BSTR))und wenn alles passt, mit SysAllocString/SysFreeString arbeiten:
BSTR prop = SysAllocString(L"CommandLine"); ... SysFreeString(prop);MfG,
Probe-Nutzer
-
ich meinte natürlich:
Rückgabewert von
pClsObj->Get(L"CommandLine", 0, &vtProp, 0, 0);prüfen, ...
MfG,
Probe-Nutzer
-
DANKE! Das hat prima geklappt!
