مشكلة مع GetLasterror API على Windows 7
-
21-09-2019 - |
سؤال
لدي تطبيق واحد يتفاعل مع الخادم. إذا انخفض الخادم ، فسأحصل ERROR_WINHTTP_CANNOT_CONNECT
انا استخدم getLastError()
API للحصول على رمز الخطأ هذا ، أنا أتعامل مع رمز الخطأ هذا لعرض رسائل الخطأ المناسبة للمستخدمين. يعمل هذا البرنامج بشكل جيد في Windows 2003. عندما حاولت مع Windows7 ، لا أحصل على أي خطأ ، getLastError()
إرجاع API 0 في كل مرة حتى لو حدث خطأ. أنا أستخدم C ++ اعتبارًا من لغة البرمجة.
شكرا لك مقدما
Santhu
المحلول 2
لقد لاحظت سلوكًا مختلفًا لـ GetLasterror API في Windows 2003 وفي Windows 7. أدناه تفاصيل الملاحظة الخاصة بي
في Windows 2003:
رمز المثال:
WinHttpOpen ()
- يكمل بنجاح
Winhttpconnect()
- فشلت API هذه بسبب بعض الأسباب ، على سبيل المثال رمز الخطأ 12029
GetLastErrorCode()
- إرجاع رمز الخطأ 12029 كما هو متوقع
WinHttpCloseHandle(hOpen)
; ؛ - مقبض إغلاق httpopen ، يكمل Successly
GetLastErrorCode()
- إرجاع رمز الخطأ 12029
في Windows 7
رمز المثال:
WinHttpOpen ()
- يكمل بنجاح
Winhttpconnect()
- فشلت API هذه بسبب بعض الأسباب ، على سبيل المثال رمز الخطأ 12029
GetLastErrorCode()
- إرجاع رمز الخطأ 12029 كما هو متوقع
WinHttpCloseHandle(hOpen);
- مقبض إغلاق httpopen ، يكمل بنجاح
GetLastErrorCode()
- إرجاع رمز الخطأ 0 // راجع الفرق مع مثال Windows 2003 ، على Windows 2003 يعيد API هذا الخطأ الأخير وهو 1209
نصائح أخرى
إذا قمت بإجراء أي مكالمات Windows API بين الفشل والوقت الذي تتصل فيه GetLasterRor () ، فيمكن أن يتم إعادة تعيين رمز الخطأ إلى 0 عندما تنجح مكالمة API.
تحتاج إلى استدعاء getLasterror () مباشرة بعد الفشل ، وحفظ هذه القيمة بدلاً من محاولة الانتظار والاتصال GetLasterror () لاحقًا.
أجب من Microsoft على هذا السلوك
The rules for GetLastError are:
• If the WinHttp API returns error (for example WinHttpIsHostInProxyBypassList, http://msdn.microsoft.com/en-us/library/ee861268(VS.85).aspx) this is the error and GetLastError should *NOT* be called.
o If GetLastError() is called, regardless of the success or failure of the API, the returned value is unpredictable and may change between Windows versions, Service Packs, or even between runs.
• If the WinHttp API returns BOOL (for example WinHttpSetTimeouts, http://msdn.microsoft.com/en-us/library/aa384116(VS.85).aspx), it indicates failure by returning FALSE. If the caller is interested in the detailed error, (s)he should call GetLastError(). Note that GetLastError should be called *if and only if* the API failed.
o If GetLastError() is called when the API succeded (returned anything but FALSE), the returned value is unpredictable and may change between Windows versions, Service Packs, or even between runs.
• If the WinHttp API returns HINTERNET (pseudo handle) the rules are exactly the same, except failure is indicated by returning NULL.
o If GetLastError() is called when the API succeded (returned anything but NULL), the returned value is unpredictable and may change between Windows versions, Service Packs, or even between runs.