WebBrowserでPostDataを送信するには?

解決


geo  2004-08-07 06:30:59  No: 54156

Windows2000 sp4 VC++6.0 MFC ダイアログベースで開発をしています。
Microsoft Web Browser のコンポーネントを使って、URLを表示しています。
URLにアクセスする際に、PostDataを送信したいのですが、Etherealで確認
しますとHtmlヘッダ情報の終了後にPostDataが入っていました。

どなたか方法をご存知の方がおられたらお教えください。
よろしくお願い致します。

以下にソースを載せます。

char cHead[100]  = "Content-Type: application/x-www-form-urlencoded\n\r";
char cPost[128] = "year=2004&mon=07";
char cUrl[128]  = "http://XXXXXXX";

VARIANT vUrl, vHed;
vUrl = _variant_t( cUrl );
vHed = _variant_t( cHead );

// Safearray作成
char* pBuf;
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
// 作成するSAFEARRAYの要素数
rgsabound[0].cElements = strlen(cPost);
// 作成するSAFEARRAYの添字の下限値 = 0
rgsabound[0].lLbound = 0;
// SAFEARRAY作成
psa = SafeArrayCreate(VT_UI1,1,rgsabound);
// 作成したSAFEARRAYのポインタ取得及びロック
SafeArrayAccessData(psa,(void**)&pBuf);
//POSTDATAをSAFEARRAYにコピー
strcpy(pBuf,cPost);
// Variant作成
VARIANT pName;
VariantInit(&pName);
pName.vt = VT_ARRAY;
pName.parray = psa;
SafeArrayUnaccessData(psa); // SAFEARRAYアンロック
// POSTDATAのSafearray/Variant作成 <---

m_explorer.Navigate2 ( &vUrl, &_variant_t(), &_variant_t(), &pName, &vHed );


geo  2004-08-10 05:37:56  No: 54157

以下のように変更したら、PostDataを送ることができました。

#include <atlbase.h>  // COM コンポーネント利用をインクルード

char cHeader[100] = "Content-Type: application/x-www-form-urlencoded\n\r";
char cPost[128]   = "year=2004&mon=07";
char cUrl[128]    = "http://172.26.82.60/owss/wmwa0022.asp";

CString URLStr    = &cUrl[0];
CString headerStr = &cHeader[0];

CComVariant  vempty;
CComVariant  vUrl(URLStr);
CComVariant  vHeader(headerStr);
// URLとHEADERのVariantを作成 <---

// POSTDATAのSafearray/Variant作成 --->
// Safearray作成
HRESULT hr;
int postDataLen = strlen ( cPost );
void* pArrayData = NULL;
SAFEARRAYBOUND rgsabound[1];
// 作成するSAFEARRAYの要素数
rgsabound[0].cElements = postDataLen;
// 作成するSAFEARRAYの添字の下限値 = 0
rgsabound[0].lLbound = 0;
// SAFEARRAY作成
if ( (m_psa=SafeArrayCreate(VT_UI1,1,rgsabound)) == NULL ) return FALSE;
// 作成したSAFEARRAYのポインタ取得及びロック
if ( (hr=SafeArrayAccessData(m_psa,&pArrayData)) != S_OK ) return FALSE;
// POSTDATAをSAFEARRAYにコピー
memcpy ( pArrayData, (void*)cPost, postDataLen );

// Variant作成
VARIANT pName;
VariantInit ( &pName );
pName.vt = VT_ARRAY;
pName.parray = m_psa;
// SAFEARRAYアンロック
if ( (hr=SafeArrayUnaccessData(m_psa)) != S_OK ) return FALSE;
// POSTDATAのSafearray/Variant作成 <---

CLSID cid;
IUnknown     *pUnknown = NULL;
IWebBrowser2 *pBrowser = NULL;
// COM コンポーネント利用開始(のための初期化)
OleInitialize ( NULL );
// IE コンポーネントのクラス識別子(UUID)を探す
hr = CLSIDFromProgID ( L"InternetExplorer.Application", &cid );
// すべてのCOMが実装する最小限のIUnknown インタフェースを取得
hr = CoCreateInstance ( cid, NULL, CLSCTX_ALL, IID_IUnknown, (void **)&pUnknown );
// 更に実装しているインタフェース(IWebBrowser2)を探す
hr = pUnknown->QueryInterface ( IID_IWebBrowser2, (void **)&pBrowser );
// IE コンポーネントを表示させる
//pBrowser->put_Visible ( TRUE );
// URLへ移動
m_explorer.Navigate2 ( &vUrl, &vempty, &vempty, &pName, &vHeader );

// SAFEARRAYの削除
SafeArrayDestroy ( m_psa );
m_psa = NULL;

// オブジェクトの開放(参照カウンタを減らしてメモリを開放する)
pUnknown->Release ( );
pBrowser->Release ( );
// COM コンポーネントの利用終了
OleUninitialize ( );
return TRUE;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加