IMoniker ** Zugriff scheitert (Zugriffsverletzung)



  • Hallo,

    ich habe momentan das Problem, das ich eine Funktion schreibe, in der ich die Gefundenen Geräte(DirectShow) in einer Pointer auf Pointer Liste speichern möchte, nun erhalte ich jedoch eine Zugrifsverletzung auf den Speicher wenn ich versuche auf eine Funktion zuzugreifen. vllt hat jemand eine Ahnung, warum der Zugriff schief läuft (hatte noch nicht viel mit zeigern auf zeigern zu tun).

    Hier der Code, benötigt werden die Header für DirectShow:

    IMoniker** GetDevices() {
    	IMoniker *dev = NULL;
    	IMoniker **devList = NULL;
    	IEnumMoniker *devs = NULL;
    	ICreateDevEnum *enumDevs = NULL;
    	HRESULT ret = NULL;
    	ULONG fetched = NULL; 
    	int i = 0;
    
    	//COMInitialisieren
    	CoInitialize(NULL);
    
    	//Speicher für DevList anfordern
    	devList = (IMoniker **)malloc(sizeof(IMoniker));
    
    	//EnumListe erstelen für VideoDevices
    	CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&enumDevs);
    
    	//Alles gut ?
    	if(SUCCEEDED(ret)) {
    		//Enumerator für GeräteKlasse erstellen
    		enumDevs->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &devs, 0);
    
    		//Alles gut ?
    		if(SUCCEEDED(ret)) {
    			//Solange noch geräte vorhanden sind 
    			while(devs->Next(0, &dev, &fetched) == S_OK) {				
    				devList = (IMoniker **)realloc(devList, i * sizeof(IMoniker));
    				devList[i] = dev;
    			}
    		}
    	}
    	//Objekte freigeben
    	enumDevs->Release();
    	devs->Release();		
    
    	//ComUninitialisieren 
    	CoUninitialize();
    
    	CLSID *id = NULL;
    	id = (CLSID *)malloc(sizeof(CLSID));
    	devList[0]->GetClassID(id); //#######Hier passiert die Zugriffsverletzung###########
    
    	return devList;
    }
    

    Mit freundlichen Grüßen

    Anon



  • devs->Next(0, &dev, &fetched)
    

    Der erste Parameter bestimmt "The number of items to be retrieved", siehe http://msdn.microsoft.com/en-us/library/dd542677%28v=VS.85%29.aspx. Du forderst also insgesamt 0 Moniker an. Dieser Aufruf ergibt mit Sicherheit nicht S_OK, sondern soetwas wie E_INVALIDARG oder zumindest S_FALSE.

    CoUninitialize();
    devList[0]->GetClassID(id);
    

    Zuerst sagst Du, dass Du mit COM nichts mehr zu tun haben willst. Im nächsten Schritt greifst Du aber auf ein COM-Objekt zu. Das geht natürlich nicht. CoUninitialize darfst Du erst aufrufen, wenn Du fertig bist, vorher nicht.

    Das ist aber sicherlich nicht das Problem des Crashes. Auf devList[0] darfst Du schließlich nur zugreifen, wenn Deine Variable i > 0 ist. Da Du aber aus oben genannten Gründen nicht einen Moniker bekommen hast, steht in devList[0] rein gar nichts verwertbares drinnen; i wird == 0 sein.

    BTW: Gewöhne Dir an, Rückgabewerte zu prüfen. Und in Deinem Fall ist auch die Prüfung von Parametern nötig (z.B. die Gültigkeit von i).



  • Vielen dank für deinen Tipp, hab ich noch nicht gewusst, hab übrigens auch vergessen i hochzuzählen 😉 beschäftige mich noch nicht sehr lange ca 1. Tag mit DirectShow.

    Mit freundlichen Grüßen

    Kevin Schönfeld


Anmelden zum Antworten