Kommandozeile



  • 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??


  • Mod

    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.


  • Mod

    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;
    

  • Mod

    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.


Anmelden zum Antworten