मेरे पास ऐसे तरीके हैं जिनमें से: 1 रीसायकल बिन को क्वेरी करने के लिए "SHQueryRecycleBin" का उपयोग करें और अन्य उपयोग "SHEmptyRecycleBin" रीसायकल बिन को हटाने के लिए, दोनों बिना किसी समस्या के ठीक काम करते हैं मेरे .नेट 4.8 प्रोजेक्ट्स।

लेकिन जब मैं .Net Core 3.1 "SHQueryRecycleBin" पर समान कोड का उपयोग करने का प्रयास कर रहा हूं, तो बस काम करने से मना कर दें और "HRESULT -2147024809" पर फेंक दें। .

जाँच करने के लिए मैंने इसे {.Net 4.8} बनाम {.Net Core 3.1} कंसोल, WinForm और Wpf ऐप पर आज़माया और यह .net फ्रेमवर्क पर हर समय काम करता था।

कोड नमूना:

[DllImport("shell32.dll")]
static extern int SHQueryRecycleBin(string pszRootPath, ref 
SHQUERYRBINFO  pSHQueryRBInfo);

[StructLayout(LayoutKind.Sequential, Pack=1)] // also tried pack=4 
public struct SHQUERYRBINFO
{
    public int  cbSize;
    public ulong i64Size;
    public ulong i64NumItems;
}

public static int GetCount()
{
    SHQUERYRBINFO sqrbi = new SHQUERYRBINFO();
    sqrbi.cbSize = Marshal.SizeOf(typeof(SHQUERYRBINFO));
    int hresult = SHQueryRecycleBin(string.Empty, ref sqrbi);
    return (int)sqrbi.i64NumItems;
}
1
Rahul Srivastava 6 सितंबर 2020, 19:18

1 उत्तर

सबसे बढ़िया उत्तर

आपके कोड की कोशिश करने से पहले मुझे इस बात का अंदाजा था कि समस्या क्या हो सकती है।

यदि आप अपना कोड इस रूप में चलाते हैं, तो आपको SHQueryRecycleBin से -2147024809 का HRESULT प्राप्त होता है।

यह वास्तव में 0x80070057 का एक HRESULT है, जो त्रुटि ERROR_INVALID_PARAMETER है (या 'पैरामीटर गलत है' यदि आप सादा अंग्रेजी पसंद करते हैं)। यह इंगित करता है कि Win32 कॉल पर भेजे जा रहे एक या अधिक पैरामीटर के साथ कोई समस्या है।

आपके कोड के मामले में, अपराधी आपकी StructLayout घोषणा SHQUERYRBINFO है। आपने एक Pack संरेखण आकार 1 (और कोशिश की 4) परिभाषित किया है, लेकिन struct में ulongs का उपयोग कर रहे हैं। एक Win32 ulong 8 बाइट्स है, इसलिए आपको .Net Core में 8 को Pack आकार के रूप में उपयोग करना चाहिए:

...

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct SHQUERYRBINFO
{
    ...

संयोग से, यदि आप Pack पैरामीटर को पूरी तरह से छोड़ देते हैं, तो 8 के डिफ़ॉल्ट मान का उपयोग किया जाएगा।

0
Martin 6 सितंबर 2020, 21:05