В процессе «войти» в login.live или через страницу msdn.com Форма, сгенерированная DHTML, работает неправильно, так как она нашла первый IHTMLElement
элемент с тэгом «input» и преобразованием его в поле IHTMLInputElement
может видеть, что он имеет тип = «текст», однако при запросе он не обеспечивает интерфейс IHTMLInputTextElement
.Ни одно из других полей ввода не предоставляет интерфейсы для их конкретных типов.
По сравнению с этим тот же процесс работает просто отлично при нажатии http://gmail.com.
Я в растерянности относительно источникаэтой ошибки, DHTML, login.live, луна в неправильной фазе?Получите ту же проблему в IE7 и IE8, поэтому она не зависит от версии.Получите ту же проблему независимо от режима совместимости IE.
Вот краткий пример
TSharedField Factory( CComPtr<IHTMLElement>& _Element )
{
CComQIPtr<IHTMLTextAreaElement> TextAreaField = _Element;
if (TextAreaField)
return TSharedField(new Text(TextAreaField));
CComQIPtr<IHTMLInputTextElement> TextField = _Element;
if (TextField)
return TSharedField(new Text(TextField));
CComQIPtr<IHTMLInputButtonElement> ButtonField = _Element;
if (ButtonField)
return TSharedField(new Button(ButtonField));
CComQIPtr<IHTMLInputFileElement> FileField = _Element;
if (FileField)
return TSharedField(new CWebField_File(FileField));
CComQIPtr<IHTMLInputHiddenElement> HiddenField = _Element;
if (HiddenField)
return TSharedField(new Hidden(HiddenField));
CComQIPtr<IHTMLOptionButtonElement> BooleanField = _Element;
if (BooleanField)
return TSharedField(new Boolean(BooleanField));
CComQIPtr<IHTMLSelectElement> SelectionField = _Element;
if (SelectionField)
return TSharedField(new Select(SelectionField));
CComQIPtr<IHTMLInputImage> ImageField = _Element;
if (ImageField)
return TSharedField(new Image(ImageField));
// Added for debug, only gets hit on login.live
std::wstring type;
HRESULT hr;
DOM_SIMPLE_GET_STRING( type, _Element, get_tagName, hr);
::OutputDebugString( type.c_str() );
if( type == L"INPUT" ){
CComQIPtr<IHTMLInputElement> Input = _Element;
if( Input){
DOM_SIMPLE_GET_STRING( type, Input, get_type, hr);
::OutputDebugString( (type+L"\n").c_str() );
}
}
return TSharedField();
}