블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

class에서 다중 상속을 받게 될 경우 그 부모의 함수를 호출하는데 부모 클래스의 이름이 필요하다.

이때 해당 클래스의 이름을 적지 않아도 __super 라는 키워드를 이용해 부모클래스를 찾아 해당

함수를 호출하도록 할 수 있다. 아래는 MSDN에 수록된 __super 의 사용 예다.

// deriv_super.cpp
// compile with: /c
struct B1 {
  void mf(int) {}
};

struct B2 {
  void mf(short) {}

  void mf(char) {}
};

struct D : B1, B2 {
  void mf(short) {
     __super::mf(1);   // Calls B1::mf(int)
     __super::mf('s');   // Calls B2::mf(char)
  }
};



반응형

'Programming > C/C++' 카테고리의 다른 글

TCHAR printf  (0) 2010.07.12
A * pA = new B 과 B * pB = new B의 차이점.  (0) 2010.06.21
[펌] assert 문 사용하기  (0) 2010.05.13
[펌] try-catch 예외처리 비용?  (0) 2010.05.13
[펌] 순수 가상 소멸자  (2) 2010.05.06
Posted by blueasa
, |

예전에는 Visual Studio 6.0으로 만든 프로그램의 경우...

필요한 dll을 (가령 MFC60.dll 같은..) 실행 프로그램과 같은 폴더에 두면 잘만 돌아갔는데..

MFC8.0을 비롯한 Visual Studio 2005 에서 만든 녀석은 이런 방법으로는 정상적으로 실행되지 않는다.

그래서 찾아봤더니 다음과 같은 내용이 있다.. 참고하도록 하자 ㅋㅋ

http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary

http://www.codeproject.com/cpp/vcredists_x86.asp


출처 : http://sonic.tistory.com/entry/아융-Visual-C-2005-으로-만든-프로그램-배포시에
반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |
 
뭐 볼게없나..하고 둘러보다가 우연히 받게돼서..
 
꽤 재미있게 본 영화..
 
일본영화 다운 소소한 위트와 노래들이 마음에 든다.
 
그 중 제일 맘에 들었던 유코(Hiroko Yakushimaru)가 부른 Oh My Little Girl 이 마음에 든다.
 
원곡은 그닥..
 
히로코 목소리 좋구나 =ㅅ=
 
'사이보그 그녀'를 재미있게 본 사람이라면 좋아할 듯..
반응형
Posted by blueasa
, |

세가지의 라이브러리나 어셈블리를 혼합해서 사용 할 경우 기본 셋팅으로는 디버깅 시 C++  라이브러리 쪽으로 진입이 불가능 하다.

C# 프로젝트 속성 -> 디버그 탭 -> 디버거 사용 -> '비관리 코드 디버깅 사용'

C++ 프로젝트 속성 -> 디버깅 -> 디버거 형식 -> '혼합'

으로 수정 해준다.

반응형
Posted by blueasa
, |

좀 긴가민가했던 .NET core 관련 내용을 정리하다가, 올바른 unmanaged 리소스 청소법을 위한 '지저분하기 짝이 없는, 그러나 반드시 알아야 하는' Finalize, IDisposable에 다다랐는데, 흥미롭게도 C# 쪽 pattern과 C++/CLI 쪽 pattern이 (적어도 표면 상으로는) 완연히 다르다는 사실을 발견.
본 사항은 정상적 application 구현을 위해서는 반드시 숙지해야 할 내용인데, 언어 별로 그리도 달라서야 원. 게다가, C++/CLI 쪽 MSDN 설명은 뭔가 하나 빠진 듯 하여 다 읽고 나서도 제대로 이해가 가질 않는다. 언어 별로 따로 익혀야 하는 것도 거시기한데, 설명이라도 제대로 해야지.

먼저, C#쪽 pattern. MSDN에 떡하니 올라와 있는 정형화된 pattern이다.

// 기반 클래스에서의 구현 pattern
public class Base: IDisposable
{
  
public void Dispose()
   {
    
 Dispose(true);


  // GC가 Finalize 호출하지 않도록 (중복호출 배제)

      GC.SuppressFinalize(this);
   }
 

   // disposing 플래그를 통해 Finalize에서 managed 리소스

   // 정리하지 않도록(해당 리소스는 GC 정리할 것임)

   protected virtual void Dispose(bool disposing)
   {
     
if (disposing)
      {
        
// Managed 리소스 정리
      }
     
// Unmanaged 리소스 정리
   }

  
// C# 소멸자. Finalize 메서드임
   ~Base()
   {
     
// 단순히 Dispose(false).
      Dispose (
false);
   }
}
// 파생 클래스에서의 구현 pattern
public class Derived: Base
{  
  
protected override void Dispose(bool disposing)
   {
     
if (disposing)
      {
        
// managed 리소스의 정리
      }
     
// Unmanaged 리소스 정리

      // 부모 개체의 리소스를 정리하도록

      base.Dispose(disposing);
   }
  
// 파생 클래스에서는 소멸자 정의를 하지 않음(부모 소멸자

   // 에서 재정의된 Dispose 호출할 것이므로)

}

암만 봐도 복잡하기 짝이 없는 패턴. 하지만 이보다 더 단순한 패턴을 내 머리로 만들어낼 궁리는 안한다(나올 가능성도 거의 없겠지만). 다음은 상기 사항에 대한 C++/CLI 쪽 pattern. 이 역시 MSDN에 명시된 내용이다.

ref class A {
   // Dispose() 해당하는 소멸자. delete를 통해 명시적 호출 가능.

   // Native C++ 가상 소멸자와 동일한 행동 양식

     // (스택 기반 semantic 개체 생성 , 자동 호출됨)

   ~A() {
      // managed 리소스 제거

        // ...

      // finalizer 통한 unmanaged 리소스 제거
      this->!A();

   }

   // Finalize에 해당하는 Finalizer
   !A() {

 // unmanaged 리소스 제거

   }
};

MSDN에는 몇몇 설명으로 위 C++/CLI의 패턴을 설명하다 마무리 짓는데, 상당히 난감해진다. 패턴은 왜 달라지는지, 달라지면서 없어진 GC.SupressFinalize(), Dispose(bool)은 어디로 갔는지 등에 대한 설명은 없거나 부실하다. 게다가 파생 클래스에 대한 언급은 아예 없어 과연 위 내용이 올바른 내용인가하는 의심까지 들 정도.

다음은 위 패턴에 대한 MSDN에 없는 내용으로서, 이와 같은 의문을 해소할 key가 되는 사항이다(C++/CLI의 기본 개념에 대해서는 MSDN 및 C++/CLI 소개글(번역문 링크) 참조).
1. C++/CLI에서의 소멸자는 virtual 키워드가 없더라도 무조건 가상 함수이다.

2. finalizer의 가시성 범위는 accessor가 있건 없건 private이다.

3. destructor와 finalizer가 IDisposable::DisposeFinalize()를 완전 대체하지는 않는다. 컴파일러는 IL 코드 내에 Dispose()Finalize()를 따로 삽입하며, 각기 내부에서 destructor와 finalizer를 적절히 호출한다.

4. destructor가 호출되면 finalizer는 호출되지 않는다. 이는 IL 코드 내 Dispose() 구현에서 GC.SupressFinalizer()를 호출하기 때문이다.

5. 위 코드를 기반으로 한 컴파일된 IL 코드는 C# 버전과 거의 흡사하다(Dispose(bool)을 통한 파생 클래스에서의 리소스 정리 등).

6. 위와 같은 내용을 기반으로, 파생 클래스에서 역시 위 패턴과 동일하게 작성하면 된다(destructor 또는 Finalizer 등에서 base 클래스의 destructor/finalizer 명시적 호출 등 부가적 행동 불필요).
위의 결론은 김형준님의 C++/CLI의 Dispose Pattern에 대한 고찰과 유사한 실험 및 생성된 IL 코드 분석을 통해 이루어졌다.

반응형
Posted by blueasa
, |
obj
error LNK2019:
__imp__
@16 외부 기호
(참조 위치:
@4 함수)에서 확인하지 못했습니다.

위와 같은 에러가 나면 소스에 다음을 첨가하세욤~ ㅎㅎ

#pragma comment(lib, "user32.lib")


반응형

'Programming > C++/CLI' 카테고리의 다른 글

C# + CLI + C++ 혼합 디버깅  (0) 2010.06.01
C#과 C++/CLI의 Finalize, IDisposable Pattern 차이  (1) 2010.06.01
C#에서 Native C++ 프로젝트 사용하기  (0) 2010.05.31
마샬링(Marshaling)  (0) 2010.05.27
System::String 관련  (0) 2010.05.26
Posted by blueasa
, |

Wrapping을 이용해 C#에서 Native C++ 프로젝트 사용하기

 

Lib 프로젝트 생성

Native C++에 해당하며, 실제 프로그램 로직등은 이곳에 속해있다.

간단하게 Framework 클래스를 만들어보자.

 

  1. class CFramework
    {
    public:
            void Create( HWND hwnd )
            { 
                    // 핸들을 받아 D3D 디바이스 생성
            }
    };

 

DLL 프로젝트 생성

프로젝트 속성에서 공용 언어 런타임 지원을(/clr) 설정해준다.

위에 작성한 프로젝트를 빌드 후 나오는 Lib 파일을 불러오고, 헤더를 추가해준다.

랩핑 클래스를 작성하고, 랩핑할 클래스의 객체를 선언 후 사용하면 된다.

밑의 코드에서 CFramework의 Create함수를 랩핑하고 있다.

 

  1.  // 엔진의 정적 라이브러리
    #ifdef _DEBUG
    #pragma comment ( lib, "Engine_d.lib" )
    #else
    #pragma comment ( lib, "Engine.lib")
    #endif

    // 랩핑 클래스 구현
    #pragma once
    #include "Framework.h" // 랩핑할 Native C++ 클래스 헤더를 참조

    using namespace System;
    namespace CWrapper {

            public ref class CFrameworkWrapper
            {
            public:
                    CFrameworkWrapper();
                    ~CFrameworkWrapper();

            public:
                    void Create( IntPtr hWnd )
                    {
                            m_hHwnd = (HWND)hWnd.ToInt32();

                            m_pFrameWork = new CFramework();
                            m_pFrameWork->Run( m_hHwnd );
                    }

            protected:
                    HWND m_hHwnd;
                    CFramework* m_pFrameWork;
            };
    }

 

C# 프로젝트 생성

C#의 Windows 응용프로그램 프로젝트를 생성해준다.

폼 디자이너에서 적당히 폼을 만들어주고 PictureBox 컨트롤을 배치해준다. 이 컨트롤에 실제 화면이 그려지게 된다.

그 다음 솔루션 탐색기에서 참조 추가를 이용해 위에 작성한 프로젝트의 DLL ( 미리 빌드 해놓자 )을 찾아서 추가해준다.

 

ref.jpg

 

ref2.jpg 

 

DLL이 성공적으로 추가 되면, 랩핑 클래스를 사용할수 있게 된다.

랩핑 클래스에서 선언한 네임 스페이스를 선언한 후 랩핑 클래스 객체를 생성하자.

그 다음 Create 함수에 PictureBox 핸들을 인자로 넘겨주면, Native C++쪽의 CFramework에서 이 핸들을 쓸수 있게된다.

정상적으로 작업이 수행되면, Native C++쪽에서 만들어지는 화면이 C#의 PitureBox에  그려지게 된다

 

  1. using CWrapper;
  2. public partial class Mainform : Form
    {
            private CFrameworkWrapper m_Frameowrk;

            public Mainform()
            {
                    InitializeComponent();
            }

            public void InitializeFramework()
            {
                    m_Frameowrk = new CFrameworkWrapper(); 
                    m_Frameowrk.Create(pictureBox1.Handle);
            }
    }

 출처 : http://tatis3.springnote.com/pages/4160233

반응형
Posted by blueasa
, |
반응형

'Programming > Design Pattern' 카테고리의 다른 글

C# 디자인패턴  (0) 2010.12.15
Dependency를 관리하는 방법  (0) 2010.10.21
Design Pattern Examples in C#  (0) 2010.07.23
GoF의 디자인패턴  (0) 2010.07.23
FSM - 유한 상태 기계 (Finite State Machine)  (0) 2010.07.09
Posted by blueasa
, |