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


Anmelden zum Antworten