Win32 Konsolenanwendung / Visual C++ .net / Array aus Struct



  • Hallo Leute,

    habe da ein Problem auf ein Array das aus einem Struct besteht zuzugreifen.
    Eigentlich schreibe ich in VB, diesmal soll es aber C++ sein 😞

    Ich möchte die logischen Laufwerke eines Rechnerns auslesen und mit diesen Informationen die symbolischen Links ändern, sprich die Laufwerksbuchstaben tauschen. Eigentlich ist dass nicht so schwer und für ein einzelnes Laufwerk funktioniert das ohne weiteres.
    Um alle logischen Laufwerke auszulesen habe ich mir gedacht, ich baue (VB Manier) einen benutzerdefinerten Datentypen und mache daraus ein Array, indem ich dann die drei Informationen der Logischen Laufwerke ablege und später dann verarbeite.
    Da ich ein C++ Noob bin, scheitert es leider schon bei füllen des Arrays, bzw. beim Auslesen erhalte ich eine Speicherzugriffsverletzung *ahhrg

    Habe jetzt schon seit zwei Tagen das Internet und auch das board hier nach einer praktikablen Lösung dursucht, aber nix wirklich passendes gefunden. 😕

    Das sind die drei Werte, die ich für jedes Logische Laufwerk "speichern" will.

    TCHAR szDriveLetter;
    TCHAR szVolumeName;
    TCHAR szNtDeviceName;

    Also habe ich daraus nen struct gebaut und daraus ein Array gebildet.
    Aber leider bekomme ich kein Wert in das Array geschrieben...

    Hier der Code für das Auslesen der logischen Laufwerke. Der basiert auf einem MSDN Beitrag : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/enumerating_unique_volume_names.asp

    #define _WIN32_WINNT 0x0501
    
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <cstring>
    
    struct DriveInfo
    {
    	TCHAR *szDriveLetter;
    	TCHAR *szVolumeName;
    	TCHAR *szNtDeviceName;
    };
    
    #define BUFSIZE MAX_PATH
    #define MAXDRIVELETTERS 25
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//initialization
    	DriveInfo* Arr = new DriveInfo[MAXDRIVELETTERS];
    
    	BOOL bFlag;
    	TCHAR Buf[BUFSIZE];           // temporary buffer for volume name
    	TCHAR Drive[] = TEXT("c:\\"); // template drive specifier
    	TCHAR Temp[] = TEXT("c:\\"); // template drive specifier
    	TCHAR I;                      // generic loop counter
    	int i;
    
    	char szNtDeviceNameTemp[BUFSIZE]; // temporary buffer for NTDeviceName
    
    	i=0;
    
    	// Walk through legal drive letters, skipping floppies.
    	for (I = TEXT('c'); I < TEXT('z');  I++ ) 
    	{
    		// Stamp the drive for the appropriate letter.
    		Drive[0] = I;
    
    		//LogicalDrivesArray[i].szDriveLetter=I;
    
    		bFlag = GetVolumeNameForVolumeMountPoint(
    					Drive,  // input volume mount point or directory
    					Buf,    // output volume name buffer
    					BUFSIZE // size of volume name buffer
    				);
    
    		if (bFlag) 
    		{
    			Arr[i].szVolumeName = Buf;
    
    			// remove end backslash for query
    			Temp[0] = Drive[0];
    			Temp[1] = Drive[1];
    			Temp[2] = '\0';
    
    			Arr[i].szDriveLetter = Temp;
    
    			// get NTDeviceName from DriveLetter
    			if (QueryDosDevice (Temp, szNtDeviceNameTemp, MAX_PATH))
    			{
    				Arr[i].szNtDeviceName = szNtDeviceNameTemp;
    			}
    
    			_tprintf (TEXT("\"%s\"\n"), Buf);
    		}
    		i++;
    	}
    
    	for (i=0; i<MAXDRIVELETTERS; i++)
    	{
    		printf("\n%s %s %s", Arr[i].szDriveLetter, Arr[i].szVolumeName, Arr[i].szNtDeviceName);
    	}
    
    	//cleanup
    	delete[] Arr;
    
    	return 0;
    }
    

    Freue mich über jeden Beitrag der mir helfen kann, das mit den struct-array zu verstehen.

    Schonmal danke im voraus



  • Wenn du MFC benutzt (wir sind schließlich in dem Forum 🙂 ) dann kannst du für sowas CList benutzen, siehe dazu diesen Thread

    Da siehst du auch wie er das mit statischem Array gelöst hat.



  • PanicMan schrieb:

    Wenn du MFC benutzt (wir sind schließlich in dem Forum 🙂 ) dann kannst du für sowas CList benutzen, siehe dazu diesen Thread

    Da siehst du auch wie er das mit statischem Array gelöst hat.

    hmm, wusste nicht genau wo ich es posten sollte. eigentlich muss es ein programm ohne mfc werden, also eine win32 konsolenanwedung... 😞



  • Dieser Thread wurde von Moderator/in estartu_de aus dem Forum MFC (Visual C++) in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Kein Problem, dafür gibts den Schiebeservice. 😉
    Viel Glück hier.


Anmelden zum Antworten