2011-01-06 1 views
5

Мне нужно форматировать строку, которая должна быть двойной нулевой конец строки, чтобы использовать SHFileOperation.Двойная строка с нулевым завершением

Интересная часть я нашел один из следующих рабочих, но не оба:

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

ли кто-нибудь имеет представление об этом?

Есть ли другой способ добавить строку с двойным завершением?

+1

который работает? – zsalzbank

+0

Ни один из них не должен работать. Это просто случайность, если один из них. –

+0

@Greg: не должен работать второй пример, так как CString имеет следующий оператор '' друга CString + (const CString & string, LPCTSTR lpsz); '? (по работе я имею в виду операцию +, не передавая 'CString' в' SHFileOperation') –

ответ

8

Сам класс CString не имеет проблемы со строкой, содержащей нулевой символ. Проблема заключается в том, что в первую очередь помещают нулевые символы в строку. Первый пример работает, потому что он добавляет один символ, а не строку - он принимает символ как есть, не проверяя, является ли он нулевым. Второй пример пытается добавить типичную строку C, которая по определению заканчивается на первом нулевом символе - вы фактически добавляете пустую строку.

+0

Положите иначе, используйте одиночные или двойные кавычки ... –

+1

@Mr_and_Mrs_D Не только одинарные кавычки, но одинарные кавычки вокруг * одного символа *. Как отмечает Mooing Duck, вы можете поместить два символа в одинарные кавычки, но вы не добавите два символа в строку. –

4

Вы не можете использовать CString для этой цели. Вам нужно будет использовать свой собственный char[] буфер:

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

Хотя вы могли бы сделать это только скопировать еще один NUL байт после существующего NUL терминатора, я бы предпочел, чтобы скопировать два так, чтобы исходный код более точно отражает намерения программиста.

+0

Спасибо за ваше предложение. Но как получается, что пример 1 работает ... – wengseng

+1

@wengseng, вы действительно можете использовать CString для этой цели, а пример 1 - как вы это делаете. Прежде чем использовать такой буфер с фиксированным размером, я бы использовал 'std :: vector '. –

+0

std :: string также будет работать, прежде чем возвращаться к 'char []'. –