Variable an Programm übergeben



  • Hallo zusammen,

    kann mir jemand hier weiter helfen?

    Folgendes Problem.
    Ich möchte einen Eintrag aus einer Variable, die sich in einer DLL befindet, an ein Programm übergeben das meine DLL aufruft! In diesem Programm befindet sich ein Feld welches den Inhalt dieser Variable anzeigen soll.

    In einem anderen Programm habe ich das so gemacht und es hat funktioniert!

    extern "C" __declspec(dllexport) void CdwDLLGet(long id, long* buflen, char* buffer)
    {
        //Benötigtes Makro zur anzeige des Dialogs
    	  AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
    
    	//Variable, die die FileSelektorBox öffnet
    	  CFileDialog dlgFile(TRUE);
    
    	//FileSelektorBox wird geöffnet
    	  if(dlgFile.DoModal() == IDOK)
    	  {
    		  //Deklaration einer Variable
    		    CString pfad;
    		  //Übergabe an die Variable
    			pfad = dlgFile.GetPathName();
    
    		  //TestMSGBox
    			AfxMessageBox(pfad);
    
    		  //Übergabe des Pfades ans Programm
    			long maxbuf;
                long l = 13;
    	        memcpy(&maxbuf,buflen, sizeof(long)); // copy max buflen from COBOL/Java-Programm
    	        memcpy(buflen,&l,sizeof(long) ); // copy length of our data into buflen
    	        memcpy(buffer, "00011", 5);
    	     	memcpy(buffer + 5, pfad , 8 );
          }
    
    }
    

    Die Variable "pfad" ist die Variabel die den Wert übergeben soll!

    Fehlermeldung in Zeile

    memcpy(buffer + 5, pfad , 8 );
    

    Kann den Bezeichner (pfad) nicht finden!!!

    Weiss jemand was ich falsch mach! Setze ich vor die Variabel dlgFile.pfad, dann kommt die Fehlermeldung pfad ist keine Variabel von CFileDialog (oder so ähnlich)!!

    Danke schon mal und sorry falls es zu umständlich erklärt ist!!!! 😃

    Gruß Elle



  • Eleonora schrieb:

    Kann den Bezeichner (pfad) nicht finden!!!

    Ich denke, du missverstehst da deinen Compiler. memcpy erwartet als zweiten Parameter ein 'const void*'. Dein Compiler kann einen CString aber nicht implizit dahin umwandeln. Helfen kann operator LPCTSTR von CString, noch besser, du übergibst einfach einen Zeiger auf das erste Element

    memcpy(&buffer[5], &pfad[0] , 8);
    

    Noch zwei Tipps:

    Nutze den copy-ctor

    CString pfad;
              //Übergabe an die Variable
                pfad = dlgFile.GetPathName();
    

    wird dann zu

    //Übergabe an die Variable
                CString pfad = dlgFile.GetPathName();
    

    Und falls ein copy-ctor explicit ist, dann

    //Übergabe an die Variable
                CString pfad(dlgFile.GetPathName());
    

    Sowas ist oft effektiver.

    memcpy(&maxbuf,buflen, sizeof(long)); // copy max buflen from COBOL/Java-Programm
                memcpy(buflen,&l,sizeof(long) ); // copy length of our data into buflen
    

    ist eigentlich Unsinn. Schreib einfach

    maxbuf = *buflen;
    *buflen = l;
    


  • Hallo,

    erst mal danke für die Tipps, werde sie berücksichtigen!!! 🙂

    Allerdings funktioniert es immer noch nicht! 😞 Jetzt bringt er mir die Fehlermeldung "& erwartet L-Wert"!? 😕 In der Hilfe steht leider auch nichts brauchbares drin!!!

    Gruß Elle



  • Hallo noch mal,

    warum auch immer, er übergibt mir einen Teil des Wertes in das Programm!

    Nachdem ich die Vorschläge von groovemaster umgesetzt habe ließ es sich kompilieren, allerdings hab ich keine Ahnung warum, vielleicht kann mir das einer erklären! 😕

    1. Änderung

    //Übergabe an die Variable
                CString pfad = dlgFile.GetPathName();
    

    2. Änderung

    maxbuf = *buflen;
    *buflen = l;
    

    Die Fehlermeldung mit dem L-Wert bringt er nun auch nicht mehr, da ich das ganze so gelassen hab wie ich es anfangs hatte.

    //Übergabe des Pfades ans Programm
    			long maxbuf;
                long l = 13;
    
    			maxbuf = *buflen; 
                *buflen = l; 
    	        memcpy(buffer, "00011", 5);
    	     	 memcpy(buffer + 5 , pfad , 8 );
    

    Ich habe in dem anderen Programm eine MessageBox eingebaut um zu sehen ob der Wert übergeben wird. Er wird zwar übergeben, allerdings nur die ersten 8 Zeichen. Ich vermute das liegt an der 8 im memcpy!? Erhöhe ich die 8 auf z.B. 20, werden trotzdem nur die ersten 8 Zeichen ausgegeben?!

    Was mach ich falsch? 😞

    Gruß



  • Eleonora schrieb:

    Jetzt bringt er mir die Fehlermeldung "& erwartet L-Wert"!?

    Sry, mein Fehler. Bzw des operator [] von CString, der eine Kopie des Zeichens zurückgibt, statt sinnvollerweise einer const Referenz. Dann bleibt dort halt noch operator LPCTSTR.

    memcpy(&buffer[5], static_cast<LPCTSTR>(pfad), 8);
    

    Eleonora schrieb:

    Ich habe in dem anderen Programm eine MessageBox eingebaut um zu sehen ob der Wert übergeben wird. Er wird zwar übergeben, allerdings nur die ersten 8 Zeichen. Ich vermute das liegt an der 8 im memcpy!? Erhöhe ich die 8 auf z.B. 20, werden trotzdem nur die ersten 8 Zeichen ausgegeben?!

    Was steht denn in pfad?
    Du solltest zudem bedenken, dass C-Strings nullterminiert sind. Dh es werden Zeichen bis zum ersten Nullzeichen ('\0') ausgegeben.



  • Hallo,

    ich weiss jetzt woran es lag!

    Ich habe die Variable buflen nicht erhöht gehabt und drum hat er mir mir nur 13 Zeichen übergeben!!!! Manchmal sieht man doch tatsächlich vor lauter Wald die Bäume nicht mehr!!!! 😉

    Trotzdem danke für die Hilfe!!!!! 👍

    Gruß Elle


Anmelden zum Antworten