2009-03-03 15 views
0

PInvoke çağrılarına yeni başlayan biriyim. Bunu basit bir soru gibi görüyorum ama neşe yok diye düşündüm.Windows Mobile API çağrıları - başarı ancak GetLastWin32Error hata kodunu döndürüyor - endişelenmeli miyim?

Üst üste Windows Mobile API çağrıları yapıyorum (uygulamanızın çalışıp çalışmadığını algılamak ve sonra yeniden etkinleştirmek için). Her şey iyi ve dandy çalışır ama ben iyi çalışmadığı zamanlar için giriş vb koymak istedim. Benim aramalar görünüşte geçerli bir sonuç ve bir sonraki çağrı tarafından başarıyla kullanılmaktadır geçerli bir sonuç döndüğünüzde bile hata kodları alacak bulundu bu kodu yazarken

(bence geçerli olduğundan kanıtlayan.)

Ör Şu anda çalışan işlemlerin anlık görüntüsüne geri dönme sağlayan CreateToolhelp32Snapshot'ı arıyorum. Marshal.GetLatWin32Error'ı arayarak, hemen ardından Geçersiz Sap anlamına gelen Hata 6'yı çağırır. Ancak döndürülen değer, diğer yöntemlere yapılan çağrılar ve tüm süreç çalışmaları ile başarılı bir şekilde kullanılır. Kesinlikle bu çağrı, Hata 6'yı ayarlar. Çünkü eğer Marshal.GetLatWin32Error'ı çağırırsa, sadece çağrı gelmeden önce 0 döner.

Process32First ve Process32Next çağrıları benzer davranışı gösterir, yani süreç bilgisini memnuniyetle verir ancak bazen Hata 6'yı ayarlarlar. (düşünüyorum) Bunun gerçekleştiğini biliyorum çünkü her aramadan önce ve sonra Marshal.GetLatWin32Error hemen aramasını ve bazen 0'dan 6'ya sonra aramam. Şu anda her zaman başarılı bir sonuç alıyorum (ya sıradaki çağrılar ile çalışan bir tanıtıcı veya bool ve işlem bilgisi arabelleğe başarıyla kopyalandığında int veya true olursa 1'e atanan bir değer).

Yani umurumda mıyım? Her şey çalışıyor ... İşlemin geri kalanı tarafından başarıyla kullanılan bir sonucu geri alırsam hangi hatanın ayarlandığını umursuyorum? Bağırmam evet diyor, kesinlikle mi? Her iki durumda da, görünüşe göre başarılı bir sonuç elde edersem, ancak bir hata kodu da belirlenirse, her şeyin yolunda olup olmadığını nasıl anlarım? Ben

GÜNCELLEME ........ geri Bana yararlı hata bilgiler veren olmayacak kararsız bir sistem oluşturması hakkında kabus yaşıyorum

Bu denemek ve göstermek için benim loggong kod sonuçları ne İlgilenenler için konuşuyorum. Kısaca, kod zaten kendi başına çalışan kopyalarını kontrol eder, daha sonra müşterinin zaten çalışmakta olan kopyaları için kontrol eder ve ardından bulduğunda müşteriyi yeniden etkinleştirir.

Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 0, Post-call error code: 6 
Method name: Process32First, Result: True, Pre-call error code: 6, Post-call error code: 6    
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 6     
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                    
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18    
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 6  
Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 6, Post-call error code: 0 
Method name: Process32First, Result: True, Pre-call error code: 0, Post-call error code: 0    
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                  
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18    
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 0  
Method name: ShowWindow, Result: True, Pre-call error code: 0, Post-call error code: 120     
Method name: SetForegroundWindow, Result: True, Pre-call error code: 120, Post-call error code: 6   

sonuç hep 18 son giriş ulaşıldı belirten kod ile hangi başarısızlık için Process32Next son aramalar dışında doğrudur. Ve sadece ShowWindow'un desteklenmeyen Hata 120 ile sonuçlandığını fark ettim, böylece bu çağrıyı alacağım.

Yani benim iki gerçek sorular şunlardır:

Neden hataları bir başarı var mı?
Arama öncesi ve arama sonrası hataları aynı olduğunda, bunun eski hatanın mı yoksa aynı hatanın ikinci bir durum mu olduğunu nasıl anlarım?

cevap

2

CreateToolhelp32Snapshot, INVALID_HANDLE_VALUE değerini döndürmedikçe, GetLastWin32Error (GetLastError) çağrılmamalısınız.

Sen GetLastError() Herhangi bir fonksiyonun her başarılı çağrısından sonra 0 dönmek bekliyoruz http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx

+0

Bu benim elde edemediğim bir şey. Bağlantı, INVALID_HANDLE_VALUE alırsanız yalnızca * * GetLastWin32Error öğesini çağırabileceğinizi söylemez. Ve GetLastWin32Error belgelerine, SetError'ın doğru olduğu son PInvoke çağrısından hataları sakladığını söylüyor. Son hata bu durumda kurgu işi mi? –

+0

Ya da MSDN tarafından belirtilen ceratin değerleri geri almadıkça önemli değil mi? –

+0

Nm, Google aramalarımı söylediklerinize göre daralttım ve bunu buldum: http://blogs.msdn.com/adam_nathan/archive/2003/04/25/56643.aspx –

1

bakınız. Ancak bu, bu işlevlerin SetLastError (0) öğesini her zaman yapılmayan epilogunda çağırdığını gösterir.Bu yüzden eski bir hata kodu ile yenisini ayırt edemezsiniz. MSDN'in size bunu bildirdiği durumlarda yalnızca GetLastError() öğesini çağırın.

+0

Bu, SetLastError = DllImport özniteliğinin gerçek kısmı tarafından işlenmiyor mu? [DllImport ("toolhelp.dll", SetLastError = true)] public static extern IntPtr CreateToolhelp32Snapshot (uint flags, uint processid); –

+0

MSDN'de DllImport özniteliğinin açıklaması, burada belirttiğiniz SetLastError öğesinin yalnızca aramaya GetLastError() öğesini marshalling özelliğini etkilediğini belirtmektedir. WinAPI SetLastError(), yalnızca öznitelik için bir değiştirici değil. – sharptooth

+0

Evet teşekkürler ve ayrıca Andrew ve Andrew'in söylediklerine göre genişleyen bir blog buldum. –