반응형
[COM 하수용] COM 서버의 실행 위치 (고수접근금지!)

[COM의 이해] 초 뒷북 자료~! 하수 열람가능
반응형
반응형

오늘은 export라는 키워드를 간단하게 소개하겠습니다. 

질문답변란에 올라온 질문에 대해서 찾다 보니 알게 된 내용입니다.

Template을 사용할 때는 함수의 구현 부분이 그 함수 앞에 있어야 합니다. 따라서 보통은 헤더 파일에 들어가게 되지요. [The C++ Programming Language] 책을 보니 export라는 키워드가 있는데 Visual C++에서는 지원을 하지 않습니다. export를 사용하면 컴파일러가 컴파일을 할 때 그 함수가 정의된 곳을 찾아서 알아서 잘 컴파일해야 한다고 합니다. (이거... 구현하기 귀찮겠네요. -_-;)

다음과 같이 사용하면 된다고 하니 참고하세요.

[out.h]

template< class T>  void out(const &T t);

[out.cpp]

#include < iostream> 
#include "out.h"

export template< class T>  void out(const &T t)
{ 
    std::cerr < <  t;
}

[user1.cpp]

#include "out.h"

// out() 함수를 잘 사용한다.

[user2.cpp]

#include "out.h"

// out() 함수를 잘 사용한다.


ps. 제가 자료실에 올린 "C++의 변경점"이라는 글을 보시면 export에 대한 좀 더 자세한 설명이 나옵니다. 그러나... 굳이 받아보실 분이 없을 것 같으니... 그 부분을 그냥 붙입니다.

export : 분할 Compilation과 template

C++ template 방식의 가장 커다란 문제점 중의 하나는 바로 separate compilation을 지원하지 않는 다는 점이었다. 물론 그 동안 C++ 컴파일러마다 각자 고유의 방식으로 언어를 확장하거나 또는 별도의 기법을 사용하여 이와 같은 문제점을 해결해 왔다. 그러나 표준화가 이루어지지 않은 확장은 template을 빈번히 사용하는 소프트웨어의 이식성 및 상품화에 커다란 제약이 아닐 수 없었다. 지금까지도 대부분의 template 코드는 inline 함수가 처리되는 방식과 거의 동일한 방식으로 제작되고 사용되어왔다. 그러므로 일반적으로 template 코드는 헤더 파일 내에 완전한 코드를 제공해야 하며 선언과 정의를 분할하지 않는 것이 통상적인 관례였다. 그러나 다음처럼 각기 다른 linkage 방식이 적합한 경우가 함께 공존하는 경우는 커다란 문제 거리가 아닐 수 없다.

// Thing.h
template< class T>
struct Thing {
    void veryShortCode();
    void veryLongCode();
};
template< class T>
inline
void Thing< T>::veryShortCode() {}
template< class T>
inline
void veryLongCode() { // really really long long 
code .... 
   whether you believe or not
} 

위와 같은 경우 Thing::veryLongCode()는 외부 파일에 정의되어 있고 컴파일러가 필요한 코드만 생성해서 분할 컴파일할 수 있다면 문제는 해결되는 것이다. 다소 늦은 감이 있으나 이제라도 그러한 기능이 추가되고 표준화되었으니 다행한 일이 아닐 수 없다. 표준 문서에 정의된 기능을 지원하는 컴파일러는 아직 본적이 없지만 새로이 추가된 export keyword가 이와 같은 역할을 하는 것으로 만일 분할 컴파일이 필요한 경우가 있다면 선언 또는 정의 시에 export라고 간단히 명시하기만 하면 된다(컴파일러 만드는 사람들은 간단하지 않겠지만) .

// Thing.h
...
template < class T> void veryLongCode(); 
// 또는 export template<  ....
// Thing.cpp
template< class T >
export veryLongCode { ... }  // 

이제 Thing class의 사용자는 단지 Thing.h만을 포함하면 되고 실제로 export된 veryLongCode의 정의를 읽어 필요한 code를 생성하여 후에 연결하는 작업은 컴파일러가 할일이다. 또한, 각각의 member를 일일이 export 또는 inline하는 것은 매우 불편한 작업이다. 때문에 이러한 경우 일단은 전체 class를 export하면 편리하다.

// Thing.h
export
template< class T>
struct Thing {
    void veryShortCode();
    void veryLongCode();
};

그러나 특정 member만이 inline되어야 할 경우에는 class 정의 밖에서 명시적으로 inline keyword를 붙여주거나 아예 class 내에서 code를 정의하면 된다. 이때 inline의 효과는 export를 무마하기 때문에 지정된 code만은 inline 방식으로 사용될 수 있다.

반응형
반응형

출처 : http://support.microsoft.com/kb/316375/ko

DOC: "MFC에 RichEdit 1.0 컨트롤 사용"에 대한 잘못된 설명서

기술 자료 ID : 316375
마지막 검토 : 2002년 4월 30일 화요일
수정 : 1.0
이 문서는 이전에 다음 ID로 출판되었음: KR316375

요약

Microsoft Visual Studio .NET 도움말 설명서의 "MFC에 RichEdit 1.0 컨트롤 사용" 항목이 다음과 같이 잘못 설명되어 있습니다.
RichEdit 컨트롤을 사용하려면 먼저 AfxInitRichEdit을 호출해야 합니다. Visual Studio .NET에서는 이 함수가 Visual C++ 6.0의 경우처럼 Riched32.dll을 로드하지 않고 항상 Riched20.dll 파일을 로드합니다. 

이전 RichEdit 1.0 컨트롤을 사용하려면 CWinApp::InitInstance에서 ::LoadLibrary("RICHED32.DLL")를 호출해야 합니다. 

현재 CRichEditCtrl 클래스와 이전의 RichEdit 1.0 컨트롤을 동시에 사용할 수도 있지만, CRichEditCtrl은 RichEdit 2.0 컨트롤만 지원하도록 디자인되었습니다. RichEdit 1.0과 RichEdit 2.0은 상당히 유사하기 때문에 대부분의 메서드가 작동하지만, 1.0 컨트롤과 2.0 컨트롤 간에는 몇 가지 차이점이 있으므로 일부 메서드가 작동하지 않거나 오작동할 수도 있습니다.
이 설명은 다음과 같은 내용으로 변경되어야 합니다.
RichEdit 컨트롤을 사용하려면 먼저 AfxInitRichEdit을 호출해야 합니다. 이 함수는 항상 Riched32.dll을 로드합니다. 

현재 CRichEditCtrl 클래스와 이전의 RichEdit 1.0 컨트롤을 동시에 사용할 수도 있지만 CRichEditCtrl은 RichEdit 2.0 컨트롤만 지원하도록 디자인되었습니다. RichEdit 1.0과 RichEdit 2.0은 상당히 유사하기 때문에 대부분의 메서드가 작동합니다. 그러나 버전 1.0 컨트롤과 2.0 컨트롤 간에는 몇 가지 차이점이 있으므로 일부 메서드가 작동하지 않거나 오작동할 수 있습니다. 

최신 RichEdit 2.0 또는 3.0 컨트롤을 사용하려면 AfxInitRichEdit2()를 호출해야 합니다. 기존 Visual C++ 응용 프로그램에 있는 RichEdit 컨트롤을 버전 2.0으로 업데이트하려면 .rc 파일을 텍스트로 연 다음 "RICHEDIT"의 각 RichEdit 컨트롤 클래스 이름을 "RichEdit20a"로 변경하십시오.

참조

자세한 내용은 다음 Microsoft Visual Studio .NET 도움말 설명서 항목을 참조하십시오. 참고: 이 링크는 Microsoft Visual Studio .NET 설명서가 컴퓨터에 설치된 경우에만 사용할 수 있습니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft Visual C++ .NET 2002 Standard Edition

위로 가기

키워드: 
kbmfc kbrichedit kbprb kbdocerr kbprod2web KB316375
반응형

'Tech > 프로그래밍' 카테고리의 다른 글

COM의 이해 관련 링크  (0) 2008.11.30
C++ template에서 export keyword(VS2008에서는 아직 미지원)  (0) 2008.11.28
간단 API Tip  (0) 2008.11.18
CPP Unit 관련 자료  (0) 2008.10.31
Win32 환경에서의 타이머 종류  (0) 2008.10.23
반응형
* Client에서 InitInstance()에 AfxOleInit(); 호출한다.
* CRichEditCtrl을 사용할 때 .NET에서는 AfxInitRichEdit() 호출한다

* API, MFC관련 엄청난 예제

* DialogBox 메시지 교환 
        UpdateData(FALSE); // 컨트롤에 멤버변수의 내용을 표시해준다 
        UpdateData(TRUE);  // 컨트롤 내용을 다이얼로그 클래스의 멤버변수로 저장 

* COM Server에서 MFC Dialog를 호출하려면 
   AFX_MANAGE_STATE(AfxGetStaticModuleState()) 를 호출 

아래는 Devpia에 있는 답변이다. (작성자: 석재헌님/dreamcot) -------------------------

기본적으로, MFC는 리소스 Template을 불러들이기 위해서 메인 어플리케이션의 리소스핸들을 이용합니다. 그러나 ,DLL에서, 다이얼로그를 생성하거나, DoModal등의 함수를 통해서 보여주기 위해서는 DLL의 리소스 핸들이 필요하기 때문에, MFC가 내부적으로 이용하는 리소스핸들을 메인 App의 리소스핸들이 아닌, DLL의 리소스 핸들로 바꾸어줄 필요가 있습니다.

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

DLL에서 다이얼로그를 생성하는 함수에 위의 한줄 코딩을 써주시기 바랍니다.

대부분의 DLL에서 MFC를 이용하여 UI관련 코드들 이용하는 경우 위의 함수가 필요합니다.

반응형
반응형
Refactoring(리팩토링 - 마틴파울러) p113의 '4장 테스트 만들기'를 읽어볼것

나는 코드를 개발할 때 테스트도 같이 작성한다. 그러나 다른 사람들과 리팩토링을 할 때는 종종 자체테스트 코드가 없는 프로그램을 다루기도 한다. 따라서 리팩토링을 하기 전에 먼저 자체 테스트 코드를 만들어야 한다.
 테스트에 대한 자바의 표준 관례는 main메소드를 테스트 하는 것이다. 이것은 모든 클래스가 클래스 자신을 테스트 하기 위한 main 메소드를 가지고 있어야 한다는 뜻이다. 합당한 관례이긴 하지만(큰 호응을 얻지는 못하고 있다.), 이상해질 수가 있다. 문제는 이 관례가 많은 테스트를 실행시키기 어렵게 한다는 것이다. 다른 접근 방법은 테스트가 쉬운 프레임워크내에서 별도의 테스트 클래스를 만드는 것이다.(예, JUnit 테스트 프레임워크)

  
1. CPP Unit을 Compile하고 Project 환경을 Setting한다.

2. TestRunner를 돌리는 TestCase를 만들어본다.


반응형

'Tech > 프로그래밍' 카테고리의 다른 글

"MFC에 RichEdit 1.0 컨트롤 사용"에 대한 잘못된 설명서  (0) 2008.11.19
간단 API Tip  (0) 2008.11.18
Win32 환경에서의 타이머 종류  (0) 2008.10.23
[Scrap] C++ ReplaceAll 함수  (0) 2008.09.17
HexToString code조각  (0) 2008.09.08
반응형

출처 : http://www.gpgstudy.com/gpgiki/시간%20다루기#header1

Ansi C의 time(), _ftime()

Ansi 표준 C 라이브러리의 함수들로, time()은 최소 1초 단위의 값을 돌려준다. 메인 루프 제어용으로는 부적합하나 게임 저장 날짜/시간의 기록 등에는 유용할 것임. _ftime()은 밀리초(1000분의 1초) 단위의 값을 돌려준다.

Win32 API의 timeGetTime() 함수

흔히 멀티미디어 타이머라고 하는 것으로, 윈도우즈가 시작된 이후 흐른 시스템 시간을 돌려준다. 단위는 밀리초. 기본 정밀도는 Win9x의 경우 1 밀리초, NT 패밀리의 경우 5 밀리초 이상이라고 함. 이정도면 _ftime()과 함께 게임에서 써먹을 수 있을 만한 함수.

타이머의 해상도는 timeGetDevCaps()와 timeBeginPeriod()로 조정할 수 있다.

Win32 API의 WM_TIMER 메시지

일정한 시간 주기로 발생하는 메시지. 주기의 최소 단위는 역시 밀리초 단위. 메시지 펌프에서 잡거나 SetTimer()를 이용해서 콜백 함수를 호출하게 만들 수 있음. 그러나 메시지의 우선 순위가 낮기 때문에 정확하지 못하다.

Win32 API의 GetTickCount() 함수

시스템 틱 카운트를 돌려주며, 단위는 밀리초. Win9x의 경우 기본 정밀도는 약 55 밀리초, NT 급은 10에서 16 정도... timeGetTime()보다 못함...

고해상도 타이머

하드웨어가 고해상도 타이머를 지원하는 경우라면 가장 좋은 선택으로, 매우 정밀한 시간을 얻을 수 있다. 얻을 수 있는 시간의 해상도는 하드웨어마다 다르나, 어쨌든 적어도 위에 나온 것들보다는 정밀하다고 함.

관련 함수(자세한 사항은 MSDN 참고)

둘 다 windows.h만 포함시키면 됨...

BOOL QueryPerformanceCounter(
  LARGE_INTEGER *lpPerformanceCount   // pointer to counter value
);

BOOL QueryPerformanceFrequency(
  LARGE_INTEGER *lpFrequency   // address of current frequency
);

고해상도 타이머의 해상도 및 지원 여부 알아내기

QueryPerformanceFrequency(&ticksPerSecond) 의 반환값이 0이 아니면 고해상도 타이머를 지원하는 것이다. 이 때 tickPerSecond에는 초 당 틱 수가 설정된다.

예:

  LARGE_INTEGER ticksPerSecond;
  if (!QueryPerformanceFrequency(&ticksPerSecond))
  {
    // 지원하지 않음
    return false;
  }

현재 시간 얻기

QueryPerformanceCounter(&ticks)를 호출하면 ticks에 성능 카운터 수(음.. 컴퓨터가 켜진 후 지나간 틱 수)가 설정된다.

이를 위에서 얻은 ticksPerSecond로 나누면 초 단위의 시간을 얻을 수 있다.

예:

  LARGE_INTEGER ticks;
  QueryPerformanceCounter(&ticks);

  float seconds =  ((float)ticks.QuadPart  / (float)ticksPerSecond.QuadPart;

지나간 시간 얻기

게임에서 실제로 필요한 것은 이전 프레임으로부터 흐른 시간인데, 그냥 현재 시간에서 이전 시간을 빼면 됨...

예:

float GetElapsedSeconds(unsigned long elapsedFrames = 1)
{
  static LARGE_INTEGER s_lastTime = m_startTime;
  LARGE_INTEGER currentTime;

  QueryPerformanceCounter(&currentTime);

  float seconds =  ((float)currentTime.QuadPart -
           (float)s_lastTime.QuadPart) / (float)m_ticksPerSecond.QuadPart;

  // reset the timer
  s_lastTime = currentTime;

  return seconds;
} // end GetElapsedSeconds()

QueryPerformanceCounter의 문제점

일부 메인보드/칩셋에서 시간이 건너뛴다는 보고가 있음.

RDTSC

인텔 펜티엄 계열 CPU에서 제공하는 어셈블리 명령이다. 펜티엄은 내부적으로 TSC(Time Stamp Counter)라는 64비트 카운터를 유지하는데 이 카운터의 값은 클럭 사이클마다 증가한다. RDTSC 명령은 내부 TSC 카운터의 값을 EDX와 EAX 레지스터에 복사하는 명령이다. 이 명령은 6~11 클럭을 소요한다. 고해상도 타이머가 이 명령을 이용해 구현되었다고 한다.

참고:

참고 자료

시간에 기반한 게임 갱신

고정 시간 간격

한 프레임에 걸리는 시간을 고정시키는 것. 간단히 말하면, 한 프레임에 걸리는 표준 목표 시간을 설정하고, 한 프레임에 걸린 시간이 그보다 작으면 남는 부분만큼 아무 일도 하지 않고 기다리는 것이다.

의사코드:

   게임 메인 루프  {
           현재시각을 얻는다.

       한 프레임 처리;

       흐른시간 = 현재시각 - 아까 얻은 현재시각

       만일 ( 흐른시간 < 목표시간) {
            (목표시간 - 흐른시간)만큼 쉰다. //예: Sleep(...);
    }

  • 장점: 시간 관리가 직관적이고 간편하다(시간 자체를 중심으로 바라볼 때). 또한 멀티미디어와의 시간 동기화가 편하다(애니메이션과 배경음악/대사를 일치시키는 등).
  • 단점: 한 프레임 처리에 걸린 시간이 목표시간보다 더 긴 경우 게임의 속도가 일정하지 않게 된다. 또한 최소 사양 이하의 컴퓨터라면 게임 전체가 느리게 돌아가게 된다.

가변 시간 간격

게임의 기능 및 객체들이 이전 프레임 이후 흐른 시간(이하 프레임 시간)에 기반해서 갱신되게 하는 것. 예를 들어 어떤 객체가 1초당 10미터를 수평 이동한다고 하면, 객체의 x 좌표는:

x = x + 10 * (프레임 시간)

이렇게 하면 프레임 시간에 상관없이(즉 CPU 속도나 기타 다른 요인과 독립적으로) 객체는 항상 초 당 10 미터의 속력을 가지게 된다.

  • 장점: 객체의 입장으로 바라볼 때 직관적. 게임을 실세계의 단위(미터, 초 등)에 기반해서 모델링할 때 크게 유용할 수 있다.
  • 단점(?): 모든 객체들의 갱신 방식을 시간에 기반한 함수로 생각할 수 있어야 한다. 3D라면 당연하지만 전통적인 2D 게임이라면 사고의 전환이 필요함...

더 읽을거리

반응형

'Tech > 프로그래밍' 카테고리의 다른 글

"MFC에 RichEdit 1.0 컨트롤 사용"에 대한 잘못된 설명서  (0) 2008.11.19
간단 API Tip  (0) 2008.11.18
CPP Unit 관련 자료  (0) 2008.10.31
[Scrap] C++ ReplaceAll 함수  (0) 2008.09.17
HexToString code조각  (0) 2008.09.08
반응형
1. iPhone 2007
    http://events.apple.com.edgesuite.net/j47d52oo/event/

2. Apple Special Event August 2007 Keynote Address

3. Apple March 6 Event

4. MAC WORLD 2008 Keynote Address
     Leopard, iPhone, iTunes, Apple TV, Mac Book Air
     http://www.apple.com/quicktime/qtv/mwsf08/
     
5. WWDC 2008 Keynote 
     iPhone 3G 발표
     http://events.apple.com.edgesuite.net/0806wdt546x/event/index.html
6. Apple Special Event September 2008
    New IPod Nano, iPod Touch 발표

7. Apple Special Event October 2008
    Notebook, Macbook Pro new


Apple홈페이지에서 찾아가려면 
1. http:/./www.apple.com 접속
2. Download클릭
3. 화면 한가운데 QuickTime 클릭
4. 왼쪽 메뉴에 QuickTime Guide 클릭
5. 상단 메뉴의  Apple Events 클릭
(여기에 올라와있지 않은 동영상을 찾는 법은 모르겠음)

iPhone 2007 발표때의 동영상은 링크가 다 깨진 것 같다. 
얼마전까지만 해도 들어갈 수 있었는데 갑자기 들어가지지가 않는다.
이제는 기존의 발표들은 볼 수 없는 것 같다.
반응형
반응형

“고단한 SW개발자 생태계, 그래도 희망은 있다”

“웹기반SW 쓰지마”…리처드 스톨만, 클라우드컴퓨팅에 직격탄

“SW가 토목경제보다 고용효과 크다”
반응형
반응형
Finder에서 사과 +  K를 누르면 서버에 연결창이 뜬다. 삼바로 주소를 연결한다.
smb://localhost 등

반응형
반응형
반응형

+ Recent posts