Anfängerfrage: Funktion mit 2 Rückgabewerten (2.Versuch)
-
Hallo,
ich habe die Datei runtergeladen, kann vom Server gelöscht werden.
Ich habe versucht, das ganze in meine Anwendung zu integrieren.
Siehe: http://www.pctex.de/driveletter.zipEin Problem taucht noch auf, dann sollte es funktionieren:
Das Struct ist im main unsichtbar, obwohl es vom VisualStudio unter Global aufgeführt ist. (Siehe Zeile 51 der Datei DriveLetter.cpp in meinem Projekt)
Es ist, wie wenn pos[30] in der main unsichtbar ist.
Was mache ich da falsch?Eine Frage noch:
Wenn ich in drive.cpp ncoh weitere Funktionen einbinde, können die dann auch in den / die / das struct DriveInformations schreiben?Danke für die Geduld, ich glaube ich habe es (fast) verstanden.

mfg
trequ
-
zu 1: du hast ne win32-konsolenanwendung (versuche nen string anstelle des CStrings herzunehmen) -> selber suchen wie man das macht, gibt es zig einträge
zu 2: du müsstest andere funktionen auch auf dieses struct zugreifen lassen können, aber warum, du rufst es doch sowieso immer über die main aufalso, hau rein und sag bescheid wenn dus hinbekommen hast
-
kannst ja mal versuchen:
in das struct ne int einzubauen und im main nur auf dieses int zuzugreifen.
da kannst du schauen, ob das mit dem struct funktioniert...
-
Bummsfallera schrieb:
zu 1: du hast ne win32-konsolenanwendung (versuche nen string anstelle des CStrings herzunehmen) -> selber suchen wie man das macht, gibt es zig einträge
Also:
1. Habe ich das gelesen: http://www.josuttis.com/cppbuch/allg/string1.cpp.html
2. Hab ich es noch mal gelesen.
3. Hatte ich ein riesen ?
4. Musste ich an Perl denken: Ein String ist ein String und für die gibt es nur einen Typ.
5. Hab ich es eingebaut.
6. Habe ich versucht rauszufinden, warum cout jetzt Fehler produziert.
7. Habe ich auf std::cout umgestellt.
8. Funktioniert es immer noch nicht.
Ich habe immer noch nicht verstanden, warum C++ so viele Datentypen für Strings braucht. "abc" ist und bleibt ein String. Egal ob ich jetzt CString, char oder std::string verwende.

Bummsfallera schrieb:
zu 2: du müsstest andere funktionen auch auf dieses struct zugreifen lassen können, aber warum, du rufst es doch sowieso immer über die main auf
??? Wieso? Ich will ja noch mehr Infos sammeln, die ich dann alle in das Struct reinschreiben kann.
Hintergrund: Das ganze soll ein Programm werden, welches zu einem Kartenleser die Laufwerke zuordnet.
Wenn man einen USB Kartenleser anschließt, hat man z.B. 4 Laufwerke, welche alle "Wechseldatenträger" heißen.
Welcher ist jetzt CompactFlash? Genau: Try and Error.
Daher baue ich mein Programm in 3 Teile auf:
1. Lese alle Laufwerke und ihren Typ.
2. Lese die UniqueID für alle Laufwerke aus der Registry.
3. Lese zu dieser UniqueID die Hardware aus.
Demnach ist jeder Schritt eine Funktion, und jede Funktion schreibt in das struct.
Dann lese in in der Main die Werte aus.Bummsfallera schrieb:
kannst ja mal versuchen:
in das struct ne int einzubauen und im main nur auf dieses int zuzugreifen.
da kannst du schauen, ob das mit dem struct funktioniert...Hab folgendes probiert:
1. int i; im struct eingebaut;
2. in der Funktion auf 20 gesetzt.
3. in der main ausgegeben
Fehler:
<PFAD>\DriveLetter.cpp(52) : error C2065: 'drive_info' : undeclared identifier
<PFAD>\DriveLetter.cpp(52) : error C2109: subscript requires array or pointer type
<PFAD>\DriveLetter.cpp(52) : error C2228: left of '.i' must have class/struct/union type
(Ich habe pos[30] in drive_info[30] umbenannt, um die lesbarkeit zu erhöhen. Der Fehler tritt aber auch bei pos[30] auf.)mfg
trequ
-
kannste vielleidcht nochmal die aktuelle version hochladen`?
warum muss es denn ne konsolenanwendung sein und kein mfc (da hätteste wenigstens
ne grafische oberfläche und das Ganze wäre auch einfacher zu handlen)?
-
so, ich hab nochmal nachgeschaut:
er findet das struct schon, aber wenn du hdd_typ anstatt des declariten hdd_type
schreibst, dann hat er einfach keine chance.
den anderen fehler bringt er weil er in ner win32 diverse funktionen nicht
finden kann.
Ich bin davon ausgegangen dass du ne mfc schreibst und hatte dir auch in der
richtung schon die komplettlösung präsentiert.was du jetzt machen kannst:
a) du schreibst ein mfc-prog und kannst mein zeug schon-
mal verwenden.
b) du sagst: NEEEEE, ich will unbedingt ne win32 haben und ziehst mit deinem
Thread AUS dem MFC-Forum IN das DOS und Win32-Konsole-Forum, da man dir
dort bestimmt besser helfen kann.ich persönlich würde es als mfc-anwendung machen, da du da schon mehr funcs zur
auswahl hast und es auch schicker aussieht
.
-
Hallo,
Bummsfallera schrieb:
so, ich hab nochmal nachgeschaut:
er findet das struct schon, aber wenn du hdd_typ anstatt des declariten hdd_type
schreibst, dann hat er einfach keine chance.Ups... Das hab ich ganz schnell mal geändert.
Bummsfallera schrieb:
den anderen fehler bringt er weil er in ner win32 diverse funktionen nicht
finden kann.
Ich bin davon ausgegangen dass du ne mfc schreibst und hatte dir auch in der
richtung schon die komplettlösung präsentiert.Ich bin eigentlich auch davon ausgegangen:
http://www.pctex.de/1.jpg
In der main wird ja auch irgendwas mit MFC auf Erfolg geprüft...Ich hab das ganze nochmal neu gepackt und online gestellt:
http://www.pctex.de/driveletter.zipDie Fehler sind in der Main auskommentiert.
Ich denke eben wegen der Meldung
DriveLetter.cpp(49) : error C2065: 'drive_info' : undeclared identifier
dass er das drive_info nicht finden kann, weil es in der anderen Datei ist...

mfg
trequ
-
ich schaus mir mal an.
warum unbedingt ne konsolenanwendung?
-
Bummsfallera schrieb:
kannste vielleidcht nochmal die aktuelle version hochladen`?
warum muss es denn ne konsolenanwendung sein und kein mfc (da hätteste wenigstens
ne grafische oberfläche und das Ganze wäre auch einfacher zu handlen)?Konsole ist Kundenvorgabe...
Das Program soll eben alle Laufwerke und speziell Wecheldatenträger ermitteln und in eine Datei schreiben.
Das Prog wird beim Autostart eines Kiosk-Systems aufgerufen und prüft, ob der Kartenleser gefunden wurde und ob im Gerätemanager Treiberkonflikte bestehen.
Die Kiosk-Software liest diese Infos beim Start aus.
Wenn der Kartenleser nicht funktioniert, wird ein Neustart eingeleitet.
Geht er dann immer noch nicht, wird der Support alamiert.Warum das jetzt Konsole sein muss, ist mir auch nicht klar.
Aber wenn eine Firma mit ? (vielen) Programmieren sagt, dass es Konsole sein muss, werden die sich hoffentlich dabei was denken...Wo wir gerade beim Thema sind:
Gibt es in C++ die Möglichkeit den Gerätemanager auszulesen?
Ich kenne da die Devcon.exe von Microsoft, aber die schreibt in eine Datei.
Gibt es sowas direkt für C++?
Man kann mit C++ ja direkt auf z.B. die Registry zugreifen. Vieleicht auch auf den Gerätemanager?mfg
trequ
-
ich hab das ganze mal in ein header-file gepackt -> geht!
check it out:http://www.klose2you.de/driveletter.rar
wie immer bescheid sagen plz!
-
du kannst mit c++ Reg-Einträge lesen und auch schreiben.
mit gerätemanager-zugriff weiss ich leider nicht.
-
is das drive immer am gleichen anschluss?
-
Bummsfallera schrieb:
is das drive immer am gleichen anschluss?
soweit ich weiß ja...
-
also auch immer gleicher driveletter......

-
Hallo,
also:
1. Sind es immer 4 Driveletter, welche überwacht werden.
2. Wird auch noch Bluetooth und IrDA überwacht. (Haben ja keine Laufwerksbuchstaben)
3. Läuft da XP, wodurch Laufwerksbuchstaben geändert werden können.
4. Haben wir bereits beobachtet, dass Windows die Laufwerke verschiebt. (so nach 2000 Neustarts)
Warum konnte uns M$ auch nicht sagen, die haben das da jetzt als SQ-123456 ...Ich hab die neue Datei getestet.
Warum das in die .h datei muss -> ???Hab an dem Beispiel nur das Ausgabelayout geändert, aber die Ausgabe ist im Hex-Format:
http://www.pctex.de/3.jpg -> ???im Debug:
http://www.pctex.de/2.jpgDas mit der Registry sollte ich hinkriegen. Hab ich bereits in Perl gemacht, und die Syntax und Befehle sind die selben...
Danke für die Hilfe
mfg
trequ
-
hier, für reg-keys zu schreiben/löschen
bool EnableAutostart(bool bEnable) { HKEY hKey; if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, (bEnable ? KEY_SET_VALUE : KEY_ALL_ACCESS), &hKey) == ERROR_SUCCESS) { if(bEnable == true) { char cPath[200]; GetModuleFileName(AfxGetApp()->m_hInstance, cPath, sizeof(cPath)); if(RegSetValueEx(hKey, "RegistryTest", 0, REG_SZ, (unsigned char*)&cPath, sizeof(cPath)) == ERROR_SUCCESS) { RegCloseKey(hKey); return true; } } else { if(RegDeleteValue(hKey, "RegistryTest") == ERROR_SUCCESS) { RegCloseKey(hKey); return true; } } RegCloseKey(hKey); } return false; }