初めまして。
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構造体
);
}
宜しくお願いします。
> CString d_ietemp = m_ietemp + "\\*" + "\0\0";
CStringに、"\0\0"を足しても、末尾に'\0'が二つ付くとは限りません。
> sIEtemp.pFrom = &d_ietemp; // 対象ファイル
&を取ってみましょう。
>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;
同じスレで連続質問になってしまい申し訳ありませんが、どうか宜しくお願い致します。
>ですが、現在想定どおりの動きをしてくれません(IEの一時ファイルを全削除
>する機能を作ろうとしています)
現在は想定とどう違うのですか?
>おそらくSHFILEOPSTRUCT構造体のパラメータの与え方に問題があると思うのですが、
>想定通りの動作をさせるには、どこを直せばいいでしょうか?
「REE 2005/07/05(火) 10:22:42」の発言の前半は確認しましたか?
>SHFILEOPSTRUCT構造体は以下のように定義しています。
あなたが具体的にどのように設定しているかが重要です。
>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つ加えられるのかわかりません。。。
何かアドバイスをいただければ幸いです。
#はずしていたら、ごめんなさい。
d_ietempの中は正しいですか?
一度、sIEtemp.pFromもd_ietempを用いずに、直接文字列を指定してみては、どうでしょうか?
> ということは、現在NULL文字指定が不完全でエラーになっている、という可能性があるということでしょうか。どうやったらNULL文字を2つ加えられるのかわかりません。。。
CString は「単一の NULL 終端文字列」を表すクラスですので、CString を使っている限り、できません。
一旦、生の文字列(TCHAR[])にコピーして、その末尾に \0 をひとつ追加しましょう。
ツイート | ![]() |