Problem mit char*
-
Hallo,
Hab eine dll geschrieben welche z.b. diese test funktion hat:
void pFunktion(char* ptr) { char * b; b = (char *) malloc (100); b = "Wenn das hier steht , dann hat es funktioniert"; ptr = b; } usw.Nur wenn ich die funktion aufrufe bekomme ich folgende zeichenkette: ""
also nichts.
Wieso???Gruss
Zero
-
ptr ist in diesem Fall eine lokale Zeichenkette. Du musst einen Zeiger darauf übergeben:
void pFunktion(char** ptr) { char * b; b = (char *) malloc (100); b = "Wenn das hier steht , dann hat es funktioniert"; *ptr = b; } int main() { char *test; pFunktion( &test ); }
-
Und die Initialisierung ist sowieso eine Katastrophe, da der String-Inhalt nur innerhalb deiner Funktion definiert ist (und du hinterher einen unbenutzten 100 Byte Speicherbereich rumfliegen hast, auf den nach "b="...";" niemand mehr zugreifen kann). Wenn du schon mit char* arbeiten willst, mußt du auch die alten str...() Funktionen verwenden, um die hin- und herzuschieben.
(aber wenn du kannst, nimm lieber std::string)
-
danke schon mal,
aber das hilft mir nicht weiter, da ich die dll von FOXPRO aus anspreche.
Foxpro kann aber keine zeiger zeiger (z.B. char**).
Foxpro kann nur einfache zeiger.
wie kann ich es dann lösen???
-
void pFunktion(char* ptr) { char * b = "Wenn das hier steht , dann hat es funktioniert"; strcpy(b,ptr);//eventuell auch umgekehrt, ich hab' lange nicht mit strcpy gearbeitet } //... char test[100];//achte darauf, daß du dir genug Platz anforderst pFunktion(test); cout << test; //...
-
CStoll schrieb:
void pFunktion(char* ptr) { char * b = "Wenn das hier steht , dann hat es funktioniert"; strcpy(b,ptr);//eventuell auch umgekehrt, ich hab' lange nicht mit strcpy gearbeitet } //... char test[100];//achte darauf, daß du dir genug Platz anforderst pFunktion(test); cout << test; //...umgekehrt. afaik kommt bei der c-stdlib immer erst das ziel, dann die quelle.
@op: vielleicht solltest anstatt von strcpy strncpy nehmen, da man bei dieser funktion die maximale puffergröße mit übergeben kann.
// char *strncpy(char *dest, const char *src, size_t n); strncpy(ptr, b, 100);
-
warscheinlich wird beim aufruf der funktion bereits ein zeiger auf einen speicherbereich übergeben. du müsstest dann keinen mehr allozieren sondern den string nur reinschreiben:
void pFunktion (char *ptr) { strcpy(ptr,"Wenn das hier steht, dann hat es funktioniert"); }eine garantie, daß es funktioniert, kann ich dir aber nicht geben, denn ich weiß ja nicht wie und mit welchen parametern die funktion aufgerufen wird. und mit foxpro kenn ich mich auch nicht aus. vielleicht benutzt foxpro ja ein eigenes stringformat...
-
Danke,
Es funktioniert!!!
weis noch von euch jemand wie man eine c++ dll aufruft unter c++??
unter c# und foxpro weis ich es, aber unter c++ nicht.
vielleicht mit "#import" ???Hab folgende dateien :
tmCoala.dll
tmCoala.lib
tmCoala.hes keine MFC dll
Gruss
Sergius
-
#pragma comment(lib, "xxx.lib")
-
aha^^
und wie kann man nun auf die funktionen zugreifen????
-
#include "xxx.h"
(wenn du schreibfaul bist, ist eventuell noch ein "using xxx::func;" oder "using namespace xxx;" dahinter notwendig - hängt von der Bibliothek ab)
-
ok,
hab es nun mit pragma fast gelöst.
#pragma comment(lib,"tmCoala.lib") extern "C" int __stdcall CoalaMakeTransportKey(char** rCertificate, char** rPrivatekey, char* message, int* messagelen, char* name); int Schluessel(char* rCertificate, char* rPrivatekey, char* message, int* messagelen, char* name) { char* test1; char* test2; int rc = CoalaMakeTransportKey(&test1, &test2, &message, &messagelen, &name, &email, &herstellerId, &ProduktVersion, &locality, &country, &jrePath, &jarPath); return rc; }wie komm ich in die funktion rein??(wegen dem zeiger zeiger)
momentane fehlermeldung:
--------------------Konfiguration: c_to_coala - Win32 Debug--------------------
Kompilierung läuft...
c_to_coala.cpp
C:\c_dll_Versuch\c_to_coala\c_to_coala.cpp(30) : error C2664: 'CoalaMakeTransportKey' : Konvertierung des Parameters 3 von 'char ** ' in 'char *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Fehler beim Ausführen von cl.exe.c_to_coala.dll - 1 Fehler, 0 Warnung(en)
-
&messageMessage ist doch schon ein Zeiger, also kann das & weg
Dasselbe bei Name.
Schau dir am besten noch mal alle Übergabetypen an ...
-
klar stimmt ja.
habe nun folgenden code:
*.cpp#pragma comment(lib,"tmCoala.lib") using namespace std; extern "C" int __stdcall CoalaMakeTransportKey(char** rCertificate, char** rPrivatekey, char* message, int* messagelen, char* name); int Schluessel(char* rCertificate, char* rPrivatekey, char* message, int* messagelen, char* name) { int rc = CoalaMakeTransportKey(&rCertificate, &rPrivatekey, message, messagelen, name); string puffer (rCertificate); rCertificate = &puffer; return rc; }Das geht leider nicht, weil man einem char* keine adresse von einem string zuweisen kann.
ich also es so lösen das ich aus der funktionen einen wert in rCerificate bekomme. denn will ich so zwischenspeichern damit es nicht wieder zu einem zeiger zeiger kommt.(da ich es für FOXPRO brauche, aber foxpro kann keine zeiger zeiger).
Also wie kriegt man es hin das aus der funktion (aus der dll, also CoalaMakeTransportkey) in meiner zwischen funktion Schluessel einen normalen zeiger macht, sprich das der zeiger direkt auf die speicherstelle zeigt und nicht erst auf einen anderen zeiger zeigen muss.Gruss
Sergius
-
ZeroCool031086 schrieb:
Das geht leider nicht, weil man einem char* keine adresse von einem string zuweisen kann.
Nein, das kannst du nicht, aber du kannst stattdessen folgendes schreiben:
rCertifikate=puffer.c_str();// !! nur gültig innerhalb der Funktion strcpy(rCertificate,puffer.c_str()); // !! genügend Speicherplantz bereitstellen(btw, gehe ich recht in der Annahme, daß zwischen "string puffer(rCertificate);" und "rCertificate=&puffer;" noch andere Verarbeitungsschritte kommen?)
-
nein es kommen keine schritte dazwischen.
aber danach kommen welche.( da ich es auch für rPrivatekey achen muss)Es geht zwar nun zu compelieren, aber bei foxpro funktioniert es nicht.
wenn ich nun z.B.das:strcpy(name,"Es geht doch");mache, dann geht das. Ich frag mich nur warum? das ist fast das selbe wie:
' strcpy(rCertificate,puffer.c_str()); '
das.
kann man es noch irgendie anders machen?
-
ZeroCool031086 schrieb:
nein es kommen keine schritte dazwischen.
aber danach kommen welche.( da ich es auch für rPrivatekey achen muss)In dem Fall ist die ganze Zuweisung sinnlos (du kopierst den Inhalt des C-Strings in den Puffer und im nächsten Schritt wieder zurück.
Es geht zwar nun zu compelieren, aber bei foxpro funktioniert es nicht.
wenn ich nun z.B.das:strcpy(name,"Es geht doch");mache, dann geht das. Ich frag mich nur warum? das ist fast das selbe wie:
' strcpy(rCertificate,puffer.c_str()); '
das.
kann man es noch irgendie anders machen?Ich vermute spontan ein Problem mit der Größe des reservierten Speicherplatzes. (aber ich hab' auch keine Ahnung von FOXPRO ;))
-
so nun geht es.
man musste nur einen zwischenspeicher an die CoalaMake... übergeben und es dann mit strcpy in rCerificate schreiben.
aber wieso es anders nicht geht kA.Gruss
Zero