Problem mit char*



  • 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.h

    es 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)



  • &message
    

    Message 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


Anmelden zum Antworten