大体こんな感じーというサンプル。
動作は確認してない。
//Internet Explorer操作用タイプライブラリの取り込み
#pragma warning ( disable: 4146 )
#import "C:\WINDOWS\system32\shdocvw.dll" rename("FindText", "FindTextIE")
#import "C:\WINDOWS\system32\mshtml.tlb" rename("TranslateAccelerator","TranslateAcceleratorHTML")
#pragma warning ( default: 4146 )
//IE操作用オブジェクトの宣言
SHDocVw::IWebBrowser2Ptr pIE = NULL;
void IEBusyWait()
{
if( pIE == NULL ){
return;
}
VARIANT_BOOL bBusy;
while(1){
HRESULT hr = pIE->get_Busy(&bBusy);
if( FAILED( hr ) ){
// なにかエラーしている
break;
}
if( bBusy == S_OK ){
break;
}
Sleep(1000);
}
}
void *****::OnOK()
{
// COMの初期化
CoInitialize(NULL);
HRESULT hr = pIE.CreateInstance(__uuidof(SHDocVw::InternetExplorer));
if(FAILED(hr)){
TCHAR str[256];
wsprintf(str, _T("NewIE#CreateInstance error:%x\n"), hr);
::OutputDebugString(str);
return;
}
// pIE->PutVisible(VARIANT_TRUE); //IEの表示
pIE->PutVisible(VARIANT_FALSE); //IEの非表示
// ログイン
pIE->Navigate(_T("https://login.yahoo.co.jp/config/login"));
IEBusyWait();
//Htmlドキュメントのオブジェクト取得
MSHTML::IHTMLDocument2Ptr pHtmlDoc;
pHtmlDoc = pIE->GetDocument();
//Formsタグのオブジェクトを取得
MSHTML::IHTMLElementCollectionPtr pHtmlCol = pHtmlDoc->forms;
// "login"というフォームの0番目を指定
COleVariant data;
IDispatch *ppvdispForm;
data.SetString("login_form", VT_BSTR);
pHtmlCol->raw_item(data, COleVariant((short)0), &ppvdispForm); //特定のFormタグのDispatchオブジェクトを取得
//IHTMLFormElementクラスとFormのDispatchオブジェクトを結合
MSHTML::IHTMLFormElementPtr ppvForm;
ppvdispForm->QueryInterface(__uuidof(MSHTML::IHTMLFormElement), (void**)&ppvForm);
// "username"というInputの0番目を指定
//Formタグ内のInput(type = "text")へ文字列を格納
IDispatch *ppvdispText;
MSHTML::IHTMLInputElementPtr ppvInput;
data.SetString("username",VT_BSTR);
ppvForm->raw_item(data, COleVariant((short)0), &ppvdispText);
ppvdispText->QueryInterface(__uuidof(MSHTML::IHTMLInputElement), (void**)&ppvInput); //取得したForm内に存在するInputオブジェクトを取得
ppvInput->value = "username";
// "password"というInputの0番目を指定
IDispatch *ppvdispTextPass;
MSHTML::IHTMLInputElementPtr ppvInputPass;
data.SetString("passwd",VT_BSTR);
ppvForm->raw_item(data, COleVariant((short)0), &ppvdispTextPass);
ppvdispTextPass->QueryInterface(__uuidof(MSHTML::IHTMLInputElement), (void**)&ppvInputPass);
ppvInputPass->value = "pass";
// Submit!
ppvForm->submit();
IEBusyWait();
// 後始末 これをしないとアサートしますよ
pHtmlCol = NULL;
pHtmlDoc->close();
pHtmlDoc = NULL;
if( pIE != NULL ){
pIE->Quit();
}
pIE = NULL;
// COM解放
CoUninitialize();
}