2011-01-06 16 views
5

Ho bisogno di formattare una stringa come doppia stringa con terminazione null per utilizzare SHFileOperation.Doppia stringa con terminazione null

parte interessante è che ho trovato in uno dei seguenti di lavoro, ma non entrambi:

// Example 1 
    CString szDir(_T("D:\\Test")); 
    szDir = szDir + _T('\0') + _T('\0'); 

    // Example 2 
    CString szDir(_T("D:\\Test")); 
    szDir = szDir + _T("\0\0"); 

    //Delete folder 
    SHFILEOPSTRUCT fileop; 
    fileop.hwnd = NULL; // no status display 
    fileop.wFunc = FO_DELETE; // delete operation 
    fileop.pFrom = szDir; // source file name as double null terminated string 
    fileop.pTo = NULL; // no destination needed 
    fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; // do not prompt the user 
    fileop.fAnyOperationsAborted = FALSE; 
    fileop.lpszProgressTitle  = NULL; 
    fileop.hNameMappings   = NULL; 
    int ret = SHFileOperation(&fileop); 

Qualcuno ha idea su questo?

C'è un altro modo per aggiungere una stringa con doppia terminazione?

+1

quale funziona? – zsalzbank

+0

Nessuno di questi * dovrebbe * funzionare. È solo un incidente se uno di loro lo fa. –

+0

@Greg: non dovrebbe funzionare il secondo esempio dal momento che CString ha il seguente 'friend CString operator + (const CString & string, LPCTSTR lpsz);'? (per lavoro intendo l'operazione +, non passando 'CString' a' SHFileOperation') –

risposta

8

La classe CString non presenta problemi con una stringa contenente un carattere null. Il problema si presenta con l'inserimento di caratteri null nella stringa in primo luogo. Il primo esempio funziona perché aggiunge un singolo carattere, non una stringa: accetta il carattere così com'è senza verificare se è nullo. Il secondo esempio tenta di accodare una tipica stringa C, che per definizione termina con il primo carattere null - si sta effettivamente aggiungendo una stringa vuota.

+0

Inserire in modo diverso, utilizzare virgolette singole e doppie ... –

+1

@Mr_and_Mrs_D Non solo virgolette singole, ma virgolette singole attorno a un * carattere singolo *. Come osserva Mooing Duck, puoi inserire due caratteri all'interno delle virgolette singole ma non aggiungerei due caratteri alla stringa. –

4

Non è possibile utilizzare CString per questo scopo. Sarà necessario utilizzare il proprio char[] buffer:

char buf[100]; // or large enough 
strcpy(buf, "string to use"); 
memcpy(buf + strlen(buf), "\0\0", 2); 

Anche se si potrebbe fare questo copiando solo un altro byte NUL dopo il terminatore NUL esistente, preferirei di copiare due in modo che il codice sorgente rifletta più accuratamente il intento del programmatore.

+0

Grazie per il suggerimento. Ma come mai l'Esempio 1 sta funzionando ... – wengseng

+1

@wengseng, puoi effettivamente usare CString per questo scopo, e l'Esempio 1 è come lo fai. Prima di usare un buffer di dimensioni fisse come questo userei 'std :: vector '. –

+0

std :: string funzionerebbe anche, prima di dover tornare a 'char []'. –

Problemi correlati