class CString * から const char * に変換するには?


KEN  2005-07-05 19:18:42  No: 58176

初めまして。
VC++を使い始めたばかりなので、馬鹿馬鹿しい質問かもしれませんが、
どうか教えてください。

CString型変数に保持された文字列を、SHFileOperationA
関数の対象ファイルとして指定したいのですが、
>'class CString *' から 'const char *' に変換することはできません。
というエラーメッセージが出てしまいます。
このエラーを解消するためにはどうすればいいのでしょうか?
ソースは以下のとおりです。

  CString  d_ietemp = m_ietemp + "\\*" + "\0\0";

  SHFILEOPSTRUCT sIEtemp;        
  sIEtemp.wFunc = 0x0003;        
  sIEtemp.pFrom = &d_ietemp;    // 対象ファイル
  sIEtemp.pTo = "\0";
  sIEtemp.fFlags = 14;        

// 指定されたフォルダ以下の全てのファイルを削除
  // IE一時ファイルの処理
  if (m_ietemp_chk == FALSE) {
    int SHFileOperationA(
        LPSHFILEOPSTRUCT &sIEtemp   // SHFILEOPSTRUCT構造体
    );
  }

宜しくお願いします。


REE  2005-07-05 19:22:42  No: 58177

>    CString    d_ietemp = m_ietemp + "\\*" + "\0\0";
CStringに、"\0\0"を足しても、末尾に'\0'が二つ付くとは限りません。

>    sIEtemp.pFrom = &d_ietemp;        // 対象ファイル
&を取ってみましょう。


KEN  2005-07-05 19:51:55  No: 58178

>REE さん
早速のレス、ありがとうございます。
言われたとおり「&」をとったら、ビルドが通りました。

ですが、現在想定どおりの動きをしてくれません(IEの一時ファイルを全削除
する機能を作ろうとしています)
おそらくSHFILEOPSTRUCT構造体のパラメータの与え方に問題があると思うのですが、
想定通りの動作をさせるには、どこを直せばいいでしょうか?
SHFILEOPSTRUCT構造体は以下のように定義しています。

typedef struct _SHFILEOPSTRUCT {
    HWND  hwnd;                 // ウィンドウハンドル
    UINT  wFunc;                // 実行する操作
    LPCTSTR  pFrom;             // 対象ファイル名
    LPCTSTR  pTo;               // 目的ファイル名
    FILEOP_FLAGS  fFlags;       // フラグ
    BOOL fAnyOperationsAborted; // 結果
    LPVOID  hNameMappings;      // ファイル名マッピングオブジェクト
    LPCTSTR lpszProgressTitle;  // ダイアログのタイトル
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

同じスレで連続質問になってしまい申し訳ありませんが、どうか宜しくお願い致します。


REE  2005-07-05 22:43:03  No: 58179

>ですが、現在想定どおりの動きをしてくれません(IEの一時ファイルを全削除
>する機能を作ろうとしています)

現在は想定とどう違うのですか?

>おそらくSHFILEOPSTRUCT構造体のパラメータの与え方に問題があると思うのですが、
>想定通りの動作をさせるには、どこを直せばいいでしょうか?

「REE 2005/07/05(火) 10:22:42」の発言の前半は確認しましたか?

>SHFILEOPSTRUCT構造体は以下のように定義しています。

あなたが具体的にどのように設定しているかが重要です。


KEN  2005-07-06 01:58:57  No: 58180

>REEさん
説明が足りずにすみませんでした。
現在、プログラムを流すと「ファイルを削除できません。送り側のファイルまたはディスクから読み取れません」というエラーメッセージが出ます。

構造体パラメータは以下のように与えています。
  SHFILEOPSTRUCT sIEtemp;          // 「IE一時ファイル」構造体
  sIEtemp.hwnd = m_hWnd;
  sIEtemp.wFunc = FO_DELETE;          // 処理モード「削除」
  sIEtemp.pFrom = d_ietemp;    // 対象ファイル
  sIEtemp.pTo = "\0";
  sIEtemp.fFlags = FOF_SILENT|FOF_NOCONFIRMATION;          // フラグ
  sIEtemp.fAnyOperationsAborted = TRUE;

>CStringに、"\0\0"を足しても、末尾に'\0'が二つ付くとは限りません。
ということは、現在NULL文字指定が不完全でエラーになっている、という可能性があるということでしょうか。どうやったらNULL文字を2つ加えられるのかわかりません。。。

何かアドバイスをいただければ幸いです。


KING・王  2005-07-06 02:35:39  No: 58181

#はずしていたら、ごめんなさい。

d_ietempの中は正しいですか?
一度、sIEtemp.pFromもd_ietempを用いずに、直接文字列を指定してみては、どうでしょうか?


シャノン  2005-07-08 18:59:20  No: 58182

> ということは、現在NULL文字指定が不完全でエラーになっている、という可能性があるということでしょうか。どうやったらNULL文字を2つ加えられるのかわかりません。。。

CString は「単一の NULL 終端文字列」を表すクラスですので、CString を使っている限り、できません。
一旦、生の文字列(TCHAR[])にコピーして、その末尾に \0 をひとつ追加しましょう。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加