質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2297閲覧

C++でHTTPWebリクエスト行った際の例外に対する解決策を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/05/13 23:01

編集2020/05/13 23:15

前提・実現したいこと

C++で、Web-APIにリクエストを行い、XMLを取得するコードを書いています。
テストしたところ、たまに例外が発生しますので、解決策を教えてください。

発生している問題・エラーメッセージ

下記コードhr = pHttp->send();を実行した際に、例外が発生し、 Unknown Error 0x80072EE7というメッセージが出ることがあります。 このURLにしたら必ず出るというものではなく、突然発生します。 1回目よりも何回か連続でリクエストをするとなりやすいです。 例外が発生した後、再度同じリクエストをすると成功します。

該当のソースコード

c++

1//関数を呼び出す前 2    CoInitialize(NULL); 3 4//以下、関数の内容 5 MSXML2::IXMLDOMDocumentPtr pDoc; 6 MSXML2::IServerXMLHTTPRequestPtr pHttp; 7 CString req;//リクエストURL 8/* 9この間に、リクエストURL作成し、reqに代入する。 10*/ 11 12 13 BOOL wj = FALSE; 14 try{ 15 // HTTPRequestに対するCreateInstance 16 hr = pHttp.CreateInstance(__uuidof(ServerXMLHTTP40)); 17 if( FAILED(hr) ){ 18 pDoc = NULL; 19 20 return -1; 21 } 22 23 VARIANT vAsync; 24 vAsync.vt = VT_BOOL; 25 vAsync.boolVal = FALSE; 26 27 // HTTPリクエストの作成 28 pHttp->open(L"GET", _bstr_t(req), vAsync); 29 30 wj = TRUE; 31 // Webサーバーへのリクエスト送信 32 /*このsend関数を呼び出した際に例外発生します。*/ 33 hr = pHttp->send(); 34 if( FAILED(hr) ){ 35 pDoc = NULL; 36 pHttp->abort(); 37 return -1; 38 } 39 // サーバーからの応答 40 st = pHttp->status; 41 if( st != 200 ){ 42 pDoc = NULL; 43 pHttp->abort(); 44     return -1; 45 } 46 47 wj = FALSE; 48 49 // 初期処理 50 //XmlIniz(pDoc); 51 hr = ::CoCreateInstance(__uuidof(DOMDocument40), NULL, CLSCTX_INPROC_SERVER, MSXML2::IID_IXMLDOMDocument, (VOID **)&pDoc); 52 if( hr == S_OK ){ 53 pDoc->put_async(VARIANT_FALSE); 54 pDoc->put_validateOnParse(VARIANT_FALSE); 55 pDoc->put_resolveExternals(VARIANT_FALSE); 56 }else{ 57 pDoc=NULL; 58 pHttp->abort(); 59 return -1; 60 } 61 // レスポンスデータの取得 62 pDoc = pHttp->responseXML; 63 if( FAILED(pDoc) ){ 64 pDoc = NULL; 65 pHttp->abort(); 66 return -1; 67 } 68 }catch(_com_error &e){ 69 pDoc = NULL; 70 pHttp->abort(); 71 CString em = (LPCTSTR)e.Description().GetBSTR(); 72 if (em.IsEmpty()) 73 em = e.ErrorMessage(); 74/*ここで出てくるemの中身をチェックするとUnknown Error */ 75 int fin = (wj == TRUE) ? -10 : -1; 76 return fin; 77 } 78 79 pHttp->abort(); 80/*ここで、取得されたXMLの解析作業*/ 81  pDoc=NULL; 82 return 0; 83 84//関数はここまで 85//関数を抜けた後 86    CoUninitialize(); 87

試したこと

IServerXMLHTTPRequestPtrをIXMLHTTPRequestPtrに、tryのすぐ下の行を
hr = pHttp.CreateInstance(__uuidof(ServerXMLHTTP40));
から
hr = pHttp.CreateInstance(__uuidof(XMLHTTP40));
に変更したところ、同じところで例外が発生し、指定されたリソースが見つかりません
というエラーメッセージが出ました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

CoInitializeとCoUninitializeを繰り返すと良くないという内容の記事が引っかかりましたが、試しにプロセスの起動と終了時だけにしてみてはどうでしょう。

NakamuraYoichiのblog

Microsoft does not recommend that you call CoInitialize and CoUninitialize pairs repeatedly in a multithreaded apartment (MTA). After the multithreaded apartment is created, Microsoft recommends that you keep the multithreaded apartment initialized until you exit the process.

投稿2020/05/14 00:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/14 05:12

回答ありがとうございます。1度試してみます。
退会済みユーザー

退会済みユーザー

2020/05/15 00:13

conitializeをコンストラクタに、couninitializeをデストラクタに移動させましたが、やはり同じ例外が発生してしまいます。
退会済みユーザー

退会済みユーザー

2020/05/15 01:17

エラーコードやメッセージで、同じ事例が無いか調べてみるしかないですね。 https://stackoverrun.com/ja/q/3131954 あとは、最悪別のライブラリを探してみるとか。
guest

0

ベストアンサー

IServerXMLHTTPRequestPtrをIXMLHTTPRequestPtrに、tryのすぐ下の行を
hr = pHttp.CreateInstance(uuidof(ServerXMLHTTP40)); にしたところ、例外の発生が止まりました。

投稿2020/05/17 23:05

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問