kein AnsiString aus char*



  • 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