C-Interface char oder Pointer als Übergabeparameter
-
Hi zusammen,
schreibe gerade einen DLL in welcher ich C-Interface-Funktionen extern bereitstelle.
Jetzt möchte ich quasi als Übergabeparameter einen String haben, was aber ja NICHT einem C-Interface entspricht.
Was kann ich da alternativ nehmen, damit der User einen String übergeben kann.Nimmt man hier einen Pointer oder ein char?
Danke
-
Bench_XProjects schrieb:
Nimmt man hier einen Pointer oder ein char?
Beides!
Einen Pointer auf char (char*).
-
HI,
ok, hat du vielleicht ein kleines Codebeispiel!?:-)
Danke
-
Na ja, ein normaler char*-Parameter halt:
void MeineFunktion(char *pMeinStringParameter);
Oder wofür genau willst du ein Beispiel?
-
Hi,
erst mal danke für die Antwort!
Mein Fall:
AnsiString neinString = "Das will ich übergeben!"; //Wandle ansiString in char-Pointer um //?? charpointer keineAhnung = kovertvonAnsiString(neinString );//?? //?? //C-Funktion aufrufen //?? bool meineAntwort = C_FUnktion(charpointer); //?? Label->Caption = kovertzuAnsiString(charpointer);
Habe den Ablauf mal in Worten aufgeschrieben!
Habe das mit den Pointern noch nicht so raus!
Wäre super wenn ihr mir ein COdebeispiel zu folgendem Ablauf geben könntet, damit ich mir das anschauen und kapieren kann!
Danke
-
Hallo,
mal etwas vereinfacht (innerhalb einer Form):
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString uebergabe = "Übergabestring"; bool antwort = C_Function(uebergabe.c_str()); if (antwort) ShowMessage("Das hat geklappt"); } //--------------------------------------------------------------------------- bool TForm1::C_Function(char *value) { if (AnsiString(value) == "Übergabestring") return true; else return false; }
LG, Micha
-
HI,
schon mal danke für die Antwort.
Noch eine Frage:
Wie kann ich jetzt noch einen Andresspointer übergeben?
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString uebergabe = "Übergabestring"; AnsiString rueckgabe; bool antwort = C_Function(uebergabe.c_str(),rueckgabe.c_str()); if (antwort) ShowMessage("Das hat geklappt"); Label->Caption = rueckgabe; } //--------------------------------------------------------------------------- bool TForm1::C_Function(char *value, char &rueckgabe)//Adresspointer????? { if (AnsiString(value) == "Übergabestring") { rueckgabe = "Hier hast du den Antwortstring"; //KOnvertierung zu char?? return true; } else return false; }
Danke
-
Hallo,
wieso nicht einfach:
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString uebergabe = "Übergabestring"; Label->Caption = AnsiString(C_Function(uebergabe.c_str())); } //--------------------------------------------------------------------------- char *TForm1::C_Function(char *value) { char *rueckgabe = ""; if (AnsiString(value) == "Übergabestring") { rueckgabe = "Hier hast du den Antwortstring"; return rueckgabe; } return rueckgabe; }
LG, Micha
-
HI,
die Lösung wäre super, aber die vorgegebne Struktur erlaubt dies leider nicht!
Muss mich an einen vorgegebenen Standard halten und da muss ich es leider über einen Pointer machen!Wie mach ich das?
Danke
-
Vielleicht eher so.
const char* TForm1::C_Function(char *value) { if (AnsiString(value) == "Übergabestring") return "Hier hast du den Antwortstring"; return ""; }
PS. Du machst das doch hier mit einem Pointer. Wo ist das Problem?
-
HI,
ok, so kann ich es machen!
Jetzt kommt bloß der Fehler:
Konvertierung von AnsiString nach char* nicht möglich beim return-Value!extern "C" __declspec (dllexport) char* SM_writeParam(char *geraet, char *befehl, char *wert) { AnsiString uebefehl = (AnsiString)befehl; AnsiString ueantwort; AnsiString uewert = (AnsiString)wert; //Geräteunterscheidung zur Demo if((AnsiString)geraet == "G1") COMU->WritePositionCSV(uebefehl, ueantwort, 0); else if((AnsiString)geraet == "G2") COMU->WritePosition(uebefehl,ueantwort,uewert); return ueantwort; }
Wie kann ich den String wieder in ein Char wandeln?
Danke
-
In deinem Fall mußt du wohl dynamisch ein char Array erstellen und dann deinen AnsiString da rein kopieren. Allerdings mußt du auch dafür sorgen, dass dieses Array wieder gelöscht wird weil das ja nicht automatisch passiert.
extern "C" __declspec (dllexport) char* SM_writeParam(char *geraet, char *befehl, char *wert) { AnsiString uebefehl = befehl; AnsiString ueantwort; AnsiString uewert = wert; //Geräteunterscheidung zur Demo if((AnsiString)geraet == "G1") COMU->WritePositionCSV(uebefehl, ueantwort, 0); else if((AnsiString)geraet == "G2") COMU->WritePosition(uebefehl,ueantwort,uewert); char* ret = new char[ueantwort.Lenght() + 1]; strcpy(ret, ueantwort.c_str()); return ret; }