argc und argv können gemein sein - wie sichere ich mich davor?
-
Also ich würde auch sagen, dass der Fehler da nicht bei C++ liegt, sondern eher an deinem Aufruf. Kannst du das Problem nachstellen?
-
DWORD dw = ::GetPrivateProfileString(NULL, _T("KEY"),_T(""), szT, _countof(szT), argv[1]);
Der letzte Parameter wird mittels argv[1] übergeben.
Wenn der leer ist, nimmt er sich die Registry.
-
pizzaro schrieb:
Der letzte Parameter wird mittels argv[1] übergeben.
Wenn der leer ist, nimmt er sich die Registry.Dann musst du logischerweise argc bzw. argv vorher selbst prüfen, wenn du das verhindern willst. Wo ist das Problem?
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ist doch ganz einfach du must prüfen ob argc und argv den Anforderungen entsprechen die Dein Programm erwartet um korrekt arbeiten zu könne, wenn diese Anforderungen nicht erfüllt sind dann soll das Programm eben nicht das tun für das es vorgesehen ist, sondern z.B. eine Fehlermeldung ausgeben. Was ist also dein Problem? Wenn du also genau 2 Kommandozeilenparameter erwartest könnte eine Abfrage wie folgt aussehen:
if(argc != 3){ printf("Too less arguments\n"); exit(1); }
Natürlich ist es dann noch angebracht den Inhalt der Kommandozeilenparameter zu checken, ob der in der vorliegenden Form überhaupt ohne Schaden anzurichten verarbeitet werden kann.
-
Warum wurde der Post überhaupt in das WinAPI Forum geschoben, das ist kein primäres Problem von GetPrivateProfileString(....), oder ?
Sondern eher ein konditionales ISO C++ Problem
-
if(argc != 3){
printf("Too less arguments\n");
exit(1);
}Nimm lieber dashier:
if(argc != 3) { cout << "Fehlermeldung:....."; exit(1); }
Ist strukturierter.
Printf ist veraltet und von den compilern nicht gern gesehen.
-
aisad schrieb:
if(argc != 3){
printf("Too less arguments\n");
exit(1);
}Nimm lieber dashier:
if(argc != 3) { cout << "Fehlermeldung:....."; exit(1); }
Ist strukturierter.
Printf ist veraltet und von den compilern nicht gern gesehen.^^unsinn!
-
Printf ist veraltet und von den compilern nicht gern gesehen.
Blödsinn. printf wird nur von den C++-Experten hier im Forum nicht gern gesehen
-
aisad schrieb:
Ist strukturierter.
Printf ist veraltet und von den compilern nicht gern gesehen.Worthülsen... Definiere "strukturiert"!
Bekommt Dein Comliler dann Kopfschmerzen wenn er printf sieht?
-
Martin Richter schrieb:
aisad schrieb:
Ist strukturierter.
Printf ist veraltet und von den compilern nicht gern gesehen.Worthülsen... Definiere "strukturiert"!
Bekommt Dein Comliler dann Kopfschmerzen wenn er printf sieht?'cout' interpretiert den input nach eigenem gutdünken. das finden manche vielleicht toll.
-
pizzaro schrieb:
DWORD dw = ::GetPrivateProfileString(NULL, _T("KEY"),_T(""), szT, _countof(szT), argv[1]);
Der letzte Parameter wird mittels argv[1] übergeben.
Wenn der leer ist, nimmt er sich die Registry.Upps. Das ist ein undokumentierter Seiteneffekt.
Wird NULL als Dateiname angegeben erhäöt man Zugriff auf einen Join der WIN.INI und den Ast HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
-
Kompiliere mal etwas mit printf und dann mit cout und schau dir das auf der Assembler-Ebene im Disassembler an. Glaube eher dein Compiler bekommt bei cout Kopfschmerzen