2010-12-31 14 views
6

Ne tür hatalar meydana geliyor SHFileOperation() işlevini geri dönüşüm kutusuna bir dosya göndermek için kullanıyorum ve ne demek istediğimi bilmediğim 2 hata alıyorum çünkü bu işlevle hata kodları GetLastError() değerleri değil.SHFileOperation'ı Kullanma:

SHFileOperation() işlevi başarısız olduğunda, dönüş değerleri 0x57 (ondalık 87) ve 0x2 (ondalık 2) olur. Herkes bu hataların tanımlarını keşfetmeme yardımcı olabilir (özellikle bu işlevle çalışırken, hatalar GetLastError() kodlarının bir parçası değildir).

bazı önemli bilgiler:

  • I (MSDN yerine SHFileOperation ait IFileOperation kullanmayı diyor biliyorum ama ben SHFileOperation kullanıyorum neden olan benim app geriye compatable yapmak istiyorum &) Windows 7 kullanıyorum . Windows 7'de SHFileOperation kullanıyorum çünkü bu hata oluşuyorsa, bu çalışmayı 2000 &'dan tüm Windows sürümlerinde yapmak için hangi çözümü kullanabilirim?

  • SHFILEOPSTRUCT öğemin doğru olduğunu bildiğim kadarıyla hata ayıklaması var & (doğru bayraklar kullanılıyor, .pFrom çift null biten bir dizedir). Emin olduğum bir şey, dosyaya giden yolun doğru olduğudur (doğru bir şekilde biçimlendirilmiş olan gerçek bir dosyaya & yol açar).

  • Hakkında 2/5 kez SHFileOperation() o & bir hatayı

döndürür gelmez geri dönüşüm kutusuna dosyayı gönderir, yani çalışır.

BOOL result; 
SHFILEOPSTRUCT fileStruct; 
fileStruct.hwnd = hwnd; 
fileStruct.wFunc = FO_DELETE; 
fileStruct.pFrom = dest.c_str(); 
fileStruct.fFlags = FOF_FILESONLY; // FOF_ALLOWUNDO 
fileStruct.fAnyOperationsAborted = result; 

// Call operation(delete file) 
int success = SHFileOperation(&fileStruct); 

// if delete was successful 
if (success != 0) 
{ 
    printf("%s \t %X %d \n", dest.c_str(), success, success); 
    cout << result << endl; 

    MessageBox(hwnd, "Failed to delete file", "Error", MB_OK|MB_ICONERROR); 
    return; 
} 
+0

Siz yorum yanıltıcı. Bunu, blobun içinde veya içinde olduğu gibi aynı satıra geçirmeli ve 'silme başarısız olduysa' olarak değiştirmelisiniz. – sergiol

cevap

0

SHFileOperation belgelerine göre, bu hatalar this page on MSDN de bu hata kodları arama yapabilirsiniz Winerror.h'de gelen standart Windows hata kodları eşlenir.

Kişisel hatalar gibi görünmektedir:

ERROR_FILE_NOT_FOUND 2 (0x2) Sistem belirtilen dosyayı bulamıyor.

ve

ERROR_INVALID_PARAMETER 87 (0x57) Parametre hatalı.

5

shf301'de belirtildiği gibi, 87 hata kodu ERROR_INVALID_PARAMETER şeklindedir. Bu, kullanılmamış SHFILEOPSTRUCT alanlarının içeriğini başlatmayacağınız için muhtemelen rastgele değerler içerdiğinden oluşur. documentation, pTo "kullanılmadığında NULL olarak ayarlanması gerektiğini" söyler; İşletim sistemi bu alanın değerini kontrol ediyor olabilir ve NULL değilse, bir hata döndürüyor olabilir.

Öncelikle birini yaparak sıfıra tüm ayarlamaları:

SHFILEOPSTRUCT fileStruct = { 0 }; 

veya

SHFILEOPSTRUCT fileStruct; 
ZeroMemory(&fileStruct, sizeof(SHFILEOPSTRUCT)); 

Hata kodu 2 ERROR_FILE_NOT_FOUND olduğu; Dosyanın mevcut olmaması veya kullanıcının programınızı silmeye başlamadan önce silmesi, bu hata kodunu görmezden gelmek muhtemelen güvenlidir. (Silmeyi denemeden önce dosyanın var olduğunu kontrol etseniz bile, başka bir işlemin silinmiş olabileceğini unutmayın, bu nedenle her zaman bu hatayı işlemeniz gerekir.)

3

Bu snippit ile ilgili bazı ciddi sorunlar, i pFrom iki kat boş sonlandırılmalıdır SHFILEOPSTRUCT structure

  1. okuma öneririm. Ne tür bir dest olduğunu bilmiyorum ama neredeyse kesin olarak boş sonlandırılmış bir dizgeyi iade etmiyor.

  2. pTo parametresi kullanılmadığında NULL olarak ayarlanmalıdır. Joker karakterlere izin verilmez. Kullanımları öngörülemeyen sonuçlara yol açacaktır.

  3. güvenli uygulama bunu

    SHFILEOPSTRUCT shStruct doldurmadan önce yapı üzerinde sıfır bellek çağırmak olacaktır;
    ZeroMemory (& shStruct, sizeof (SHFILEOPSTRUCT));

  4. fileStruct.fAnyOperationsAborted = result; fonksiyonun sonuca geri döndüğü değeri koyamaz. SHFILEOPSTRUCT başlarına Bu konular senin almak hata kodları açıklamak yığını üzerinde var ve sadece

çağrısından sonra gelen okunabilir.