Problem mit Programm und DLL
-
Liegt es evtl. daran, das du mit
return slRetVal;
einen AnsiString zurückgibst, obwohl der Rückgabewert in char* geändert wurde?
-
SilentSurfer schrieb:
Liegt es evtl. daran, das du mit
return slRetVal;
einen AnsiString zurückgibst, obwohl der Rückgabewert in char* geändert wurde?
Nein, habe den Rückgabewert wieder in AnsiString geändert und es geht auch nicht.
-
Hast du schon mit
return slRetVal.c_str();
versucht?
-
bIce schrieb:
Hast du schon mit
return slRetVal.c_str();
versucht?
Ja, dann habe ich den Fehler auch noch. Aber nicht mehr bei jedem mal. Seltsam
-
anfänger_sos schrieb:
bIce schrieb:
Hast du schon mit
return slRetVal.c_str();
versucht?
Ja, dann habe ich den Fehler auch noch. Aber nicht mehr bei jedem mal. Seltsam
Nicht so seltsam. Die Problematik von c_str() wurde meines Wissens hier schon
einige Male erörtert und man findet dazu auch einige Anmerkungen in der Hilfe.
Die Kernaussage ist, daß genau die obige Verwendung zu Problemen führen kann.
Deklariere Dir eine Variable, kopiere den Wert auf den c_str() verweist dort
hinein (vorheriges Speicher allokieren nicht vergessen) und gib diese Variable
zurück.Gruß,
Alexander
-
hmm,
Deklariere Dir eine Variable, kopiere den Wert auf den c_str() verweist dort
hinein (vorheriges Speicher allokieren nicht vergessen) und gib diese Variable
zurück.Ich verstehe nicht wie das gemeint ist.
-
So mache ich das für gewöhnlich. Ob das der beste und einfachste Weg ist,
weiß ich nicht, aber bei mir funktioniert er.char* cResult = new char[slRetVal.Length()+1]; // Speicher allokieren strcpy(cResult, slRetVal.c_str()); // String kopieren
Dieser Code steht übrigens auch in der BCB-Hilfe.
Such mal nach AnsiString c_str() (Beispiel).
Da steht auch ein Fall (der Deinem Fall ähnelt), bei dem es Probleme
geben könnte.Gruß,
Alexander
-
Danke.
Aber der Fehler kommt leider immer noch.
-
anfänger_sos schrieb:
Aber der Fehler kommt leider immer noch.
Jedesmal oder nur ab und zu?
Und welche Fehlermeldung?Gruß,
Alexander
-
So bald ich das erste mal Konvertiert habe kommt es fast jedes mal zu einer fehlermeldung.
Ungültige Zeigeroperation.
Der Text wird aber dennoch ordentlich Konvertiert. Also funktionieren tut alles, nur dieser fehler ist nicht schön.
-
Und bist Du dir sicher, dass der Fehler von der Dll ausgelöst wird?
-
Denke schon den wenn ich das "return slRetVal" rausnehme kommt kein fehler.
-
Versuch mal am besten eine Testanwendung zu erstellen, die sich nur auf die aufzurufende und aufrufende Funktionen beschränken (oder vielleicht beides in eine Funktion packen) und führe sie step-by-step mit dem Debugger durch. Kannst Du den Quelltext der Funktion posten. (Ist vielleicht die vom deinem ersten Posting?)
-
ich schreibe hier einfach noch mal den Code so wie er jetzt ist!
Die DLL cpp//--------------------------------------------------------------------------- #include <vcl.h> #define __BUILDING_THE_DLL #include "Konverter.h" #include "Romain.h" #include <math.h> #include <windows.h> #pragma hdrstop //--------------------------------------------------------------------------- __EXPORT_TYPE AnsiString Base64Encod(AnsiString slToEnc) { //Base64-Tabelle besteht aus 64 druckbaren Zeichen: const char Base64Table[64]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char * buftoenc = slToEnc.c_str(); int bufsize = slToEnc.Length() + 1; char * encbuf = new char[slToEnc.Length() * 5]; encbuf[0] = '\0'; int ilStrLen = -1; int i=0; int b64byte[5]; unsigned char *buftemp; AnsiString slRetVal = EmptyStr; //Speicher für den temporären String reservieren: buftemp=(unsigned char *)malloc(bufsize+2); strcpy(buftemp,buftoenc); if (fmod(bufsize,3)==1) { buftemp[bufsize]='\0'; buftemp[bufsize+1]='\0'; } if (fmod(bufsize,3)==2)buftemp[bufsize]='\0'; while (i<bufsize) { b64byte[0]=buftemp[i]>>2; b64byte[1]=((buftemp[i]&3)<<4)|(buftemp[i+1]>>4); b64byte[2]=((buftemp[i+1]&0x0F)<<2)|(buftemp[i+2]>>6); b64byte[3]=buftemp[i+2]&0x3F; encbuf[i+(i/3)]=Base64Table[b64byte[0]]; encbuf[i+(i/3)+1]=Base64Table[b64byte[1]]; encbuf[i+(i/3)+2]=Base64Table[b64byte[2]]; encbuf[i+(i/3)+3]=Base64Table[b64byte[3]]; i+=3; } free(buftemp); if (fmod(bufsize,3)==0) ilStrLen = bufsize*8/6; else if (fmod(bufsize,3)==1) ilStrLen = ((bufsize+2)*8/6)-2; else if (fmod(bufsize,3)==2) ilStrLen = ((bufsize+1)*8/6)-1; else ilStrLen = -1; if(ilStrLen > 0) slRetVal = AnsiString(encbuf).SubString(1, ilStrLen); if(encbuf != NULL) { delete encbuf; encbuf = NULL; } char* cResult = new char[slRetVal.Length()+1]; strcpy(cResult, slRetVal.c_str()); return cResult; } //---------------------------------------------------------------------------
Die Programm cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Romain.h" #include "Konverter.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMainForm *MainForm; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButton5Click(TObject *Sender) { Version(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButton1Click(TObject *Sender) { RichEdit1->Text = Base64Encod(RichEdit1->Text); } //---------------------------------------------------------------------------
-
Paßt das denn alles überhaupt von den Typen her?
Die Methode Base64Encod gibt doch einen AnsiString
zurück, mit Return gibst Du aber einen char* zurück__EXPORT_TYPE AnsiString Base64Encod(AnsiString slToEnc) { // ... return cResult; }
Und was bedeutet __EXPORT_TYPE?
Ich würde mich nicht als Experte auf dem Gebiet der DLLs bezeichnen,
aber bei meinen bisherigen Versuchen sah das doch irgendwie ganz anders
aus...Gruß,
Alexander
-
Alexander Kempf schrieb:
Paßt das denn alles überhaupt von den Typen her?
Die Methode Base64Encod gibt doch einen AnsiString
zurück, mit Return gibst Du aber einen char* zurück__EXPORT_TYPE AnsiString Base64Encod(AnsiString slToEnc) { // ... return cResult; }
Arrrr. Verdammt wie blöde!
Habe es jetzt mal so geändert und es funktioniert tatsächlich.__EXPORT_TYPE char * Base64Encod(AnsiString slToEnc) { // ... return cResult; }
Jetzt gibt es noch etwas. kann man es auch so machen das ich das Programm starten kann auch wenn ich die Dll nicht habe?
Bisher ist es so das wenn ich die DLL weg nehme das Programm sagt das die DLL nicht gefunden wurde und es sich dann Beendet. Aber es muss doch auch gehen das es ohne DLL startet und dafür nur die funktion nicht geht! Gibt es da auch noch eine möglichkeit.Was für ein krampf meine erste DLL richtig zum funktionieren zu bringen!
-
anfänger_sos schrieb:
kann man es auch so machen das ich das Programm starten kann auch wenn ich die Dll nicht habe? (...)
Aber es muss doch auch gehen das es ohne DLL startet und dafür nur die funktion nicht geht! Gibt es da auch noch eine möglichkeit.Das einzige, was mir dazu einfällt, wäre die DLL dynamisch zu laden. Das ist
aber - um Deine Ausdrucksweise zu übernehmen- noch mehr Krampf.
Mehr dazu findest Du garantiert in der FAQ, in der BCB-Hilfe und in einigen
Threads, z.B. hier.Gruß,
Alexander