Kommandozeile
-
Hallo.
Ich möchte meinen Prog einen Parameter (genauer: Dateiname) mitgeben.
In meinem Haupt-Dialog hab ich zwar eine "Datei öffnen..."-Funktionalität drin, aber wenn man den Dateinamen meinem Prog gleich als Parameter mitgeben kann, muss der User gar nicht erst den "Datei öffnen..."-Dialog nutzen.
Gefunden habe ich, dass ich in InitInstance()
CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo);machen soll, aber was mache ich denn dann? Wie bekomme ich das, was geparst wird, in meinen Dialog rein? (MSDN hab ich gelesen, aber aufgrund schlechter Englischkenntnisse wohl nicht verstanden.
)Danke für Tipps.
-
Dein Objekt cmdInfo hat nun einen ausgefüllten Member m_strFileName.
Wenn der Dateiname angegeben wurde ist m_nShellCommand auf FileOpen gesetzt.Nun könntest Du diesen Wert in eine Variable Deines Dialoges umladen.
-
Martin Richter schrieb:
Nun könntest Du diesen Wert in eine Variable Deines Dialoges umladen.
Soweit war ich auch schon. Die Frage, die mich aber nun seit Stunden beschäftigt ist: wie mache ich das? Wie bekomme ich cmdInfo aus der test.cpp rüber in die testDlg.cpp??
-
Wenn Du Daten eines Objektes woander ebnötigst dann musst Du die Daten eben dorthin schaffen, über kopieren der Daten, Zeigerübergabe oder eben Referenzen.
Du brauchst doch gar nicht das ganze CCmdInfo!
Wenn das eine dialogbasierende Anwendung ist, dann existiert das Objekt um das es geht in Deiner InitInstance. In der Dialogklasse deklarierst Du eine CString Variable. Den Wert aus Deinem cmdInfo kopierst Du dann in diese Variable und dann kannst Du innerhalb des Dialoges darauf zugreifen.
-
Martin Richter schrieb:
Den Wert aus Deinem cmdInfo kopierst Du dann in diese Variable und dann kannst Du innerhalb des Dialoges darauf zugreifen.
Meinst Du nicht, dass ich das schon versucht hätte, bevor ich hier um Rat frage?? Aber es funktioniert einfach nicht. (Oder besser gesagt: so wie ich es versuche, funktioniert es nicht.
)Im Moment hab ich es so (Auszug):
test.cpp
BOOL testApp::InitInstance() { [ . . . ] testDlg* pdlg = new testDlg; CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); pdlg->MachDochEndlichMal(cmdInfo.m_strFileName); [ . . . ] }testDlg.cpp
void testDlg::MachDochEndlichMal( CString _filename ) { if (IsFile(_filename)) { MessageBox(_filename); m_strMyFilename = _filename; } }An sich funktioniert es (Es wird das ausgegeben, was in der Kommandozeile übergeben wurde), aber m_strMyFilename ist in testDlg::OnInitDialog() leer und ich verstehe nicht, wieso, denn wenn ich m_strMyFilename="blah" in OnInitDialog() setze, ist es in einer anderen Methode ja auch bekannt und ich kann auf "blah" zugreifen.
-
Also ist m_strMyFilename eine Membervariable in testDlg?
Dann geht:BOOL testApp::InitInstance() { [ . . . ] testDlg* pdlg = new testDlg; CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); pDlg->m_strMyFileName = cmdInfo.m_strFileName; pdlg->DoModal(); [ . . . ] }
-
Funktioniert auch nicht. Das Projekt wird kompiliert, aber m_strMyFileName ist in OnInitDialog() leer.
-
Ich hab's mal über eine Funktion gemacht, die ich in InitInstance() aufgerufen hab:
CString CMyApp::getCommandLineArgs() { // Kommandozeile ermitteln CString strArgs = ::GetCommandLine(); // Aufrufende Anwendung entfernen int nPos = strArgs.Find(" "); if (nPos<1) return ""; strArgs.Delete(0, nPos); strArgs.TrimLeft(); return strArgs; }
-
So würde ich es auf keinen Fall machen!
Was passiert denn, wenn Deine Anwendung unter "C:\Program Files\Firma\Anwendung" steht???Warum machst Du nicht folgendes in InitInstance:
CCommandLineInfo cmd; ParseCommandLine(cmd); CString fileName = cmd.m_strFileName;
-
vollkommenegal schrieb:
Funktioniert auch nicht. Das Projekt wird kompiliert, aber m_strMyFileName ist in OnInitDialog() leer.
Und was steht in cmdInfo.m_strFileName?
Sofern Du den DoModal nach der Zuweisung gemacht hast müsste die entsprechende Info in OnInitDialog zur Verfügung stehen.
-
Wie genau hast du denn deinen Dialog gestartet? Ich hoffe, per "pdlg->DoModal();". (pdlg ist zumindest die Dialog-Instanz, die den Dateinamen bekommen hat - wenn dein Programm also mit einer anderen Instanz arbeitest, ist das Problem nicht weiter verwunderlich)
-
Hab's hinbekommen: ich hatte einen zweiten Dialog erzeugt und dem die Daten gegeben. Aber ich hab mit dem ersten "gearbeitet", so dass er natürlich nichts von den Daten wissen konnte.
Danke an alle.