BCB6-Laufwerk wählen in dem bestimmte CD ist



  • 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



  • ok ich habs nun endlich danke für eure hile (man bin ich doof)

    {
      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("CD gefunden","Laufwerk",32);
                     }
    
            else if (i==122)  Application->MessageBox("Bitte cd einlegen","Fehler",32);
    
            }
    }
    

    in dos gibts die variable %systemdrive% fürs windows verzeichnis
    gibts das unter c++ auch und wenn ja wie heißt diese variable oder wie bekomme ich diese info ?



  • Hallo

    char cBuf[MAX_PATH];
      GetWindowsDirectory(cBuf, sizeof(cBuf));
      ShowMessage("Windows-Verzeichnis: " + AnsiString(cBuf));
    

    Gruss Rostfrei[]



  • danke dir


Anmelden zum Antworten