이 브라우저는 지원되지 않습니다.

사이트를 사용하여 브라우저를 업데이트해야 합니다.

최신 버전의 Internet Explorer를 업데이트하세요.

# import의 예외 메커니즘은 Visual C++ 에서 발생시키는 바꾸는 방법

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

175784
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
참고 Microsoft Visual C++ .NET 2002 및 Microsoft Visual C++ .NET 2003 Microsoft .NET Framework에서 제공하는 관리되는 코드 모델과 관리되지 않는 네이티브 Microsoft Windows 코드 모델을 모두 지원합니다. 이 문서에 나와 있는 정보는 관리되지 않는 Visual C++ 코드에만 적용됩니다.Visual C++ 2005 Microsoft .NET Framework에서 제공하는 관리되는 코드 모델과 관리되지 않는 네이티브 Microsoft Windows 코드 모델을 모두 지원합니다.
요약
클라이언트 응용 프로그램을 만들 때 # import 사용하여 예외를 개체의 메서드에 대한 래퍼 실패 HRESULT를 발견한 경우 _com_error 예외 클래스를 통해 처리 소개합니다. 이 메커니즘은 사용자 고유의 구현으로 바꿀 유효한 이유가 있을 수 있습니다.
추가 정보
두 가지 방법으로 # import 사용 및 실패한 HRESULTS에 대해 예외를 발생시키는 것이 없을 수 있습니다. 첫 번째 # import 문을 사용하여 raw_interfaces_only 절을 사용할 수 있습니다. 그러나 이것은 일부 # import 제공하는 래퍼 클래스의 장점은 부정합니다.

두 번째 방법은 다음 프로토타입 및 기본 구현이 _com_raise_error에 대한 고유한 구현을 제공하여 것입니다:
void __stdcall _com_raise_error(HRESULT hr, IErrorInfo* perrinfo = 0)   throw(_com_error);   void __stdcall   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo ) throw(_com_error)   {       throw _com_error(hr, perrinfo);   } 				
이 함수가 선언되었지만 COMDEF.H 파일에서 구현되지 않습니다. 링커가 있는 .OBJ 사용자 지정 구현을 제공할 경우 COMSUPP.LIB에서 가져오는 것이 아니라 사용하는. 방금 이를 쉽게 코드에 의해 대체될 수 있도록 _com_raise_error COMSUPP.LIB 자체 개체가 존재합니다.

아래 # import 프로그램의 예외 발생을 함수 구현은 예입니다.
참고: 현재 우리의 컴파일러 함수의 예외 사양은 무시하고 경고가 발생하는 경우를 보여 줍니다.
경고 C4290: C++ 예외 사양 무시됩니다.
C++ 따라 백서를 함수의 선언 있는 예외 사양이, 정의를 포함하여 모든 선언에 있는 경우에는 동일한 형식 ID 집합을 사용하여 예외 사양이 해당 함수의 가져야 합니다.
void __stdcall   _com_raise_error(HRESULT hr, IErrorInfo* perrinfo ) throw(_com_error)       {           //this message box is for demonstration purpose only          AfxMessageBox( "_com_raise_error (HRESULT, IErrorInfo*)" );           //your own error handling code or just an abort       }#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF" )       _bstr_t     bstrEmpty(L"");       _ConnectionPtr  Conn1 = NULL;       Conn1.CreateInstance( __uuidof( Connection ) );       Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty,0 ); 					
이 코드는 올바른 연결 정보를 제공하지 않고 ADO 연결 개체를 열려고 시도합니다. _com_raise_error 대체하여 해당 _com_error를 발생하는 것이 없습니다.

하지만 이 함수는 바꾼 방금 때문에 사용자가 여전히에 대한 예외를 잡아내는 할 수도 있습니다. 아래 코드 조각을 살펴보겠습니다.
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF" )    _ConnectionPtr  Conn1 = NULL;    // Conn1.CreateInstance( __uuidof( Connection ) );    Conn1->Open( bstrEmpty, bstrEmpty, bstrEmpty ,0); 				
Conn1 유효한 개체가 아닙니다. 이 경우 및 이 존재하지 않는 개체에 인터페이스 포인터가 호출되는 _com_raise_erro 결과, NULL입니다. 그러나 오버로드된 연산자-> 있는 컴파일러에서 다음 Win32 예외를 결과 Open() 메서드를 호출하는 할 null 인터페이스 메서드가 반환됩니다. 이 예외는 NULL Open() 호출하기 전에 먼저 테스트 Conn1 막을 수 있습니다.

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 175784 - 마지막 검토: 03/01/2014 15:28:31 - 수정: 5.0

  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • kbnosurvey kbarchive kbmt kbhowto kbdatabase kbinfo KB175784 KbMtko
피드백