2011-01-06 12 views
5

Necesito formatear una cadena para que sea una cadena terminada en doble nulo para usar SHFileOperation.Cadena terminada en cero doble

parte interesante es que encontré uno de estos procedimientos de trabajo, pero no tanto:

// 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); 

¿Alguien tiene idea sobre esto?

¿Hay alguna otra forma de anexar una cuerda con terminación doble?

+1

cuál funciona? – zsalzbank

+0

Ninguno de esos * debe * funcionar. Es solo un accidente si uno de ellos lo hace. –

+0

@Greg: ¿no debería funcionar el segundo ejemplo ya que CString tiene el siguiente 'amigo CString operator + (const CString & string, LPCTSTR lpsz);'? (por trabajo me refiero a la operación +, no pasando 'CString' a' SHFileOperation') –

Respuesta

8

La clase CString en sí no tiene ningún problema con una cadena que contiene un carácter nulo. El problema es poner personajes nulos en la cadena en primer lugar. El primer ejemplo funciona porque agrega un solo carácter, no una cadena: acepta el carácter tal como está sin verificar si es nulo. El segundo ejemplo intenta anexar una cadena C típica, que por definición termina en el primer carácter nulo; de hecho está agregando una cadena vacía.

+0

Dicho de otra manera, use comillas simples o dobles ... –

+1

@Mr_and_Mrs_D No solo comillas simples, sino comillas simples alrededor de un * caracter *. Como observa Mooing Duck, puede poner dos caracteres dentro de las comillas simples, pero no agregará dos caracteres a la cadena. –

4

No puede usar CString para este fin. Usted tendrá que utilizar su propio char[] búfer:

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

Aunque se puede hacer esto mediante la única copia de una más bytes NUL después del terminador NUL existente, yo preferiría que copiar dos para que el código fuente refleja con mayor precisión la intención del programador.

+0

Gracias por su sugerencia. Pero ¿cómo es que el Ejemplo 1 está funcionando? – wengseng

+1

@wengseng, de hecho puedes usar CString para este propósito, y el Ejemplo 1 es cómo lo haces. Antes de usar un buffer de tamaño fijo como este, usaba 'std :: vector '. –

+0

std :: string también funcionaría, antes de tener que volver a 'char []'. –

Cuestiones relacionadas