سؤال

لدي تطبيق واحد يتفاعل مع الخادم. إذا انخفض الخادم ، فسأحصل 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. 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top