8

SHFileOperationを使用するには、文字列をnullで終了する二重文字列にフォーマットする必要があります。

興味深い部分は、次のいずれかが機能していることですが、両方ではありません。

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

誰かがこれについて考えを持っていますか?

二重終端文字列を追加する他の方法はありますか?

4

2 に答える 2

9

CString クラス自体は、null 文字を含む文字列に問題はありません。問題は、最初にヌル文字を文字列に入れることです。最初の例は、文字列ではなく単一の文字を追加しているため機能します。null かどうかを確認せずに文字をそのまま受け入れます。2 番目の例では、典型的な C 文字列を追加しようとしています。これは定義により、最初の null 文字で終わります。つまり、空の文字列を効果的に追加しています。

于 2011-01-06T05:50:30.937 に答える
6

CStringこの目的のために使用することはできません。char[]独自のバッファーを使用する必要があります。

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

既存の NUL ターミネータの後にもう 1 つの NUL バイトをコピーするだけでこれを行うことができますが、ソース コードがプログラマの意図をより正確に反映するように、2 つコピーすることをお勧めします。

于 2011-01-06T02:35:47.350 に答える