error C2712: オブジェクト アンワインディングが必要な関数で__tryを使用できません。

このQ&Aのポイント
  • VC++の勉強中ですが、例外処理についてよくわかりません。VS2005で発生するerror C2712について、解決方法を教えてください。
  • 現在、C++のソースコードで__tryを使用していますが、オブジェクト アンワインディングが必要な関数内で使用できませんというエラーメッセージが表示されます。C++の例外を無効にせずに解決する方法について教えてください。
  • C++のソースコードでオブジェクト アンワインディングが必要な関数で__tryを使用するとエラーC2712が発生します。VS2005環境での問題であり、C++の例外を無効にせずに解決する方法について教えてください。
回答を見る
  • ベストアンサー

error C2712: オブジェクト アンワインディングが...について

VC++の勉強中です。例外処理に対してあまり詳しくないですが。 問題が発生しました。VS2005 の環境です。分かったかたは ご指摘お願いします。 今書いているソースには、 error C2712: オブジェクト アンワインディングが必要な関数内で __try を使用できません。というメッセージが出ていますが、今いろいろ調べています。Win32のAPIを使っているところ__try __leaveなどのSEHの機構の例外処理のやり方です。 これをプロパティ-C/C++-コード生成/C++の例外を無効にすると、問題が なく動くですが。 具体的に、どういう解決すればいいですが、C++の例外を無効にするわけに いけないし。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • norachlo
  • ベストアンサー率100% (10/10)
回答No.1

あまり正確なところは分かりませんが。 __try ブロックと同じ関数内でデストラクタが呼ばれる場合に そのエラーメッセージが出るようです。 「ブロック内」ではなく「関数内」なので、 以下のようにまとめて別関数とするだけで回避することができるようです。 void foo(){   Biz biz; // 必要なオブジェクトを別関数に   // 例外が起き得る処理 } int main(){   // デストラクタを回避するため   // この関数内にオブジェクトがあってはならない   __try {     foo();   }   __except(EXCEPTION_EXECUTE_HANDLER){     // ここから復帰を試みる場合の処理   }   return 0; } Windows API との関連は分かりませんでした。 以下のサイトも参考になさって下さい。

参考URL:
http://msdn.microsoft.com/ja-jp/library/xwtb73ad(VS.80).aspx

関連するQ&A

  • C++のtryとcatch

    C++で、例外処理としてtryがあるのですが、どういった使い方をするのでしょうか? それと、catchも使い方がわかりません。 どなたか教えてください。 よろしくお願いします。

  • phpの例外処理がエラーをトラップしてくれない。

    以下のように例外処理を記述しした場合、 try{ //ここでエラー } catch (Exception $e){ $ErrorMsg="その他エラー:".$e->getMessage(); } tryの中で、0除算によるエラーが発生してもエラーをトラップして、例外 処理のcatchに飛びません。 どのように記述すればエラーをトラップできるのでしょか?

    • ベストアンサー
    • PHP
  • 例外処理

    デバッグをしてみました。 すると,try・catch文までしか実行されていないことがわかりました。 public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } 例外処理について調べてはみたものの、なぜこの部分で実行が止まってしまうのか、 解決につながるようなことが,みつかりません。 1.例外処理はどのような処理なのか 2.なぜ、try・catchで実行が終了してしまうのか 教えてください。

    • ベストアンサー
    • Java
  • C++の例外処理

    お世話になります。 現在C++でプログラミングを行っていますが、例外処理で困っています。 次のようなコードを書きました。 try{   m_Session.DestroyDatabasePool();   }catch(CException e){   m_Share.WriteLogFile("キャッチ中", LOG_INFO ); } しかし、これだとcatchが行われず、catch(CException e)部分を(...)にすると例外処理が実行されます。 例外の詳細を知りたいので、どうしても(CException e)で行いたいです。 説明が不十分かもしれませんが、何かご存知でしたら、ご教授お願いします。

  • VS2013c#です。

    VS2013c#です。 今、環境変数からコンピューター名を取得する処理のテストを行っていたのですが、取得するところで、例外を発生させることが出来ません。 ------以下、コード------- string name; try {  // ここでエラー発生させてcatchに飛ばしたい name= Environment.MachineName; } catch(Exception ex) { …… } -----コード終了----- 机上確認なのでデバッグでcatchに飛ばすことが出来れば大丈夫です。 何か方法はありませんか? ご存知のかた宜しくお願い致します。

  • critical error c0000005

    Visual C++ 2012 でファイルにデータを書き込む処理を組んでみた所、アプリケーション側にて下記のエラーが出てきます。 [Application side] -- log --------- function 'FuncTest' call from dll 'Test.dll' critical error c0000005 at 77D3F44D. ---------------- Test.cpp内の※1をコメントアウトすると、取り敢えずはエラーは発生しないのですが、どこが間違っているのかがわかりません。 よろしくお願いします。 下記は、VC++のソース部分です。 [Source of C++] --- Test.h ----- #define Test_API __declspec(dllexport) Test_API void WINAPI FuncTest(void); ---------------- --- Test.cpp --- #include "stdafx.h" #include "Test.h" Test_API void WINAPI FuncTest(void) { HANDLE hFile = NULL; __try { _EXCEPTION_POINTERS ep = {NULL}; __try { CHAR filePath[MAX_PATH]; sprintf(filePath, "filename.csv"); hFile = CreateFileA(fileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); <--- (※1) if(hFile == INVALID_HANDLE_VALUE) throw; ...(snip) } __except (ep = *GetExceptionInformation(), EXCEPTION_EXECUTE_HANDLER) {) { PEXCEPTION_RECORD per = ep.ExceptionRecord; CHAR eBuff[1024]; sprintf_s(eBuff, 1024, "%d (code:%x flag:%x addr:%p params:%d)", err, eRec->ExceptionCode, eRec->ExceptionFlags, eRec->ExceptionAddress, eRec->NumberParameters); free(eRec); MessageBoxA(NULL, eBuff, "FuncTest Error!", MB_OK); } } __finally { CloseHandle(hFile); } } ---------------- --- Test.def --- LIBRARY Test EXPORTS FuncTest ----------------

  • fsockopenの例外について

    お世話になります。 現在、fsockopen関数を利用してソケット通信を行うシステムを開発しております。 上記、システムを利用する中で考えられる例外として「apacheが停止しているサーバーに通信を行った場合」というのを想定して、例外処理を作成しております。 例外処理をtry catchによって検知しようとしたのですが、try catchでは受け取れませんでした。 ソースは下記のとおりです。 $api_url = "http://localhost/webapp/test"; $api_arr = parse_url($api_url); try{ // ソケット通信開始 $fp = fsockopen($api_arr["host"], 80, $errno, $errstr, 30 ); }catch(ErrorException $e){ echo "Error - failed to connect to the API - ".$e->getMessage(); exit; }catch(Exception $e){ echo "hoge2"; } 上記、ソースをunixのコマンドから実行した場合に出力されたエラーは下記のとおりです。 Error: fsockopen(): unable to connect to localhost:80 (Connection refused) もし、お分かりになる方がおられましたら、ご教示お願い致します。

    • 締切済み
    • PHP
  • C++ビルドエラー

    VC++6.0コードを変更をしないでVS 2008 C++(Professional Edtion)でビルドするとコンパイルはパスしますが、2件のワーニングがでます。 Win VistaでVS 2008 SP1のコンディションです。 アドバイスをくれませんか? 1. warning C4996: 'CWinApp::Enable3dControlsStatic': CWinApp::Enable3dControlsStatic is no longer needed. You should remove this call.   #ifdef _AFXDLL Enable3dControls();   #else Enable3dControlsStatic();   #endif c:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afxwin.h(4821) : 'CWinApp::Enable3dControlsStatic'の宣言を確認して ください。 >クラスに新しい定義が必要ですか? 2. warning C4244: '=' : 'ULONGLONG' から 'LONG' への変換です。データが失われる可能性があります。   LONG lSize = 0L; // ヘッダ部を読み込みます。 TRY { lSize = m_pCFile->Seek( 0L, CFile::end ); m_pCFile->SeekToBegin(); . . >修正がわかりません。 以上

  • 【C#/Java?】try-catchでcatchせずにfinallyは一般的?

    普段はJavaを使っているのですが、故あってC#のソースを簡易レビューすることになりました。 C#を始めてそれほど間もない人間の書いたソースなのですが、以下のようなソースをたびたびみかけます。 try {   // 処理 } finally {   // finally処理 } C#の場合、Javaとは異なり全ての例外はJavaで言うところの非チェック例外であると認識しています。(ただし、Javaの非チェック例外と同じ扱いをしていいとは思っていませんが……) 呼び出し元に起きうる全ての例外処理を任せるがfinally処理をしたいならば、このような書き方をするのが一般的なのでしょうか。 Javaの場合でもこのような書き方ができることは確認しましたが、Javaの場合は非チェック例外が起きる=バグであることがほとんどなので、このような書き方をする場面はあまりないように思います。 (もちろんチェック例外もthrowsを書けば同じように書くこともできるとは思いますが、自分ならやらないですし、そのようなソースを見たこともないです) ですので、単に自分がJavaを普段使っているからcatchがないことに違和感を感じるだけなのであれば、この問題はスルーしたいと思います。 C#経験者が周りにいない状況ですので、皆様のお知恵をおかりしたいと思います。よろしくお願いします。

  • C++の例外

    VS2005でtest.exe から test.dll(VC++)を呼んで、プログラムを作っています。 しかし、デバッグの時に、以下の例外が発生しました。 test.exe の 0x7c812a5b で初回の例外が発生しました: Microsoft C++ の例外: int (メモリの場所 0x00115820)。 以上の例外は、どういう意味でしょうか? メモリのアクセスのエラーでしょうか? test.dllプログラムの構造としては、以下のようになります。 char readrecordTemp[READ_SIZE + 1]; memset(readrecordTemp,0x00,sizeof(readrecordTemp)); char returncode1 = 0; char returncode2 = 0; try{ for(;;){ if (NULL == fgets(readrecordTemp,VT_MAX_READ_SIZE, m_fp)){ if (ferror(m_fp)){ throw ERROR_IO; } if (feof(m_fp)){ throw EOF; } } returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ]; returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ]; 。。。。 。。。。 } ファイルの最後になったら、自分が定義した例外で returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ]; returncode2 =readrecordTemp[strlen(readrecordTemp) -1 ]; などを飛ばしたいですが、デバッグの時に、 returncode1 =readrecordTemp[strlen(readrecordTemp) -2 ];のところで 以上の例外が出されました。どうすればいいですか?

専門家に質問してみよう