90 likes | 212 Views
Q/A. 실습 내용에서 , HRESULT 이외의 리턴값을 받는 방법은 ? 인자를 [out] long* 로 지정하면 됨 HRESULT 만을 리턴할 수 있다면 왜 AddRef() 는 ULONG 을 리턴하는가 ? IUnknown 은 local 인터페이스이기 때문. Q/A. Windows 에서 사용되는 스트링들 tcs (t-character string) : TCHAR* wcs (wide-character string) : WCHAR*
E N D
Q/A • 실습 내용에서, HRESULT 이외의 리턴값을 받는 방법은? • 인자를 [out] long* 로 지정하면 됨 • HRESULT 만을 리턴할 수 있다면 왜 AddRef()는 ULONG을 리턴하는가? • IUnknown은 local 인터페이스이기 때문
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
DLL 사용법 • Import-Library를 사용하는 방법 • DLL을 생성할 때 함께 생기는 LIB 파일 • LIB에 구현된 함수의 내용은 없고 DLL에 있는 진짜 함수를 호출하는 역할만 함 • DLL은 실행 시에 로드됨 • LoadLibrary를 사용하는 방법 • 동적으로 DLL을 로드함 • GetProcAddress로 사용할 모든 함수 주소를 얻어와야 함
캐스팅 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"); } }; :
캐스팅 (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 );
캐스팅 (cont’d) • 결과 IB::DoB() IA::DoA() IB::DoB() IAB::DoAB() IA::DoA() IA::DoA() IB::DoB() 00430EB0 00430EB0 00430EB4 00430EB0 00430EB4
캐스팅 (cont’d) pB DoA DoB pAB DoAB pA IAB 객체의v-table pB2 v-table pointer pAB2
캐스팅 (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;
캐스팅 (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 ) );