المكالمات API ويندوز موبايل - النجاح ولكن GetLastWin32Error بإرجاع رمز الخطأ - يجب أن أكون قلقا؟

StackOverflow https://stackoverflow.com/questions/606048

سؤال

وانا مبتدئ لPInvoke يدعو. لقد غوغليد هذا ما يبدو وكأنه مسألة ما يكفي بسيطة ولكن لا فرح.

وأنا إجراء مكالمات API ويندوز موبايل موليبلي على التوالي (لاكتشاف ما إذا كان التطبيق الخاص بي قيد التشغيل ومن ثم إعادة تنشيط عليه). كل شيء يعمل بشكل جيد ومدهش ولكن أردت أن أضع في الخ تسجيل للمرة عندما لا يعمل موافق.

وأثناء كتابة هذا الرمز وجدت أنني سوف تحصل رموز الخطأ حتى عندما مكالماتي يبدو بإرجاع نتيجة صحيحة والنتيجة صالحة يستخدم بنجاح من قبل استدعاء لاحقة (تثبت انها صحيحة على ما أعتقد.)

ومنها مثلا. أدعو CreateToolhelp32Snapshot الذي يعطي لي عودة مؤشر إلى لقطة من العمليات قيد التشغيل حاليا. داعيا Marshal.GetLatWin32Error immediatley بعد عودة خطأ 6 مما يعني على ما يبدو مقبض غير صالح. ولكن يتم استخدام القيمة التي تم إرجاعها بنجاح من قبل المكالمات اللاحقة إلى أساليب أخرى ويعمل العملية برمتها. انها بالتأكيد هذه الدعوة الخاصة التي تحدد خطأ 6 لأنه إذا كان استدعاء Marshal.GetLatWin32Error فقط قبل نسميها بإرجاع 0.

ويدعو إلى Process32First وProcess32Next يظهرون سلوكا مماثلا أي أنها تعطيني معالجة المعلومات بسعادة لكن في بعض الأحيان خطأ تحديد 6. I (التفكير) وأنا أعلم أن هذا يحدث لأن أدعو Marshal.GetLatWin32Error immediatley قبل وبعد كل مكالمة وأحيانا يكون من 0 قبل وبعد 6. حاليا أنا دائما الحصول على نتيجة ناجحة (إما مقبض الذي يعمل مع المكالمات اللاحقة أو القيمة التي يلقي إلى 1 إذا صحيح أو صحيح إذا منطقي ومعلومات عملية نسخ بنجاح إلى عازلة بلدي).

وهكذا ..... يجب أن أهتم؟ انها تعمل كل شيء .... لا يهمني ما الخطأ تستعد إذا أعود نتيجة لذلك يستخدم بنجاح من قبل بقية العملية؟ يقول حدسي نعم أفعل، وبالتأكيد؟ وفي كلتا الحالتين، كيف يمكنني في الواقع معرفة ما إذا كان كل شيء على ما يرام إذا كنت على ما يبدو الحصول على نتيجة ناجحة مرة أخرى ولكن يتم تعيين رمز خطأ أيضا؟ أنا كوابيس حول الإفراج عن نظام غير مستقر أنه لن يتم إعطائي معلومات الخطأ مفيدة الظهر ........

وUPDATE

وهذه هي النتائج من التعليمات البرمجية loggong بلدي في محاولة لتوضيح ما أتحدث عنه لكل مهتم. وباختصار، يتحقق رمز بالفعل تشغيل نسخ من نفسه، ثم لبالفعل تشغيل نسخ من العميل ومن ثم إعادة تنشيط العميل إذا وجد.

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        

وكانت النتائج دائما الحقيقية باستثناء مشاركة المكالمات إلى Process32Next الذي فشل مع رمز 18 يشير تم التوصل الإدخال الأخير. ولقد لاحظت فقط ShowWindow وأدى إلى خطأ 120 غير معتمدة حتى سآخذ أن أصل الكلمة.

وحتى بلدي سؤالين الفعلية هي:

لماذا الأخطاء عندما حصلت على نجاح منتديات و، عندما قبل دعوة وبعد استدعاء الأخطاء هي نفسها، كيف يمكنني معرفة ما إذا كان هذا الخطأ القديم أو قوع الثاني من نفس الخطأ؟

هل كانت مفيدة؟

المحلول

وأنت لا ينبغي أن تكون الدعوة GetLastWin32Error (يقوم GetlastError) ما لم يعود CreateToolhelp32Snapshot INVALID_HANDLE_VALUE.

<لأ href = " http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx "يختلط =" noreferrer نوفولو "> http://msdn.microsoft.com/en-us/library/ms682489 ( VS.85) .aspx اتصال

نصائح أخرى

وتتوقع يقوم GetlastError () لإرجاع 0 بعد كل مكالمة ناجحة في أي وظيفة. ولكن هذا يعني أن هذه المهام تتطلب SetLastError (0) في خاتمة الخاصة بهم والتي لم يتم ذلك دائما. هذا هو السبب الذي لا يمكن التمييز بين رمز خطأ القديم والجديد. فقط اتصل يقوم GetlastError () لحالات MSDN يقول لك أن تفعل ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top