0

******** プラットフォーム: Vista (ultimate または home/premium) では動作しません。その他の OS (xp、windows7) では動作します************

スレッド内で c++.net (または c#.net) を使用してごみ箱を空にしています。これをまっすぐに(スレッドなしで)行うと、機能します。しかし、スレッドが使用されている場合はそうではありません。以下のコード スニペットをご覧ください。

namespace EmptyRecycleBin_C{
enum RecycleFlags
{
  SHERB_NOCONFIRMATION = 0x00000001,
  SHERB_NOPROGRESSUI = 0x00000002,
  SHERB_NOSOUND = 0x00000004
};
public ref class Form1 : public System::Windows::Forms::Form{

[DllImport("Shell32.dll",CharSet=CharSet::Unicode)]
static System::UInt32 SHEmptyRecycleBin(IntPtr hwnd, String^ pszRootPath, RecycleFlags dwFlags);

private: void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
  Thread^ th = gcnew System::Threading::Thread(gcnew ThreadStart(this, &Form1::doEmpty));
  th->Start();
  //this->doEmpty(); // this line works just fine
}

private: void doEmpty()
{
  try{
        SHEmptyRecycleBin(IntPtr::Zero, String::Empty, RecycleFlags::SHERB_NOCONFIRMATION);
     }catch(Exception^ ex)
     {Diagnostics::Debug::Write(ex->Message);}
}
};
}

ここで問題は何ですか...?

4

4 に答える 4

1

シェル関数は STA スレッドのみで動作し、.NET スレッドはデフォルトで MTA です。シングル アパートメント スレッドを使用するようにスレッドを設定できます。

th->SetApartmentState(ApartmentState::STA);
th->Start();
于 2010-01-22T23:16:29.200 に答える
1

作成したスレッドが、メイン スレッドのセキュリティ コンテキストではなく、デフォルトのセキュリティ コンテキストで実行されるためでしょうか?

ヒントについては、ExecutionContext のドキュメントを参照してください。スレッドに ExecutionContext を設定して、再試行できます。

于 2009-05-27T22:22:36.770 に答える
1

スレッドから CoInitialize を呼び出しましたか?

返されるエラーコードは何ですか?

于 2010-01-22T23:13:46.840 に答える
0

なぜそれが起こっているのかわかりませんが、他のスレッド方法を試しましたか? BackgroundWorker コンポーネントや ThreadPool.QueueUserWorkItem などですか? エラーはまだ発生しますか?

于 2009-05-27T06:33:29.797 に答える