【发布时间】:2009-05-27 06:18:40
【问题描述】:
********平台:在Vista(终极版或家庭/高级版)中不起作用,其他操作系统(xp,windows7)它起作用*************
我正在线程中使用 c++.net(或 c#.net)清空回收站。当我直接(没有线程)这样做时,它可以工作。但如果线程使用它不会。请看下面的代码sn-p:
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);}
}
};
}
这里有什么问题...?
【问题讨论】:
-
你能分享一些关于它是如何不工作的细节(异常细节和类似的)吗?
-
它不会抛出任何异常,而是返回一个负值。成功时(在没有任何线程的情况下调用)返回 0。在调用 SHEmptyRecycleBin 后还设置 [DllImport("kernel32.dll", SetLastError=true, ...)] 尝试使用 System.Console.WriteLine(Marshal. GetLastWin32Error()) 显示“操作成功完成”虽然回收站没有清空。
-
返回错误码?负值?号码是多少?更好的是:假设负数实际上是一个无符号的 32 位值,然后将其转换为十六进制。然后用谷歌搜索十六进制错误代码(例如 80004005)
标签: .net multithreading dll pinvoke unmanaged