हमारे पास एक डेल्फी एक्सई एप्लिकेशन है जो SOAP (THTTPRIO आदि) संचार का उपयोग करता है जो (डेल्फी में) WinInet.dll पर डिफ़ॉल्ट रूप से काम करता है। हमने प्रमाणीकरण कोड को ठीक किया है ताकि यह https प्रमाणीकरण का उपयोग कर काम करता है, और जब https के लिए उपयोगकर्ता नाम और पासवर्ड सही होता है, तो सब कुछ ठीक है।डेल्फी साबुन https प्रमाणीकरण विफलता एक संवाद बॉक्स पॉप अप करता है
समस्या यह है कि जब प्रमाणीकरण विवरण गलत हैं, तो आपको Windows से एक संदेश बॉक्स मिलता है, जो शायद WinInet.dll द्वारा पॉप अप किया जा रहा है। मैं उस संवाद बॉक्स को दूर करना चाहता हूं। मैं यह नहीं समझ सकता कि मेरे डेल्फी एसओएपी को कैसे बदला जाए ताकि पासवर्ड नहीं आएगा।
स्थिति निम्न तरीकों से different than this question है:
मैं सभी चीजें हैं जो वह कर रहा है, InternetSetOption (...) बुला उपयोगकर्ता नाम और पासवर्ड सेट करने के लिए सहित कर रहा हूं।
मैं एक स्व-हस्ताक्षरित प्रमाणपत्र वाले सर्वर का उपयोग नहीं कर रहा हूं, इसलिए इसलिए IgnoreInvalidCerts ध्वज मेरे मामले पर लागू नहीं है।
किसी तरह, मैं मैं कुछ एपीआई यह पॉप अप करने के
InternetErrorDlg
यह है कि (विंडोज़ के कुछ संस्करणों का कहना है कि विंडोज सुरक्षा विकल्प) नहीं बताने के लिए WinInet में कॉल उपयोगकर्ता पूछने के लिए पॉप अप प्राप्त करने की आवश्यकता है।मेरे मामले में हमारे कॉन्फ़िगरेशन फ़ाइल में हमारे पास उपयोगकर्ता नाम और पासवर्ड का उपयोग किया जा रहा है, यह गलत है (पुराना है) और इसलिए हम चाहते हैं कि WinInet कोड डायलॉग बॉक्स को पॉप अप करने के बजाय बस एक त्रुटि लौटाए ।
शायद अन्य सवाल पुरुष वास्तव में यह पता लगाने की थी कि इसे कैसे किया, लेकिन उस सवाल पर विस्तार से वह यह कैसे किया देखने के लिए अपर्याप्त है। स्वीकृत उत्तर मेरे लिए काम नहीं करता है।
कुछ मृत समाप्त होता है मैं पालन किया है:
PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI
के लिए WinInet MSDN डॉक्स - कि बजाय एक प्लगइन के लिए, एक WinInet उपयोगकर्ता के लिए लागू होने के लिए प्रकट नहीं होता।
WinInet MSDN डॉक्स InternetSetOption पर चर्चा, और कुछ समाचार समूहों मेरा पीछा पर पहले पोस्ट ईवेंट हैंडलर कोड के लिए नेतृत्व किया है:
procedure TMyDevice.HTTPWebNodeOnBeforePost(
const HTTPReqResp: SOAPHTTPTrans.THTTPReqResp; Data: Pointer);
var
SecurityFlagsLen:DWORD;
SecurityFlags:DWORD;
begin
{ authentication, NTLM+HTTPS, WinInet authentication set via WinInet SET INTERNET OPTION API.
This approach recommended on newsgroups for https basic authentication. }
if fUserName<>'' then
if not InternetSetOption(Data,
INTERNET_OPTION_USERNAME,
PChar(fUserName),
Length(fUserName)) then
raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));
if fPassword<>'' then
if not InternetSetOption(Data,
INTERNET_OPTION_PASSWORD,
PChar(fPassword),
Length (fPassword)) then
raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError));
{ possible type of hackage: WinInet Security option flags to stop password box? }
SecurityFlagsLen := SizeOf(SecurityFlags);
InternetQueryOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS,
Pointer(@SecurityFlags), SecurityFlagsLen);
SecurityFlags := SecurityFlags or SECURITY_FLAG_something;
InternetSetOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS,
Pointer(@SecurityFlags), SecurityFlagsLen);
end;
इस कोड पासवर्ड काम करता है, लेकिन जब उपयोगकर्ता की प्रवेश किया पासवर्ड गलत है , संदेश बॉक्स को पॉप अप करने के बजाय, मैं असफल होने के लिए एसओएपी कॉल कैसे प्राप्त करूं, या अपवाद उठा सकता हूं?
आप 'INTERNET_OPTION_ERROR_MASK' में [' INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328 (v = vs.85) .aspx) की स्थापना ध्वज की कोशिश किया ? –
वह ध्वज एक अतिरिक्त त्रुटि रिपोर्ट जोड़ता है, यह एक दूर नहीं लेता है। दिलचस्प बात यह है कि इसे WinInet.pas में परिभाषित नहीं किया गया है। –