kein AnsiString aus char*



  • Hallo,

    Ich versuche ein char-Array in einen AnsiString umzuwandeln. Im AnsiString stehen aber nur Hieroglyphen.

    char text[64];
    Zeiger_auf_winAPI_Fkt(text); //schreibt in text etwas rein. Das klappt auch: der Debugger zeigt mir nach dem Fkt.aufruf den gewünschten nullterm. String in "text" hier an
    AnsiString *s = new AnsiString(text); //ab hier sind im Char Array und im erstellten AnsiString nur noch Hieroglyphen
    

    Kann mir keinen Reim darauf machen. Woran liegt das? Wenn ich einen neuen AnsiString erstelle, müsste doch zumindest das Char Array so bleiben wie es ist.
    Danke.



  • String str = text;
    

    Fertig.



  • Danke, das Problem bleibt aber das selbe.

    char text[64];
    Zeiger_auf_winAPI_Fkt(text); 
    String s = text; //Hieroglyphen
    


  • char text[64];
    Zeiger_auf_winAPI_Fkt(text);
    AnsiString s = AnsiString(text);



  • Hab ich leider alles schon versucht. Hab auch schon versucht die char* Variable global zu definieren, aber dann kommt eine Zugriffsverletzung 😕
    Kann das was damit zu tun haben, dss ich mal bei Projekteigenschaften->Compiler->Vorcompilierte Header piuffern auf Vorcompilierte Header nicht verwenden geschaltet habe?

    Ich werd nochmal ein neues Projekt anfangen und erneut versuchen. Trotzdem Vielen Dank.



  • inquisitor schrieb:

    Ich versuche ein char-Array in einen AnsiString umzuwandeln. Im AnsiString stehen aber nur Hyroglyphen.

    Es heißt Hieroglyphen!
    Zeig doch einfach mal mehr Code! Das von dir geschilderte Vorgehen ist korrekt, also wird es wohl am Kontext liegen.

    Moritz



  • Bevor du neu anfängst, zeig mal die exakten Aufrufe der API Funktion. Für mich klingt es danach, dass dir die Funktion nichts schlaues zurückliefert. Schonmal mit memset den Puffer auf 0 initialisiert? Wenn du das machst, werdendie HIeroglyphen weg sein allerdings wird dann einfach ein Leerstring reingeladen. Das wiederum deutet darauf hin, dass dir die API Funktion (welche isses denn nu) dein Char-buffer nicht richtig füllt.



  • Ich möchte vom CAPI-Treiber den Hersteller auslesen. Dazu hole ich mir mit GetProcAddr den Zeiger auf die entsprechende CAPI Fkt.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       char hersteller[64];
       memset(hersteller,'\0', 64);
       typedef DWORD CF_CAPI_INSTALLED(void); 
    typedef void CF_GET_MANUFACTURER(char *hersteller);
    	CF_CAPI_INSTALLED * cf_CAPI_INSTALLED;//Zgr. auf Fkt.
    	CF_GET_MANUFACTURER * cf_GET_MANUFACTURER;
    	HINSTANCE capiHandle;
       capiHandle = LoadLibrary("capi2032.dll"); //WinApi Fkt. zum DLL-Laden
       cf_CAPI_INSTALLED = (CF_CAPI_INSTALLED*)GetProcAddress(capiHandle, "CAPI_INSTALLED"); //Zeiger auf entspr. Fkt holen
       cf_GET_MANUFACTURER = (CF_GET_MANUFACTURER*)GetProcAddress(capiHandle, "CAPI_GET_MANUFACTURER");
       cf_CAPI_INSTALLED(); //Ausführen um CAPI zu init.
       cf_GET_MANUFACTURER(hersteller); //Hersteller holen. Das klappt!! Nach Fkt.aufruf steht "AVM-GMBH\0" in "hersteller".
       Memo1->Lines->Add(hersteller); //hier krachts (char[] global -> Zugriffsverl., char[] lokal->Hieroglyphen)
    }
    

    Steh ich nur auf dem Schlauch?



  • Und die Funktionszeiger sind gültig die du da erhälst? Hab nämlich nirgends ne Überprüfung gesehen....

    -junix



  • geben die funktionen nen widestring zurück (wchar_t) ?



  • Also ich caste das chararray noch mal nach Ansistring:

    z.B:
    Memo1->Lines->Add(AnsiString(hersteller));



  • @rautaxe
    Hab ich auch schon versucht.

    @Sunday
    Nein, die Fkt. die den Hersteller ausliest, ist nach der CAPI-Doku:

    VOID APIENTRY CAPI_GET_MANUFACTURER (char * SzBuffer);
    

    @junix
    Ja, die Zeiger sind gültig. Zum Posten hab ich die Überprüfung weggelassen. Ich überprüfe sie mit

    if(cf_GET_MANUFACTURER == NULL){
       //Fehler
    }
    

    Außerdem würde doch sonst im Char Array nach dem Fkt.aufruf nicht "AVM-GMBH\0" stehen, oder? 😞

    Ich denke langsam, dass es ein Problem mit dem C++ Builder ist...



  • Eine Frage: Sollte der Funktionszeiger

    typedef DWORD CF_CAPI_INSTALLED(void);
    

    nicht so aussehen?[cpp]typedef DWORD *(CF_CAPI_INSTALLED)(void);[/cpp]



  • Stimmt natürlich... Gaube allerdings nicht, dass es ein Problem des BCB ist... Was steht in der Doku zu der Funktion? Was genau macht die mit dem Zeiger?



  • Aus der CAPI-Doku:

    Description
    With this operation the application obtains the manufacturer identification of
    COMMON-ISDN-API (DLL). SzBuffer is a pointer to a buffer of 64 bytes.
    COMMON-ISDN-API copies the identification string, coded as a zero-terminated
    ASCII string, to this buffer.

    Function call:

    VOID APIENTRY CAPI_GET_MANUFACTURER (char * SzBuffer);
    

    Parameter Comment
    SzBuffer Pointer to a buffer of 64 bytes

    Schon seltsam, oder? Konnte irgendjemand das Problem nachstellen?



  • da ich leider nicht mit CAPI beschäftigt bin, kann ich da wenig tun um das nachzustellen... Also wenn du die Funktion verlässt, stehen da hieroglyphen drin?

    -junix



  • Ja, sobald ich versuche das char-Array (in dem unmitelbar nach dem Funktionsaufruf der richtige String steht) z.B. in ein Memo zu schreiben. Danach stehen nur noch Hieroglyphen im char-Array bzw. das Programm stürzt mit einer Zugriffsverletzung ab;



  • Hallo,

    Probier's mal so :

    typedef DWORD CF_CAPI_INSTALLED(void);
    typedef void CF_GET_MANUFACTURER(char *hersteller);
    //
    char* hersteller = new char[64];
    memset(hersteller, '\0', 64);
    CF_CAPI_INSTALLED   * cf_CAPI_INSTALLED;//Zgr. auf Fkt.
    CF_GET_MANUFACTURER * cf_GET_MANUFACTURER;
    HINSTANCE capiHandle;
    // WinApi Fkt. zum DLL-Laden
    capiHandle = LoadLibrary("capi2032.dll");
    if (capiHandle)
    {
      // Zeiger auf entspr. Fkt holen
      cf_CAPI_INSTALLED   = (CF_CAPI_INSTALLED*)  GetProcAddress(capiHandle, "CAPI_INSTALLED");
      cf_GET_MANUFACTURER = (CF_GET_MANUFACTURER*)GetProcAddress(capiHandle, "CAPI_GET_MANUFACTURER");
      // Ausführen um CAPI zu init.
      if (cf_CAPI_INSTALLED)
        cf_CAPI_INSTALLED();
      // Hersteller holen.
      if (cf_GET_MANUFACTURER)
        cf_GET_MANUFACTURER(hersteller);
    }  //
    AnsiString HerstellerStr = hersteller;
    Memo1->Lines->Add(HerstellerStr);
    delete hersteller;
    

    Bis dann denn,
    🙂
    Nash



  • Wenn schon new [] dann bitte auch delete []
    Danke.



  • Hallo,

    Tja nun... hab' ich übersehen... 🙂
    Ich benutze dieses "new char[...]"-Kramzeugs nicht so häufig, da vergißt man sowas schonmal.

    Bis dann denn,
    🙂
    Nash



  • Recht vielen Dank, Nash !!!

    Das wars 👍 👍


Anmelden zum Antworten