Variable wird nicht übergeben ?



  • Ich lasse aus einem Button einen Dialog aufrufen mit dem
    man eine Datei auswählt die auf der Festplatte liegt.
    Die Variable die diesen Pfad übernimmt wird auch richtig
    gefüllt.

    TCHAR str[1000]; //char Array für 1000 Zeichen
    CFileDialog dlg(TRUE);
    CString m_pathname1; 
    if (dlg.DoModal() == IDOK)
    {
    m_pathname1 = dlg.GetPathName(); //Gewählten Dateipfad ermitteln
    } 
    
    CString strPath = m_pathname1;
    int pos = strPath.ReverseFind( '\\'); // letztes '\' finden
    int pos2=atoi(strPath.Right(pos));
    strPath=strPath.Mid(pos+1);
    MessageBox(strPath);//nur dateiname
    MessageBox(m_pathname1);//ganzer 
    //m_pathname ist eine globale Variable
    

    Wenn ich jedoch das ganze in einer anderen Funktion
    der gleichen Klasse in einen LPSTR umwandeln will
    ist die neue Variable plötzlich leer.

    LPSTR pfad1a = m_pathname .GetBuffer(m_pathname .GetLength());
    MessageBox(pfad1a,m_pathname);//da kommt nix an
    

    Woran kann das liegen bzw. was mache ich dabei falsch ?



  • hab es glaube ich schon raus!

    CString str = _T("My String");
    int nLen = str.GetLength();
    LPTSTR lpszBuf = str.GetBuffer(nLen);
    // here do something with lpszBuf...........
    str.ReleaseBuffer();
    


  • Du weist der globalen Variablen m_pathname nirgends einen Wert zu.
    Du solltest dir bessere Variablennamen ausdenken. ( du hast eine lokale Variable m_pathname1 und eine globale m_pathname )
    Kurt



  • Ich habe die Variable in 2 Versionen zum testen gehabt.

    Es wird jetzt zwar der Wert als LPTSTR übergeben, aber
    wenn ich meine Daten an Outlook übergeben will sind die
    Felder für die Datei wieder leer und die Email wird für
    Outlook auch nicht erstellt:

    //dateiname1 wird vom benutzer ausgewählt in dem o.g. dialog
    int nLen3 = dateiname1.GetLength();
    LPTSTR lpszBuf3 = dateiname1.GetBuffer(nLen3);
    dateiname1.ReleaseBuffer();
    MessageBox(lpszBuf3); //alles ok bis hier
    

    Jetzt soll im weiteren Verlauf dieser
    Funktion lpszBuf3 als Pfad angegeben werden:

    ...
     mapifiledesc[0].ulReserved   = 0;
       mapifiledesc[0].flFlags      = 0;
       mapifiledesc[0].nPosition    = -1;
       mapifiledesc[0].lpszPathName =lpszBuf; // Die erste Datei
    // so heisst die Datei im Anhang des EMails
       mapifiledesc[0].lpszFileName =lpszBuf3; //kritische Zeile
       mapifiledesc[0].lpFileType   = 0;
    MessageBox(lpszBuf3); //auch hier ist der wert da !!
    

    Nur warum wird, wenn lpszBuf3 richtig gefüllt ist der Wert nicht
    in dieser Zeile übernommen ? Setze ich da "c:\\testdatei.txt" rein
    geht es wiederum 😕



  • Für mich ist dein Beispiel unlogisch

    LPTSTR lpszBuf3 = dateiname1.GetBuffer(nLen3);
    dateiname1.ReleaseBuffer();
    MessageBox(lpszBuf3); //alles ok bis hier
    

    Zuerst holst du dir die Adresse eines String-puffers und gibst die Adresse sofort wieder frei bevor du den pointer überhaupt verwendest.
    Aber das ist wahrscheinlich nicht dein Problem. Mit Outlook habe und will ich auch ich nichts zu tun haben. Sorry kann dir nicht weiterhelfen.
    Kurt



  • Ich wäre schon glücklich wenn ich wissen würde wie ich diesen
    Teil vom Code.

    mapifiledesc[0].lpszFileName ="c:\\test123.txt";
    

    variabel halten kann. Etwa so:

    mapifiledesc[0].lpszFileName = m_meinpfadcstring;
    


  • Ich habe schon so ziemlich alle möglichen Konvertierungen durchprobiert
    und es will einfach nicht klappen 😮
    Habe auch schon +'\0' in der Verzweiflung probiert, weil ich das
    bei FO_COPY mal so verwendet habe als nichts ging. Aber wie gesagt
    bislang leider ohen Ergebnis 😕



  • Aloha,

    wat treibste da eigentlich ?

    Du möchtest gerne ein Attachment an Deine Email rantackern und warum und vor allen Dingen was willst Du in FileName eintragen ???

    Da kommt nur der Name des Attachments rein, was der Empfänger Deiner Email sieht.

    Wenn der name identisch ist, schreib NULL rein.

    Aber um Dein prinzipielles Problem zu lösen.

    Du machst es schon richtig mit Deinem Code :

    mapifeildecs[0].lpszFileName = dateiname1.GetBuffer(dateiname1.GetLength());
    dateiname1.ReleaseBuffer();
    

    Alles schick, nur dateiname1 darf keine lokale Variable sein, die am ende der Funktion gelöscht wird, nachdem Du sie zugewiesen hast.
    Sonst haste natürlich keinen Wert mehr wenn Du Deine MapiFileDesc wieder in einer anderen Funktion aufrufst.

    Grüße

    BOA


Anmelden zum Antworten