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