std :: string также будет работать, прежде чем вернуться к

ужно отформатировать строку, чтобы быть двойной строкой с нулевым символом в конце, чтобы использовать 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);

У кого-нибудь есть идеи по этому поводу?

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

 Greg Hewgill06 янв. 2011 г., 03:33
Ни один из техдолжен работать. Это просто случайность, если один из них делает.
 wengseng06 янв. 2011 г., 04:01
Пример 1 работает ...
 Greg Hewgill06 янв. 2011 г., 04:34
@ Евгений: нет, потому что+ операторCString видит второй операнд как обычный NUL-концевойchar *и не имеет права смотреть на память дальшепервый NUL терминатор.
 zsalzbank06 янв. 2011 г., 03:32
какой работает?
 Eugen Constantin Dinca06 янв. 2011 г., 03:42
@Greg: второй пример не должен работать, так как CString имеет следующееfriend CString operator+( const CString& string, LPCTSTR lpsz );? (под работой я имею в виду операцию +, а не прохождениеCString вSHFileOperation)

Ответы на вопрос(2)

Решение Вопроса

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

 Mark Ransom16 мар. 2015 г., 23:19
@Mr_and_Mrs_D Не просто одинарные кавычки, а одинарные кавычки вокругодин символ, Как отмечает Mooing Duck, вы можете поместить два символа в одинарные кавычки, но вы не добавите два символа в строку.
 Mr_and_Mrs_D16 мар. 2015 г., 23:14
Иными словами, используйте одинарные и двойные кавычки ...

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

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

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

 edA-qa mort-ora-y06 янв. 2011 г., 09:13
std :: string также будет работать, прежде чем вернуться кchar[].
 Mark Ransom06 янв. 2011 г., 07:07
@wengseng, вы действительно можете использовать CString для этой цели, и пример 1, как вы это делаете. Прежде чем использовать буфер фиксированного размера, как это, я бы использовалstd::vector<char>.
 wengseng06 янв. 2011 г., 04:00
Спасибо за ваше предложение. Но как получается, что Пример 1 работает ...

Ваш ответ на вопрос