BCB6-Laufwerk wählen in dem bestimmte CD ist



  • Hi @ all !

    Habe schon wieder nen Anschlag auf euch vor, nachdem mein Programm mit ca. 600kb stärke nun läuft habe ich vor noch 2 erweiterungen einzubauen, wobei ich vor folgenden Problemen stehe:

    1. Laufwerk wählen...

    Ich möchte das bei Button1 klick abgefragt wird ob sich in einem laufwerk die cd mit dem namen "AUDIO_CD" befinded und wenn ja, in welchem (Laufwerkbuchstabe).

    2. Ordner vorhanden ?

    Ich möchte eine Abfrage erstellen bei der geprüft wird ob der ordner
    "%systemdrive%\test"
    mit den unterordnern
    "%systemdrive%\test\1"
    "%systemdrive%\test\2"
    und der datei
    "%systemdrive%\test\test.txt"

    vorhanden sind oder nicht.

    Wobei ich zusätzlich nicht weiß wie in c++ für zB "c:" ein platzhalter wie %systemdrive% (für die platte auf der win ist) deklariert wird.

    Hoffe ihr könnt mir mal wieder helfen.
    Danke schonmal im voraus.

    GreeZ

    Weedy



  • zu 1.
    Win 32 API:
    GetLogicalDrives oder GetLogicalDriveStrings
    GetDriveType
    GetVolumeInformation

    zu 2.

    extern PACKAGE bool __fastcall DirectoryExists(const AnsiString Directory);



  • So das mit den Ordnern klappt schonma wunderbar, danke

    über das was du mir mit dem CD laufwerk geschrieben hast finde ich leider nichts in der hilfefunktion...



  • Hallo

    Das sind WinAPI-Funktionen, da must du in der MSDN nachschauen
    GetLogicalDrives
    GetDriveType
    und so weiter.

    bis bald
    akari



  • Header

    Declared in Winbase.h; include Windows.h.
    Library

    Link to Kernel32.lib.
    DLL Requires Kernel32.dll.

    wie kann ich die libary linken und was muss ich noch machen außer includen von windows.h ?



  • #pragma link “[path]modulename[.ext]” oder so vlt ?

    und was mach ich mit der dll ?



  • Hallo

    in einem normalen Builder-Projekt must du gar nichts zusätzlich includen oder linken.
    Einfach ganz normal diese Funktionen verwenden.

    bis bald
    akari



  • Hab mir die Seiten angeschaut aber leider versteh ich die Funktionen nicht und hab jetzt keine gesehen die mir nen CD-Namen suchen kann und mir das Volume ausgibt.
    also zB wo die CD mit dem namen "AUDIO_CD" eingelegt ist...



  • Hallo

    schau mal hier und hier

    bis bald
    akari



  • habe jetzt folgenden code der grundsätzlich funktioniert:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      AnsiString slVolumeName;
      DWORD dwVolumeSerial;
    
      if(IsDiskInDrive(AnsiString("c"), slVolumeName,dwVolumeSerial))
             {
                    if (slVolumeName=="AUDIO_CD")Application->MessageBox("C","Laufwerk",32);
             }
    
      if(IsDiskInDrive(AnsiString("d"), slVolumeName,dwVolumeSerial))
            {
                    if (slVolumeName=="AUDIO_CD")Application->MessageBox("D","Laufwerk",32);
    
            }
    
    else  Application->MessageBox("Bitte cd einlegen","Fehler",32);
    }
    

    wenn keine disk eingelegt iss kommt die fehlermeldung, wenn disc zb in 😨 ist kommt erst die "D" message und trozdem die fehlermeldung, was hab ich falsch gemacht ?



  • Glaube du bist mit deinen zwei if's und einem else welches nur für das letzte if gilt durcheinander. Da keiner deine Logik kennt und es nicht ersichtlich ist, was geprüft wird, laääst sich nix genaues sagen-> Was sind c & d? Die Laufwerksbuchstaben?
    Wenn ja sollte doch die Prüfung lauten:

    Wenn DiskinDrive UND Volume==Audio_CD



  • Hier noch der Anfang des Codes:

    bool IsDiskInDrive(AnsiString slDrive, AnsiString &slVolName,
      DWORD& dwVolumeSerial)
    {
      bool blRetVal = false;
      UINT iErrMode;
      TCHAR szVolName[256];
      DWORD dwMaxComSize;
      DWORD dwFlags;
      TCHAR szFS[256];
    
      // Falls Laufwerksname übergeben:
      if(slDrive.Length() > 0)
      {
        // der Aufruf von SetErrorMode ist notwendig, Windows-Messagebox
        // "Laufwerk nicht bereit" zu unterdrücken:
        iErrMode = SetErrorMode(SEM_FAILCRITICALERRORS);
    
        // Laufwerksinformationen auslesen:
        blRetVal = GetVolumeInformation(
          (slDrive.SubString(1,1)+ ":\\").c_str(),
          szVolName, sizeof(szVolName), &dwVolumeSerial,
          &dwMaxComSize, &dwFlags, szFS, sizeof(szFS));
    
        // ErrorMode in ursprünglichen Zustand versetzen:
        SetErrorMode(iErrMode);
      }
      else blRetVal = false;
    
      // Volumen-Namen in überg. String schreiben:
      slVolName = blRetVal ? AnsiString(szVolName) : EmptyStr;
      return blRetVal;
    }
    
    bool GetDiskSpace(AnsiString slDrive, __int64& ilBytesTotal,
      __int64& ilBytesFree)
    {
      ilBytesFree  = DiskFree(slDrive.UpperCase()[1]-0x40);
      ilBytesTotal = DiskSize(slDrive.UpperCase()[1]-0x40);
      return ilBytesFree > -1 && ilBytesTotal > -1;
    }
    

    aber das else steht doch für alle ifs oder nicht ? wenn bla mach das wenn bla mach das und ansonten bring die fehlermeldung, oder wie müsste das dann sein ?



  • if...

    else if

    ...else if

    else



  • jo darauf war ich auch shcon gekommen, leider bringt mir das nix weil er dann direkt in der if bedingung vom 1. laufwerkbuchstaben der net mehr vorhanden ist ans ende des programms springt und somit die else überspringt

    die if bedingung müsste irgendwie anders gemacht werden, aber ich hab keine ahnung wie



  • kann mir niemand weiterhelfen ?



  • Hallo

    Ich versuche mich mal in Dein Problem hinein zu versetzen (schreibt man das auseinander?)

    Du hast den Code sicherlich von Bytes&More und da sieht der Aufruf ein wenig anders aus.

    Wenn Du das Problem mit if und else nicht lösen kannst, so musst Du es abändern

    Kannst Du das nicht in eine eigene Funktion legen?

    void testDrive(AnsiString DriveLetter)
    {
      AnsiString slVolumeName;
      DWORD dwVolumeSerial;
      if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true)
        Application->MessageBox(DriveLetter,"Laufwerk",32);     
      else  Application->MessageBox("Bitte cd einlegen","Fehler",32);
    }
    

    Du musst dann diese Funktion für alle Laufwerke, die Du testen willst, aufrufen

    Gruss Rostfrei[]



  • mh und was muss ich da noch machen wenn er alle laufwerke (a-z) nach der cd mit dem namen "AUDIO_CD" durchsuchen soll, er soll damit nicht aufhören falls es einen laufwerkbuchstaben nicht gibt und wenn die cd gefunden iss soll er aufhören und laufwerkbuchstaben ausgeben und wenn sie nirgends drin iss ne fehlermeldung



  • Hallo weedhead87

    char Alphabet[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',     'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
    
      bool SpecialRomFounded = false;
      for(int x = 0; x <= 25; x++)
        {
          SpecialRoomFounded = testDrive(Alphabet[x]);
          if(SpecialRoomFounded == true)
            break;
        }
      if(SpecialRomFounded == false)
        Application->MessageBox("Bitte cd einlegen","Fehler",32);
    
    bool testDrive(AnsiString DriveLetter)
    {
      AnsiString slVolumeName;
      DWORD dwVolumeSerial;
      if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true)
          if (slVolumeName=="AUDIO_CD")Application->MessageBox(DriveLetter,"Laufwerk",32);    
    }
    

    Weiss nicht, ob das ganze funktioniert; habe mir das gerade mal schnell aus den Fingern geaugt

    Gruss



  • ích glaube ich hab selbst ne funktion die funktoniert, habe ne schleife eingefügt:

    { for(int i=97;i<=122;i++) {
            char a=i;
      AnsiString DriveLetter=a;
      AnsiString slVolumeName;
      DWORD dwVolumeSerial;
      if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true&&slVolumeName=="AUDIO_CD")
        Application->MessageBox("lol","Laufwerk",32);
    }
      else  Application->MessageBox("Bitte cd einlegen","Fehler",32);
    }
    


  • ´mh missplaced else steht da, iss doch aber richtig, oder ?

    {
      AnsiString slVolumeName;
      DWORD dwVolumeSerial;
    
            for(int i=97;i<=122;i++)
            {
                    char a=i;
                    AnsiString DriveLetter=a;
    
                    if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true&&slVolumeName=="AUDIO_CD")
                     {
                        Application->MessageBox("lol","Laufwerk",32);
                     }
            }
            else  Application->MessageBox("Bitte cd einlegen","Fehler",32);
    }
    

    wenn ich das els vor die { setze gehts, aber dann kommt für jden buchstaben die fehlermeldung, ich will das die nur einma kommt


Anmelden zum Antworten