SQLConfigDataSource - Problem mit sprintf



  • ... ich weiß es ist immer wieder ein leidiges thema... aber irgendwie spinnt meine sprintf - funktion...

    ich habe folgendes aus dem forum ausprobiert..

    void CreateParams(char* result,const char* DSN,const char* description, const char* FileType, const char* DBQ) 
    { 
       sprintf(result,"Microsoft Access Driver (*.mdb)\0DSN=%s\0Description=%s\0FileType=%s\0DBQ=%s\0",DSN,description,FileType,DBQ); 
    }
    
    ...Aufruf
    
    CreateParams(params,"Tool","Tool","Access","E:\\MEINE_PROGS\\db.mdb");
    
    CString temp;
    temp=(CString)params;
    
    MessageBox("Test",temp,MB_OK); // hier kommt nur "Microsoft Access Driver (*.mdb)" zurück warum???
    
    SQLConfigDataSource(NULL,ODBC_ADD_DSN,params,params); // funzt dann auch nicht
    

    irgendwie liegt es an dem \0, aber ich brauche das um den dienst zu installieren. wenn man \n zum Bsp nimmt dann gibt er den completten string zurück, aber wie gesagt für den ODBC Dienst braucht man doch \0.
    Warum funzt das bei mir nicht - ich werd irre... bei allen läufts offenbar.



  • das problem leigt hier:

    temp=(CString)params;
    

    das macht nähmlich ein strcpy und das kopiert nur bis zum ersten \0



  • also ich habe mal das params in nen file ausgegeben... ich bekomme nur Microsoft Access Driver (*.mdb) zurück... es wird irgendwie immer nach dem \0 abgebrochen. was natürlich auch das Nichtzustandekommen des Dienstes erklärt.
    -> ich habe das hier im Forum mal so gesehen... nur es läuft nicht 😞



  • zeig mal den code wie du ins file schreibst.

    Ansonsten hab ich hier ein Beispiel einer klasse gepostet wie du so was leicht und komfortabe´l machen machen kannst: http://www.c-plusplus.net/forum/viewtopic.php?t=76990



  • gehört zwar nicht in die MFC - aber mal zum schnellen schauen, find ich ganz cool ohne großen aufwand zu treiben...

    ofstream out;
    out.open("out.txt");
    out<<params;// jetzt sag nicht hier wird auch nur bis \0 geschrieben
    

    ansonsten habe ich mir deine klasse angeschaut bevor ich sie ausprobiere möchte ich sie verstehen...
    also das eigentliche zusammenfügen passiert ja hier

    for(int n=0;n<GetSize();n++) 
    { 
      strcpy(ptr,GetAt(n));      // kopieren des CStrings nach ptr
      ptr+=GetAt(n).GetLength(); // wird hier eine Position gesetzt???
      *ptr=0;++ptr;              // wird hier an die akt. position 0 geschrieben?? und position um 1 hochgezählt???
    } 
    
    *ptr = 0; 
    return m_buffer;
    

    vielleicht kannst du ja mal kurz was dazu schreiben... vielen dank erst mal...



  • ofstream out;
    out.open("out.txt");
    out<<params;// jetzt sag nicht hier wird auch nur bis \0 geschrieben

    doch sag ich *g* 🤡

    hmm.. der code ist doch kommentiert 😛

    char *ptr = m_buffer;  // speicher den buffer-anfang in ne lokal variable
    for(int n=0;n<GetSize();n++) // mach das für jeder CStringArray-Element
    { 
        strcpy(ptr,GetAt(n)); // kopiere das element in den buffer (an possition ptr)
        ptr+=GetAt(n).GetLength(); // incrementiere den write-pointer um die string länge
        *ptr=0;++ptr; // schreibe ne 0 ans ende des strings und incrementiere 
    } 
    *ptr=0;
    


  • danke es funzt jetzt sehr gut - die blöde 0 hat mich noch in den wahnsinn getrieben, obwohl ich immernoch nicht glaube, dass das mit dem sprintf() funzen sollte.
    kommt sowas mit mehreren \0 in einem string eigentlich öfters vor???



  • Hallo,

    das kommt in der Tat öfter vor, so daß es gut ist, wenn du jetzt diesen Fall behandeln kannst. Ein paar Beispiele:

    GetLogicalDriveStrings gibt im Argument lpBuffer eine solche Liste zurück:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getlogicaldrivestrings.asp

    SHFileOperation:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shfileoperation.asp

    kann in den Argumenten pFrom und pTo der SHFILEOPSTRUCT:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/shfileopstruct.asp

    eine so abgetrennte Liste von Dateien übergeben werden usw...es ist also durchaus angebracht, sich mit der "Technik", die nötig ist, solche Listen zu trennen bzw. zu erzeugen, zu befassen 😉

    MfG


Anmelden zum Antworten