:Win95でWININETが変 – プログラミング – Home

通知
すべてクリア

[解決済] :Win95でWININETが変


打破
 打破
(@打破)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

いつもVC++ラウンジを見ていますが、
初めて質問します。

HTTPで、アパッチサーバのPHPプログラムにPOSTリクエストを送ろうとしていますが、
WIN95では、2回目のPOSTのときに失敗します。原因がわからなくて困っています。
※私にはMFC/WIN95のバグのように見えるんですが、、、、

以下にソースを載せますので、お知恵を貸してください。
なにか間違いがあれば教えてください。

環境は、WIN95、VC++6.0、MFC使用です。
ちなみに同一ソースで、XPHomeEditionだと、VC++6.0、VC.net どちらでも
問題ありません。

例外が発生するのは、CInternetFile::WriteString()の中で、
CInternetException::dwError = 12019 で、意味は分かりません。
CInternetException::ReportError() の結果は、「メッセージはありません」です。

デバッガで、MFCの中まで入っていくと、...\Vc98\Mfc\Src\Inet.cpp の
void CInternetFile::Write(const void* lpBuf, UINT nCount)関数の
1098行目
if (!InternetWriteFile(m_hFile, lpBuf, nCount, &dwBytes))
AfxThrowInternetException(m_dwContext);
で、例外が発生しています。

ここよりソース
<HTTPクラス>
SMhttpSvr::SMhttpSvr()
{
m_pSession = NULL;
m_pHttp = NULL;
m_httpFile = NULL;
m_bEstablished = false;
}

SMhttpSvr::~SMhttpSvr()
{}

bool SMhttpSvr::NavigateP(LPCTSTR pszMethod, LPCTSTR pszSvr, LPCTSTR pszUrl,
LPCTSTR pszHdr,
LPCTSTR pszBody, CString &strResp)
{
try {
m_httpFile = m_pHttp->OpenRequest(pszMethod, pszUrl);
}
catch (CInternetException* exp) {
略 exp->ReportError();
return false;
}

BOOL bStatus;
bStatus = m_httpFile->AddRequestHeaders(pszHdr);
if (!bStatus) {
         略
return false;
}

try {
DWORD dwLen = (DWORD)lstrlen(pszBody);
bStatus = m_httpFile->SendRequestEx((DWORD)lstrlen(pszBody),
HSR_INITIATE, 1);
if (!bStatus) {
return false;
}
}
catch (CInternetException* ex) {
ex->ReportError();
ex->Delete();
}
try {
m_httpFile->WriteString(pszBody); // KOKO※
}
catch (CInternetException* ex) {
ex->GetErrorMessage(szErr, 1023, NULL);
CString strMsg;
strMsg.Format(Failed WriteString dwError=[%ld] dwContext=[%
ld] MSG:%s,
ex->m_dwError, ex->m_dwContext, szErr);
AfxMessageBox(strMsg);
ex->ReportError();
ex->Delete();
return false;
}
try {
bStatus = m_httpFile->EndRequest();
if (!bStatus) {
return false;
}
}
catch (CInternetException* ex) {
return false;
}
CString strLine = ";
strResp = ";
while(1) {
if (!m_httpFile->ReadString(strLine)) {
break;
}
if (strLine.GetLength() > 0L) {
strResp += strLine;
}
strLine = ";
}
m_httpFile->Close();
delete m_httpFile;
m_httpFile = NULL;
return true;
}

void SMhttpSvr::NavigateClose()
{
if (m_bEstablished) {
if (m_pHttp) {
m_pHttp->Close();
delete m_pHttp;
}
if (m_pSession) {
m_pSession->Close();
delete m_pSession;
}
m_bEstablished = false;
}
}

void SMhttpSvr::NavigateOpen(LPCTSTR pszSvr)
{
if (!m_bEstablished) {
m_pSession = new CInternetSession;
try {
m_pHttp = m_pSession->GetHttpConnection(pszSvr);
}
catch (CInternetException* exp) {
return;
}
m_bEstablished = true;
}
}

<ここから呼び側>2回目のNavigatePでこける。
void CHTestDlg::SimpleTest()
{
CString strSvr = www.hoge.co.jp;
CString strUrl = ~hoge_admin/hoge/hogehoge.php;
CString strBody = ACTION=REMIND&LOGINID=myloginid;
CString strMethod = POST;
CString strHdr = Content-Type: application/x-www-form-urlencoded;
CString strResp = ";

SMhttpSvr* http = new SMhttpSvr();
bool bReturn = false;
http->NavigateOpen(strSvr);
bReturn = http->NavigateP(strMethod, strSvr, strUrl, strHdr, strBody,
strResp);
bReturn = http->NavigateP(strMethod, strSvr, strUrl, strHdr, strBody,
strResp);
http->NavigateClose();
delete http;
}

以上 よろしく


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

> WIN95では、2回目のPOSTのときに失敗します。原因がわからなくて困っています。
> ※私にはMFC/WIN95のバグのように見えるんですが、、、、

Win95ではTCP/IP関係の修正パッチがあったと思いますが、
ソレはあてていますか?
また、MFC内部で使用されているWinSockがVer2以降の場合も
アウトだったと思いますが…
(WinSockのVer2がインストールできないんだったかな?<ちょっとうろ覚え)

> 例外が発生するのは、CInternetFile::WriteString()の中で、
> CInternetException::dwError = 12019 で、意味は分かりません。
> CInternetException::ReportError() の結果は、「メッセージはありません」です。

Error LookupでモジュールにWININET.DLLを追加して調べてみました。
エラーメッセージは「要求された処理に対して、ハンドルは状態が正しくありません。」だそう
です。

# MFCはいぢったコトがないし、InternetAPIも使ったコトはないですが…


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

http://www.google.co.jp/search?q=Windows+95+WinSock+2.0&ie=UTF-8&oe=UTF-
8&hl=ja&lr=lang_ja

う~ん…
ちょっと違ったようです……
パッチとしてDL可能…のようです。>WinSock2.0
どこかで問題起こすとか見たような気もしますが。

あとは……WININET.DLLのバージョンに依存する可能性くらいでしょうか…


返信引用
打破
 打破
(@打破)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

瀬戸っぷ 様
いろいろ調べていただきありがとうございます。
まだ、パッチを入手できていませんが、教えていただいたサイトを
中心に探してみます。
本件は、私が書いたソース部分の問題ではなさそうと判断し、
VC++関連問題を扱う本サイトでの課題としては「解決」とします。
※当方としては、方式、適用機種を含め見直します。

甘えついでに最後のお願いがあります。

>> 例外が発生するのは、CInternetFile::WriteString()の中で、
>> CInternetException::dwError = 12019 で、意味は分かりません。
>> CInternetException::ReportError() の結果は、「メッセージはありません」です。

>Error LookupでモジュールにWININET.DLLを追加して調べてみました。
>エラーメッセージは「要求された処理に対して、ハンドルは状態が正しくありませ
ん。」だそうです。

Error Lookupというのは、具体的にどう動かすのかですか?
よろしかったら教えてください。(これもVC++課題ではないですが、、)


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

> Error Lookupというのは、具体的にどう動かすのかですか?
> よろしかったら教えてください。(これもVC++課題ではないですが、、)

VCの付属ツールなので…一応問題無いと思いますが。
(VC++.Netにも付属しているかと思いますが、そちらの方は不明です。)
[スタート]-[プログラム]-[Microsoft Visual Studio 6.0]-[Microsoft Visual Studio
6.0 ツール]-[Error Lookup]で
起動します。(入っていない場合はインストして下さい。)
「値」のエディトボックスにGetLastError()で取得した値を入力して[検索]ボタンを押すと、
エラーメッセージが表示されます。
FormatMessage()APIでエラーメッセージを取得するのと同じコトができます。
表示されない場合は、関連するDLLを[モジュール]から追加する必要があります。

CInternetException::m_dwErrorの説明を見ると判りますが、
エラーコードに対応するものがWINERROR.HまたはWININET.Hに記述されているはずです。
今回の場合はWININET.Hに記述されていますが、値がそのまま記述されていないのでGrepしても
見つかりません。
WININET.Hの場合InternetAPIを使用するコトになりますので、
モジュールにはWININET.DLLを追加する必要があります。

ちなみにWININET.Hでは…
#define INTERNET_ERROR_BASE 12000
#define ERROR_INTERNET_INCORRECT_HANDLE_STATE (INTERNET_ERROR_BASE + 19)
となっています。


返信引用
打破
 打破
(@打破)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

瀬戸っぷ 様

打破です。重ね重ねありがとうございました。

>VCの付属ツールなので…一応問題無いと思いますが。
>(VC++.Netにも付属しているかと思いますが、そちらの方は不明です。)
>[スタート]-[プログラム]-[Microsoft Visual Studio 6.0]-[Microsoft Visual Studio
>6.0 ツール]-[Error Lookup]で
>起動します。(入っていない場合はインストして下さい。)

成功しました。漫然とVC++を使っていたのでこういうツールがあることに
いままで気がつきませんでした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました