******** Plate-forme: dans Vista (ultime ou maison/premium), il ne fonctionne pas, autre système d'exploitation (xp, windows7) cela fonctionne ***********Problème uniquement sous Vista (.net): appel dll non géré (Shell32.dll, fonction: SHEmptyRecycleBin) à partir du fil
Je vide la corbeille en utilisant C++ .net (ou C# .net) dans un thread. Quand je fais cela directement (sans fil) cela fonctionne. Mais si le fil utilisé ne le fait pas. S'il vous plaît regarder l'extrait de code ci-dessous:
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);}
}
};
}
quel est le problème ici ...?
Pouvez-vous partager quelques détails sur comment cela ne fonctionne pas (détails de l'exception et similaires)? –
il ne jette aucune exception, mais renvoie une valeur négative. En cas de succès (lorsqu'il est appelé sans thread) renvoie 0. Définissez également [DllImport ("kernel32.dll", SetLastError = true, ...)] après avoir appelé SHEmptyRecycleBin essayé d'attraper le résultat de l'erreur avec System.Console.WriteLine (Marshal. GetLastWin32Error()) qui indique "opération terminée avec succès" bien que la corbeille n'ait pas été vidée. – Samir
Retourne un code d'erreur? Une valeur négative? Quel est le nombre? Mieux encore: supposons que le nombre négatif est en réalité une valeur 32 bits non signée, puis la convertit en hexadécimal. Ensuite, google pour le code d'erreur hexadécimal (par exemple 80004005) –