Typ VARIANT
-
hallo
ich hab folgendes Problem:
VARIANT CHardwarePage::getProperty(CString propName, IWbemClassObject *wClass) { VARIANT value; VariantClear(&value); if (wClass!=NULL) wClass->Get(propName.AllocSysString(),0,&value,NULL,NULL); return value; }
diese funktion wird in einem programm aufgerufen, u da entsteht manchmal ein fehler mit dem VariantClear(&value)
was ich da nicht verstehe ist, wie value einen Wert bekommen kann, es wird ja nie ein wert zugewiesen oder?danke!
-
USER schrieb:
was ich da nicht verstehe ist, wie value einen Wert bekommen kann, es wird ja nie ein wert zugewiesen oder?
und was geschieht hier:
wClass->Get(propName.AllocSysString(),0,&value,NULL,NULL);value muss dadurch zwar nicht zwangsläufig einen wert bekommen, aber anzunehmen ist es schon.
-
weiß i net, das programm ist nicht von mir, muss aber fehler ausbessern. u da wird diese methode ein paar mal aufgerufen u. bei ein paar aufrufen entstehen fehler bei VariantClear(&value) beim durchdebugen. da kommt er gar nimma weiter.
-
uU ist VariantClear() fehlerhaft?
Denn der Code den du gepostet hast, passt.
Wobei ich davon ausgehe, dass VariantClear() und wClass->Get() fehlerfrei sind und richtig aufgerufen werden...
-
Was entsteht da für ein Fehler? Wie lautet die Fehlermeldung?
Code-Hacker
-
folgende Fehlermeldung:
Unhandled exception at 0x77f65554 in SystemMonitor.exe: User breakpoint.
es kann auch nicht so ein schwerwiegender Fehler sein, denn wenn, im release modus tritt kein fehler auf u das programm zeigt auch alles an.
// TestPage.cpp : implementation file // #include "stdafx.h" #include "SystemMonitor.h" #include "SystemMonitorDlg.h" #include "HardwarePage.h" #include "SysInfo.h" // CHardwarePage dialog IMPLEMENT_DYNAMIC(CHardwarePage, CDialogEx) CHardwarePage::CHardwarePage() : CDialogEx(CHardwarePage::IDD) { } CHardwarePage::~CHardwarePage() { } void CHardwarePage::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_HARDWARE_TREE, m_Tree); } BEGIN_MESSAGE_MAP(CHardwarePage, CDialogEx) END_MESSAGE_MAP() // CHardwarePage message handlers BOOL CHardwarePage::OnInitDialog() { CDialogEx::OnInitDialog(); FillTree(); return TRUE; // return TRUE unless you set the focus to a control } #ifndef NO_WMI IEnumWbemClassObject *CHardwarePage::getClassEnumeration(CString className, IWbemServices *wServices) { IEnumWbemClassObject *pEnumClasses = NULL; wServices->CreateInstanceEnum(className.AllocSysString(),0,NULL,&pEnumClasses); return pEnumClasses; } VARIANT CHardwarePage::getProperty(CString propName, IWbemClassObject *wClass) { VARIANT value; VariantClear(&value); if (wClass!=NULL) wClass->Get(propName.AllocSysString(),0,&value,NULL,NULL); return value; } #endif CString CHardwarePage::FillTree() { HTREEITEM root=m_Tree.InsertItem("Local machine"); CString CPU; #ifndef NO_WMI IWbemLocator *pIWbemLocator = NULL; if(CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pIWbemLocator) == S_OK) { IWbemServices *m_pIWbemServices; if(pIWbemLocator->ConnectServer(SysAllocString(L"\\\\.\\root\\cimv2"), NULL, //using current account for simplicity NULL, //using current password for simplicity 0L, // locale 0L, // securityFlags NULL, // authority (domain for NTLM) NULL, // context &m_pIWbemServices) == S_OK) { IEnumWbemClassObject *classEnum=getClassEnumeration("Win32_Processor",m_pIWbemServices); ULONG count; IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { //CPU.Format("",getProperty("Name",classObj).lVal); CPU = CString(getProperty("Name",classObj).bstrVal); c=CPU; HTREEITEM proc=m_Tree.InsertItem(CString(getProperty("Name",classObj).bstrVal),root); CString temp; temp.Format("Clock speed - %d MHz",getProperty("CurrentClockSpeed",classObj).lVal); m_Tree.InsertItem(temp,proc); m_Tree.InsertItem("Manufacturer - "+CString(getProperty("Manufacturer",classObj).bstrVal),proc); m_Tree.InsertItem("Socket - "+CString(getProperty("SocketDesignation",classObj).bstrVal),proc); temp.Format("L2Cache size - %d KB",getProperty("L2CacheSize",classObj).lVal); m_Tree.InsertItem(temp,proc); temp.Format("L2Cache speed - %d MHz",getProperty("L2CacheSpeed",classObj).lVal); m_Tree.InsertItem(temp,proc); classObj->Release(); } classEnum->Release(); classEnum=getClassEnumeration("Win32_Bios",m_pIWbemServices); if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM proc=m_Tree.InsertItem("System Bios",root); m_Tree.InsertItem("Name - "+CString(getProperty("Name",classObj).bstrVal),proc); m_Tree.InsertItem("Manufacturer - "+CString(getProperty("Manufacturer",classObj).bstrVal),proc); m_Tree.InsertItem("Version - "+CString(getProperty("Version",classObj).bstrVal),proc); classObj->Release(); } classEnum->Release(); classEnum=getClassEnumeration("Win32_VideoController",m_pIWbemServices); if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM vc=m_Tree.InsertItem("Video Controller "+CString(getProperty("Description",classObj).bstrVal),root); CString temp; temp.Format("Ram size %d KB",getProperty("AdapterRAM",classObj).lVal/1024); m_Tree.InsertItem(temp,vc); temp.Format("Current resolution %d x %d", getProperty("CurrentHorizontalResolution",classObj).lVal, getProperty("CurrentVerticalResolution",classObj).lVal); m_Tree.InsertItem(temp,vc); temp.Format("Current refreshrate %d", getProperty("CurrentRefreshRate",classObj).lVal); m_Tree.InsertItem(temp,vc); classObj->Release(); } classEnum->Release(); // ports HTREEITEM ports=m_Tree.InsertItem("Communication Ports",root); classEnum=getClassEnumeration("Win32_SerialPort",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM drive=m_Tree.InsertItem(CString(getProperty("DeviceID",classObj).bstrVal),ports); classObj->Release(); } } while (count==1); classEnum->Release(); classEnum=getClassEnumeration("Win32_ParallelPort",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM drive=m_Tree.InsertItem(CString(getProperty("DeviceID",classObj).bstrVal),ports); classObj->Release(); } } while (count==1); classEnum->Release(); classEnum=getClassEnumeration("Win32_InfraredDevice",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM drive=m_Tree.InsertItem(CString(getProperty("Name",classObj).bstrVal),ports); classObj->Release(); } } while (count==1); classEnum->Release(); classEnum=getClassEnumeration("Win32_UsbController",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM drive=m_Tree.InsertItem(CString(getProperty("Description",classObj).bstrVal),ports); classObj->Release(); } } while (count==1); classEnum->Release(); HTREEITEM datastorage=m_Tree.InsertItem("Data Storage",root); // disk drives HTREEITEM disks=m_Tree.InsertItem("Disk Drives",datastorage); classEnum=getClassEnumeration("Win32_DiskDrive",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM drive=m_Tree.InsertItem(CString(getProperty("Caption",classObj).bstrVal),disks); m_Tree.InsertItem("Interface Type - "+CString(getProperty("InterfaceType",classObj).bstrVal),drive); m_Tree.InsertItem("Media Type - "+CString(getProperty("MediaType",classObj).bstrVal),drive); CString sizeString; UINT64 size=_atoi64(CString(getProperty("Size",classObj))); if (size>(1024*1024*1024)) { sizeString.Format("%d GB",size/(1024*1024*1024)); } else if (size>(1024*1024)) { sizeString.Format("%d MB",size/(1024*1024)); } else { sizeString.Format("%d Byte",size); } m_Tree.InsertItem("Size - "+sizeString,drive); classObj->Release(); } } while (count==1); classEnum->Release(); // cd drives HTREEITEM cddrives=m_Tree.InsertItem("CD Drives",datastorage); classEnum=getClassEnumeration("Win32_CDROMDrive",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM drive=m_Tree.InsertItem(CString(getProperty("Caption",classObj).bstrVal)+ " ("+CString(getProperty("Drive",classObj).bstrVal)+")",cddrives); classObj->Release(); } } while (count==1); classEnum->Release(); // floppy drives HTREEITEM floppy=m_Tree.InsertItem("Floppy Drives",datastorage); classEnum=getClassEnumeration("Win32_FloppyDrive",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { m_Tree.InsertItem(CString(getProperty("Caption",classObj).bstrVal),floppy); classObj->Release(); } } while (count==1); classEnum->Release(); // network HTREEITEM network=m_Tree.InsertItem("Network Adapters",root); classEnum=getClassEnumeration("Win32_NetworkAdapter",m_pIWbemServices); do { IWbemClassObject *classObj=NULL; if (SUCCEEDED(classEnum->Next(2000,1,&classObj,&count)) && count==1) { HTREEITEM adapter=m_Tree.InsertItem(CString(getProperty("Description",classObj).bstrVal),network); classObj->Release(); } } while (count==1); classEnum->Release(); m_pIWbemServices->Release(); } pIWbemLocator->Release(); } else { m_Tree.InsertItem("WMI not found! No Information available!",root); } #endif return CPU; }
das ist der ganze code dieser klasse
-
USER schrieb:
es kann auch nicht so ein schwerwiegender Fehler sein, denn wenn, im release modus tritt kein fehler auf u das programm zeigt auch alles an.
das lässt auf undefiniertes verhalten schliessen - sehr böse
Denn der Fehler macht sich in der release version (noch) nicht bemerkbar. Aber bei irgendeinem kunden wird er auftreten, und dann hast du ein problem.
also nicht darüber hinwegsehen und versuchen den fehler zu finden...
-
hab i auch nicht vor. schätze dass irgendwo ein pointer fehler ist, aber dafür muss ich zuerst mal wissen, woher value diesen wert bekommt
-
Geh das Programm doch mal Schrittweise durch für diesen Fall und lass dir mal sämtliche Inhalte von (allen nötigen) Variablen und Pointern anzeigen. Vielleicht findest du den Fehler dann.
Code-Hacker
-
VariantInit statt VariantClear
-
super danke! hat geklappt