Narf! Geschrieben 1. Oktober 2002 Geschrieben 1. Oktober 2002 Hallo Mit-Informatiker! Habe ein Problem: Wie kann ich in VC++6 die Laufwerke erkennen und ihren Buchstaben (z.B. CD-ROM-LW, F:) und mir den Inhalt in einem Listenfeld oder Tree anzeigen lassen? Zitieren
Narf! Geschrieben 1. Oktober 2002 Autor Geschrieben 1. Oktober 2002 Wie kann ich prüfen ob das CD-Laufwerk geöffnet oder geschlossen ist und ob sich eine CD darin befindet oder nicht? Gibt es da irgend ein Steuerelement? Zitieren
ffGebaeck Geschrieben 1. Oktober 2002 Geschrieben 1. Oktober 2002 Hi, so, damit listest du alle Laufwerke in eine listbox, die listbox heist bei mir m_ctrlDrive, int nPos = 0; UINT nCount = 0; TCHAR szDrive[4]; strcpy(szDrive, "?:\\"); DWORD dwDriveList = ::GetLogicalDrives (); while (dwDriveList) { if (dwDriveList & 1) { szDrive[0] = 0x41 + nPos; //if(::GetDriveType(szDrive) == DRIVE_CDROM) m_ctrlDrive.AddString(szDrive); } dwDriveList >>= 1; nPos++; } und bittschö, mit dieser funktion öffnest/schliesst du dein CDRom void COpenCDRomDlg::OpenCloseCD(BOOL bOpenDrive, TCHAR cDrive) { MCI_OPEN_PARMS op; MCI_STATUS_PARMS st; DWORD flags; TCHAR szDriveName[4]; strcpy(szDriveName, "X:"); ::ZeroMemory(&op, sizeof(MCI_OPEN_PARMS)); op.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO; if(cDrive > 1) { szDriveName[0] = cDrive; op.lpstrElementName = szDriveName; flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; } else flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE; if (!mciSendCommand(0,MCI_OPEN,flags,(unsigned long)&op)) { st.dwItem = MCI_STATUS_READY; if(bOpenDrive) mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_OPEN,0); else mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0); mciSendCommand(op.wDeviceID,MCI_CLOSE,MCI_WAIT,0); } } viel Spass damit JO Zitieren
Narf! Geschrieben 15. Oktober 2002 Autor Geschrieben 15. Oktober 2002 Hi, wie kann ich das AutoPlay in meinem Programm aus/einschalten? Die Tipps für die CD-ROM-Kontrolle haben mir nicht sehr geholfen. Chiao! Zitieren
Klotzkopp Geschrieben 15. Oktober 2002 Geschrieben 15. Oktober 2002 Original geschrieben von Narf! wie kann ich das AutoPlay in meinem Programm aus/einschalten?Bei codeguru gibt es ein Beispielprojekt, in dem das gemacht wird. Da wird auch gezeigt, wie man mitbekommt, dass eine CD eingelegt oder entfernt wurde. Dürfte also genau das Richtige sein . http://codeguru.earthweb.com/misc/CdChange.shtml Die Tipps für die CD-ROM-Kontrolle haben mir nicht sehr geholfen.Warum nicht? Was funktioniert nicht? Eine Fehlerbeschreibung wäre recht hilfreich... Zitieren
Narf! Geschrieben 15. Oktober 2002 Autor Geschrieben 15. Oktober 2002 ... der Code Strukturen enthält, die ich nicht verarbeiten kann. Man hat mir auch schon geschrieben, dass ich wietere Headers includieren soll. Hab ich getan und ... nix! Die Fehlermeldungen blieben. Ich schau mal bei dem Link vorbei. Danke. Zitieren
Klotzkopp Geschrieben 15. Oktober 2002 Geschrieben 15. Oktober 2002 Original geschrieben von Narf! Man hat mir auch schon geschrieben, dass ich wietere Headers includieren soll. Hab ich getan und ... nix! Die Fehlermeldungen blieben. Bitte, sag uns doch, wie die Fehlermeldungen lauten. Dann können wir Dir weiterhelfen. Zitieren
Narf! Geschrieben 15. Oktober 2002 Autor Geschrieben 15. Oktober 2002 Ich war auf dem Link und habe mir das Beispiel runtergeladen, aber es entspricht nicht so ganz meinen Vorstellungen. Ich habe auch versucht das Programm umzuschreiben aber naja... Folgendes soll passieren: OnInitDialog AutoPlay aus; On"Ende" AutoPlay ein; Die Fehlermeldungen waren meistens "Nicht deklarierter Bezeichner". Zitieren
Guybrush Threepwood Geschrieben 15. Oktober 2002 Geschrieben 15. Oktober 2002 Hi, Die Fehlermeldung "Nichtdeklarierter Bezeichner" bedeutet das du irgendwo eine Variable benutzt die nirgendwo deklariert wurde. Das kommt leider öfters vor das bei Beispielen die Hälfte an Code fehlt, auch bei kompletten Projekten. Gruß Guybrush Zitieren
Narf! Geschrieben 16. Oktober 2002 Autor Geschrieben 16. Oktober 2002 Diese Fehlermeldungen beziehen sich auf den Code zum Öffnen/Schließen des CD-LW weiter oben. *TestDlg.cpp(482) : error C2065: 'MCI_OPEN_PARMS' : nichtdeklarierter Bezeichner *TestDlg.cpp(482) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'op' *TestDlg.cpp(482) : error C2065: 'op' : nichtdeklarierter Bezeichner *TestDlg.cpp(483) : error C2065: 'MCI_STATUS_PARMS' : nichtdeklarierter Bezeichner *TestDlg.cpp(483) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'st' *TestDlg.cpp(483) : error C2065: 'st' : nichtdeklarierter Bezeichner *TestDlg.cpp(490) : error C2228: Der linke Teil von '.lpstrDeviceType' muss eine Klasse/Struktur/Union sein *TestDlg.cpp(490) : error C2065: 'MCI_DEVTYPE_CD_AUDIO' : nichtdeklarierter Bezeichner *TestDlg.cpp(495) : error C2228: Der linke Teil von '.lpstrElementName' muss eine Klasse/Struktur/Union sein *TestDlg.cpp(496) : error C2065: 'MCI_OPEN_TYPE' : nichtdeklarierter Bezeichner *TestDlg.cpp(496) : error C2065: 'MCI_OPEN_TYPE_ID' : nichtdeklarierter Bezeichner *TestDlg.cpp(496) : error C2065: 'MCI_OPEN_ELEMENT' : nichtdeklarierter Bezeichner *TestDlg.cpp(496) : error C2065: 'MCI_OPEN_SHAREABLE' : nichtdeklarierter Bezeichner *TestDlg.cpp(500) : error C2065: 'mciSendCommand' : nichtdeklarierter Bezeichner *TestDlg.cpp(500) : error C2065: 'MCI_OPEN' : nichtdeklarierter Bezeichner *TestDlg.cpp(502) : error C2228: Der linke Teil von '.dwItem' muss eine Klasse/Struktur/Union sein *TestDlg.cpp(502) : error C2065: 'MCI_STATUS_READY' : nichtdeklarierter Bezeichner *TestDlg.cpp(505) : error C2228: Der linke Teil von '.wDeviceID' muss eine Klasse/Struktur/Union sein *TestDlg.cpp(505) : error C2065: 'MCI_SET' : nichtdeklarierter Bezeichner *TestDlg.cpp(505) : error C2065: 'MCI_SET_DOOR_OPEN' : nichtdeklarierter Bezeichner *TestDlg.cpp(507) : error C2228: Der linke Teil von '.wDeviceID' muss eine Klasse/Struktur/Union sein *TestDlg.cpp(507) : error C2065: 'MCI_SET_DOOR_CLOSED' : nichtdeklarierter Bezeichner *TestDlg.cpp(509) : error C2228: Der linke Teil von '.wDeviceID' muss eine Klasse/Struktur/Union sein *TestDlg.cpp(509) : error C2065: 'MCI_CLOSE' : nichtdeklarierter Bezeichner *TestDlg.cpp(509) : error C2065: 'MCI_WAIT' : nichtdeklarierter Bezeichner Ich habe auch schon eine Header-Datei includiert, die mir nachträglich gesendet wurde, hat nichts geändert. Sorry wegen des Chaos. Zitieren
Klotzkopp Geschrieben 16. Oktober 2002 Geschrieben 16. Oktober 2002 Du brauchst #include <mmsystem.h> in TestDlg.cpp, ziemlich am Anfang, aber auf jeden Fall hinter #include <stdafx.h>. Zitieren
Narf! Geschrieben 16. Oktober 2002 Autor Geschrieben 16. Oktober 2002 Jetzt sind es nur noch zwei Fehler. Mir ist auch noch nicht ganz klar, wie ich dieses void anwenden soll. Es soll in meinem Programm eingebunden werden, d.h. nicht nur bei OnInitDialog. *TestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__mciSendCommandA@16 *Debug/Test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise Zitieren
Klotzkopp Geschrieben 16. Oktober 2002 Geschrieben 16. Oktober 2002 Original geschrieben von Narf! Mir ist auch noch nicht ganz klar, wie ich dieses void anwenden soll. Es soll in meinem Programm eingebunden werden, d.h. nicht nur bei OnInitDialog.Du kannst einfach die erste und die letzte Zeile aus dem Beispiel weglassen. Was dann übrig bleibt, kannst Du in Deinen Code einfügen. *TestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__mciSendCommandA@16 *Debug/Test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise Du musst Dein Programm mit Winmm.lib verlinken. Das geht entweder über die Projekteinstellungen, oder indem Du in einer cpp-Datei, am besten nach den #includes, folgendes einfügst: #pragma comment( lib, "Winmm.lib" ) Zitieren
Narf! Geschrieben 17. Oktober 2002 Autor Geschrieben 17. Oktober 2002 Moin moin! Hat geholfen. Wie lese ich den Namen der CD? Zitieren
Narf! Geschrieben 17. Oktober 2002 Autor Geschrieben 17. Oktober 2002 Folgenden Code habe ich bei dem Link gefunden: 1. In the xDialog.cpp file, add- const UINT WM_AUTOPLAY = ::RegisterWindowMessage(_T("QueryCancelAutoPlay")); (steht auch in der xDialog.h-Datei) 2. In the message map in xDialog.cpp add this BEGIN_MESSAGE_MAP(xDialog, CDialog) //{{AFX_MSG_MAP(xDialog) ... //}}AFX_MSG_MAP ON_REGISTERED_MESSAGE(WM_AUTOPLAY, OnAutoPlay) (habe ich zwei Zeilen nach innerhalb AFX_MSG_MAP... hoch gerückt) END_MESSAGE_MAP() 3. In the xDialog.cpp, add the OnAutoPlay function. BOOL xDialog::OnAutoPlay() { return TRUE; // Cancel autoplay } 4. In the xDialog.h file, add OnAutoPlay function declaration. class xDialog : public CDialog { ... BOOL OnAutoPlay(); } (ging von alleine bei der Deklaration) Habe alles so geschrieben, aber: *TestDlg.cpp(67) : error C2758: 'WM_AUTOPLAY' : muss in der Basisklassen/Element-Initialisierungsliste des Konstruktors initialisiert werden testdlg.h(22) : Siehe Deklaration von 'WM_AUTOPLAY' *TestDlg.cpp(109) : error C2440: 'type cast' : 'const unsigned int CTestDlg::*' kann nicht in 'unsigned int *' konvertiert werden Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist *TestDlg.cpp(109) : error C2440: 'initializing' : 'void (__thiscall CCmdTarget::*)(void)' kann nicht in 'unsigned int' konvertiert werden Diese Konvertierung ist eine gueltige Standardkonvertierung, die implizit oder mit dem static_cast-Operator oder mit einer Typumwandlung im C- oder Funktionsformat durchgefuehrt wird :confused: Zitieren
Klotzkopp Geschrieben 17. Oktober 2002 Geschrieben 17. Oktober 2002 Original geschrieben von Narf! const UINT WM_AUTOPLAY = ::RegisterWindowMessage(_T("QueryCancelAutoPlay")); Das braucht nicht in der .h-Datei zu stehen. Und in der .cpp-Datei muss es außerhalb der Methoden stehen (also nicht innerhalb irgendwelcher geschweiften Klammern). (habe ich zwei Zeilen nach innerhalb AFX_MSG_MAP... hoch gerückt) Das ist nicht notwendig, sondern eher schädlich, weil es den Klassenassistenten durcheinanderbringt. Was die anderen beiden Fehlern angeht, könntest Du mal Zeile 109 hier reinstellen? Zitieren
Narf! Geschrieben 18. Oktober 2002 Autor Geschrieben 18. Oktober 2002 Habe alles umgeschrieben und es läuft. Danke. Ich würde das ganze aber als Void AutoPlayOn und AutoPlayOff schreiben wollen, da jetzt der Tree seinen Focus verliert und mit m_Tree.SetFocus() nicht wieder gesetzt bekommt, wenn ich eine neue CD einlege. Zitieren
Narf! Geschrieben 4. Dezember 2002 Autor Geschrieben 4. Dezember 2002 Wie kann ich die Bezeichnung einer CD lesen und in einer Variable speichern? Zitieren
Klotzkopp Geschrieben 4. Dezember 2002 Geschrieben 4. Dezember 2002 char pszVolume[200]; GetVolumeInformation( "D:\\", pszVolume, 199, NULL, NULL, NULL, NULL, 0 ); Zitieren
Narf! Geschrieben 24. September 2003 Autor Geschrieben 24. September 2003 Haben DVD-Laufwerke eine andere Kennung als CD-ROM-Laufwerke (DRIVE_CDROM)beim Erkennen? (Code siehe oben) Zitieren
Klotzkopp Geschrieben 24. September 2003 Geschrieben 24. September 2003 Hier bei mir zumindest nicht. Zitieren
Narf! Geschrieben 21. Juni 2004 Autor Geschrieben 21. Juni 2004 Noch 'ne Frage zu GetVolumeInformation(): Ich hätte auch gern die Seriennummer des Datenträgers, aber in die LPDWORD-Variable wird nie etwas geschrieben? Zitieren
Klotzkopp Geschrieben 21. Juni 2004 Geschrieben 21. Juni 2004 Bei mir funktioniert es. Zeig doch mal deinen Code. Zitieren
Narf! Geschrieben 23. Juni 2004 Autor Geschrieben 23. Juni 2004 Das ist er: CString CDDrive="F:"; char CD_Name[MAX_PATH]; LPDWORD SerNum; GetVolumeInformation(CDDrive, CD_Name, MAX_PATH, SerNum, NULL, NULL, NULL, NULL); Kann man für LPDWORD auch was anderes nehmen? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.