Двойная строка с нулевым символом в конце - PullRequest
5 голосов
/ 06 января 2011

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

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

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

Ответы [ 2 ]

8 голосов
/ 06 января 2011

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

4 голосов
/ 06 января 2011

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

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

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

...