1 / 9

Q/A

Q/A. 실습 내용에서 , HRESULT 이외의 리턴값을 받는 방법은 ? 인자를 [out] long* 로 지정하면 됨 HRESULT 만을 리턴할 수 있다면 왜 AddRef() 는 ULONG 을 리턴하는가 ? IUnknown 은 local 인터페이스이기 때문. Q/A. Windows 에서 사용되는 스트링들 tcs (t-character string) : TCHAR* wcs (wide-character string) : WCHAR*

cisco
Download Presentation

Q/A

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Q/A • 실습 내용에서, HRESULT 이외의 리턴값을 받는 방법은? • 인자를 [out] long* 로 지정하면 됨 • HRESULT 만을 리턴할 수 있다면 왜 AddRef()는 ULONG을 리턴하는가? • IUnknown은 local 인터페이스이기 때문

  2. Q/A • Windows에서 사용되는 스트링들 • tcs (t-character string) : TCHAR* • wcs (wide-character string) : WCHAR* • mbs (multi-byte character string) : char* strlen( “阿Q” ) == 3 && wcslen( L“阿Q” ) == 2 MessageBoxA vs MessageBoxW • 참조 • 플랫폼 SDK \ Windows Base Services \International Features \ Unicode • VC++ Documentation \ Using VC++ \VC++ Programmer’s Guide \ RTL Ref \RTL Routines by Category \ Internationalization

  3. DLL 사용법 • Import-Library를 사용하는 방법 • DLL을 생성할 때 함께 생기는 LIB 파일 • LIB에 구현된 함수의 내용은 없고 DLL에 있는 진짜 함수를 호출하는 역할만 함 • DLL은 실행 시에 로드됨 • LoadLibrary를 사용하는 방법 • 동적으로 DLL을 로드함 • GetProcAddress로 사용할 모든 함수 주소를 얻어와야 함

  4. 캐스팅 struct IA { virtual void DoA() { printf("IA::DoA()\n"); } }; struct IB { virtual void DoB() { printf("IB::DoB()\n"); } }; struct IAB : public IA, public IB { virtual void DoAB() { printf("IAB::DoAB()\n"); } }; :

  5. 캐스팅 (cont’d) IA* pA; IB* pB; IAB* pAB; IB* pB2; IAB* pAB2; pB = new IAB; pB->DoB(); pAB = (IAB*)pB; pAB->DoA(); pAB->DoB(); pA = (IA*)pAB; pA->DoA(); pB2 = (IB*)pA; pB2->DoB(); pAB2 = (IAB*)(void*)pB; pAB2->DoA(); printf("%p %p %p %p %p\n", pA, pAB, pB, pB2, pAB2 );

  6. 캐스팅 (cont’d) • 결과 IB::DoB() IA::DoA() IB::DoB() IAB::DoAB() IA::DoA() IA::DoA() IB::DoB() 00430EB0 00430EB0 00430EB4 00430EB0 00430EB4

  7. 캐스팅 (cont’d) pB DoA DoB pAB DoAB pA IAB 객체의v-table pB2 v-table pointer pAB2

  8. 캐스팅 (cont’d) • 새로운 c++ 캐스팅 연산자들 • pB = dynamic_cast<IB*>(new IAB); • 실제로 해당되는 타입인가 비교 • RTTI (Run-Time Type Information)이 있어야 함 • 실시간에 bad_cast 예외를 발생 • MFC의 ASSERT_KINDOF 매크로와 유사 • pAB = static_cast<IAB*>(pB); • 변환하는 클래스 간에 계층 관계가 있어야 함 • 관계 없는 클래스 간의 변환은 컴파일 에러 • pAB = (IAB*)pB; pB = (IB*)pAB;

  9. 캐스팅 (cont’d) • IA* pA = const_cast<IA*>(new const IA); • const, volatile 등을 떼어 냄 • const int* pA; int* pA2 = (int*)pA; • pA = reinterpret_cast<IA*>(pB); • 아무 관계도 없음. 단지 값 만을 복사 • pAB2 = (IAB*)(void*)pB; • pA = (IA*) 100; • const int* pA; int* pA2 = reinterpret_cast<int*>( reinterpret_cast<long>( pA ) );

More Related