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

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Python (8)
TinyXML (5)
STL (13)
D3D (3)
MFC (1)
C/C++ (54)
C++/CLI (45)
C# (251)
WinForm (6)
WPF (5)
Math (10)
A.I. (1)
Win32API (11)
Algorithm (3)
Design Pattern (7)
UML (1)
MaxScript (1)
FMOD (4)
FX Studio (1)
Lua (2)
Terrain (1)
Shader (3)
boost (2)
Xml (2)
JSON (4)
Etc (11)
Monad (1)
Html5 (4)
Qt (1)
Houdini (0)
Regex (14)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
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

Native C++ LIB 프로젝트를 만들고 ( LIB 생성 )

C++ / CLI 프로젝트에서 LIB 프로젝트를 참조하여 Wraping 한다음 ( DLL 생성 )

C# 프로젝트에서 툴 UI를 작성 하게 되는데

그냥하면 LIB 프로젝트로 브래이크 포인트가 들어 오지 않는다. 디버깅을 할 수 없다.

 

Native C++ 프로젝트 속성-> 디버깅->디버거 형식 을 혼합으로 설정하고 ( 여기까진 했었다 )

C# 프로젝트 속성-> 디버그->디버거 사용 목록에서 '비관리 코드 디버깅 사용'에 체크 ( 이걸 안했었다 )

 

C#은 Maneged(관리) 코드 이고 Native C++은 None Managed(비관리 코드)다.

 

영어가 아니라 한글이라 헷갈리는 구나~ 보고도 바로 못 알아 봤다 ㄱㅡ

 

손발아~ 미안해~ 고생 시켜서.... ;ㅅ;


출처 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0PYd8&articleno=79#ajax_history_home

반응형
Posted by blueasa
, |

이번절에서는 닷넷 프레임 워크의 System::String를 일반적으로 C++ 에서 사용할 수 있는 char* 또는 wchar_t* 로 변환 해보도록 해봅시다. 간단한 코드라서 전체 소스와 주석으로 설명을 대신 하겠습니다.

#pragma once


#include <vcclr.h>

#include <atlstr.h>

#include <stdio.h>

#using <mscorlib.dll>

using namespace System;

using namespace System::Runtime::InteropServices;


namespace MainEngine {


    public ref class MainRenderEngine

    {

        // TODO: Add your methods for this class here.

    public:

        bool Create(System::String^ strWindowText)

        {

            // 유니코드 문자열에 할당

            pin_ptr<const wchar_t> wch = PtrToStringChars(strWindowText);


            MessageBox(NULL, wch, _T("유니코드"), MB_OK);


            // 일반 char* 문자열로 변환

            size_t convertedChars = 0;

            size_t  sizeInBytes = ((strWindowText->Length + 1) * 2);

            errno_t err = 0;

            char    *ch = (char *)malloc(sizeInBytes);


            err = wcstombs_s(&convertedChars, ch, sizeInBytes, wch, sizeInBytes);


            if (err != 0)

            {

                MessageBox(NULL, _T("char* 변환 에러"), _T("에러"), MB_OK);

            }


            // ch의 사용

            printf_s("%s\n", ch);



            return true;

        }

    };

}



반응형
Posted by blueasa
, |

※ C++/CLI 작업을 하면서, 단순 암기로 끝내버려야 할 내용들을 기록해둔다.

    나중에, 혹 다시 보기도 편하고 찾기도 편하고 정리하면서 다시 한번 되새기고

    뭐... 이런저런 이유로 기록한다. (일정 부분까지는 수정/추가할 것이다.)

 

■ 선언부

 

   ㅇ 헤더파일

 

       #include "stdafx.h" // 와 같이 동일함

 

       // .........

       // 등등...

       // .........

 

   ㅇ C# 클래스 참조

 

       #using <mscorlib.dll>

       #using <system.dll>
       #using <system.drawing.dll>

 

       // .........

       // 등등...

       // .........

 

       using namespace System;
       using namespace System::ComponentModel; // 와 같이 C#처럼 .이 아니라 :: 임에 유의
       using namespace System::Collections;
       using namespace System::Windows::Forms;
       using namespace System::Data;
       using namespace System::Drawing;

 

       // .........

       // 등등...

       // .........

 

■ 개념 정리

 

    : 앞은 C++/CLI에서의 표현 뒤는 C++에서의 표현 - 걍 보고 외워버려도 된다. 이런건

 

   ㅇ ^ : Handle, Pointer 연산자 개념

 

   ㅇ gcnew : CLI Heap 할당 연산자

       - garbage collection new ( 동적 메모리를 관리(managed) 해줌 ), delete 처리가 필요없음.

 

... ING ...

 

■ CLI 함수 선언시 주의

 

   ㅇ return value

       - BOOL → bool

 

... ING ...

 

■ managed / unmanaged

 

... ING ...

 

#pragma unmanaged

// 여기는 C++ 코드 구현부

#pragma managed

// 여기는 CLI 코드 구현부

 

... ING ...

 

■ 데이터 타입, 형 변환

 

   ㅇ 문자열 : String ^strReturn;

 

   ㅇ CString 값 대입

 

       - String ^szCommand = gcnew String( (LPCTSTR)strTemp ); // CString strTemp;

 

... ING ...

 

 

■ CLI 형식 구문


* (MSDN 참조)

CLI 형식

C++/CLI

참조 클래스 ref class R
값 클래스 value class V
추상 클래스 ref class R abstract
봉인 클래스 ref class R sealed
인터페이스 클래스 interface class IBar
CLI 열거형 enum class E
대리자 형식 delegate void CallBack()

 

... ING ...

반응형

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

Native C++ & C++ / CLI & C# 환경에서의 디버깅  (0) 2010.05.26
System::String -> char* OR wchar_t*  (0) 2010.05.26
Managed 문자열 -> Unmanaged 문자열 변환  (0) 2010.05.26
C++/CLI 예제  (0) 2010.05.25
참고 사이트  (0) 2010.05.25
Posted by blueasa
, |

//-- 인코딩 지정 변환 예

System::Text::Encoding^ m_encoding;

m_encoding = gcnew System::Text::UTF8Encoding();
m_stat, sql::SQLException* : legacy native c++ pointer

int execute(String^ sql) 
try {
assert(m_stat); 
if (!m_encoding) {
return m_stat->execute(getAnsiString(sql)); //.net -> native
} else {

array<unsigned char>^ bytes = m_encoding->GetBytes(sql);
pin_ptr<unsigned char> s = &bytes[0];
return m_stat->execute((const char*)s);   //.net -> native
}
} catch (sql::SQLException *ex) {
throw gcnew SQLException(ex, sql);
}
}

//-- utf8 로 저장된 문자열 배열을, .net 유니코드 문자열 배열로 변환
array<String^>^ convStrArray(const std::vector<std::string> &arrStr) //native -> .net
{
size_t cnt = arrStr.size();
UTF8Encoding^ encode = gcnew UTF8Encoding(true,true);
        array<String^>^ arr = gcnew array<String^>(cnt);
        for (size_t i = 0; i < cnt; i++)
            arr[i] = gcnew String(arrStr[i].c_str(), 0, arrStr[i].size(), encode);

        return arr;
}


//-- strconv.h, vs2005/8

#pragma once

#include <vcclr.h>
#include <string>

using namespace System;
using namespace System::Runtime::InteropServices;

inline
std::string getAnsiString(String^ s) 
{
    IntPtr ip = Marshal::StringToHGlobalAnsi(s);
    const char* str = static_cast<const char*>(ip.ToPointer());

    std::string ansi(str);
    
    Marshal::FreeHGlobal( ip );

    return ansi;
}

inline
std::wstring getUniString(String^ s)
{
    pin_ptr<const wchar_t> str = PtrToStringChars(s);

    std::wstring uni(str);
    return uni;
반응형

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

System::String -> char* OR wchar_t*  (0) 2010.05.26
CLI - 초무식, 초단순 암기용 저장글  (0) 2010.05.26
C++/CLI 예제  (0) 2010.05.25
참고 사이트  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
Posted by blueasa
, |

C++/CLI 예제

Programming/C++/CLI / 2010. 5. 25. 22:27
반응형

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

CLI - 초무식, 초단순 암기용 저장글  (0) 2010.05.26
Managed 문자열 -> Unmanaged 문자열 변환  (0) 2010.05.26
참고 사이트  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
C++/CLI 관련 용어 정리  (0) 2010.05.25
Posted by blueasa
, |

참고 사이트

Programming/C++/CLI / 2010. 5. 25. 17:33
반응형

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

Managed 문자열 -> Unmanaged 문자열 변환  (0) 2010.05.26
C++/CLI 예제  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
C++/CLI 관련 용어 정리  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
Posted by blueasa
, |

C++/CLI 역시 CLI의 한 구현물이다 보니 CTS에서 말하는 기본 타입을 모두 지원한다.
다음 표에 13개의 기본 타입을 요약해놨는데,
다행히 이런 기본 타입은 네이티브 쪽이나 관리되는 코드 쪽이나 같은 키워드를 사용하므로 금방 익숙해진다.


CLI 타입

C++/CLI 키워드

예제

설명

System::Boolean

bool

bool success = true;

true/false

System::Byte

unsinged char

unsigned char c = 'c';

부호 없는 8비트 정수

System::Char

wchar_t

wchar_t wc = L'w';

유니코드 문자

System::Double

double

double d = 1.1E-11;

8바이트짜리 배정밀도 부동 소수점

System::Int16

short

short s = 12;

16비트 정수

System::Int32

int, long

int i = 100;

32비트 정수

System::Int64

__int64, long long

__int64 i = 100;

64비트 정수

System::SByte

char

char c = 'T';

8비트 정수

System::Single

float

float i = 1.01f

4바이트짜리 단정밀도 부동 소수점

System::Uint16

unsigned short

unsigned short i = 100;

부호 없는 16비트 정수

System::UInt32

unsigned int, unsigned long

unsigned int i = 100;

부호 없는 32비트 정수

System::UInt64

unsigned __int64, unsigned long long

unsigned __int64 i = 100;

부호 없는 64비트 정수

Void

void

 

타입 없는 데이터나 데이터 없음

반응형

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

C++/CLI 예제  (0) 2010.05.25
참고 사이트  (0) 2010.05.25
C++/CLI 관련 용어 정리  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
expert_cppcli_.net_for_visual_cpp_programmers.pdf  (0) 2010.05.24
Posted by blueasa
, |

1. CLI(Common Language Infrastructure) : 공통 언어 기반
- ECMA의 공인을 받은 공개된 명세.(구현이 아님)
- "공통 언어라 불리려면 이것 저것 등등을 구현해야 한다"고 적어놓은 문서.
- CLI는 표준 명세이고, 이에 맞춰 구현하는 일은 각 벤더나 오픈 소스 프로젝트의 몫
- CLI 명세에 따른 구현물 : .NET Framework, 모노, DotGNU

2. .NET Framework
- CLI 명세에 따라 MicroSoft사가 개발한 구현물.
- CLR(Common Language Runtime:공통 언어 런타임)과 BCL(Base Class Library)가 포함.

3. BCL(Base Class Library) : 기본 클래스 라이브러리
- MS 제공
- CLI에 명세로 기록된 기본 타입을 제외한 .NET Framework의 나머지는 BCL에 속함.
- 사실상 mscorlib만 CLI 명세에 따른 구현물일 뿐 나머지는 BCL에 속함.
- System.Web(웹 개발 관련 기능 제공)
- System.Data(네임스페이스/데이터베이스 관련 기능 제공)
- 그 외 : System / System.Xml / System.Drawing / System.Windows.Forms / Microsoft.VisualC
            / MicroSoft.Build.Utilities / Microsoft.Build.Framework

4. CTS(Common Type System) : 공용 형식 시스템
- 런타임에서 형식을 선언하고 사용 및 관리하는 방법을 정의
- 언어 간 통합에 대한 런타임 지원의 중요한 부분을 차지

5. CLS(Common Language Specification) : 공용 언어 사양
- 많은 응용 프로그램에 필요한 기본 언어 기능 집합.
- CTS의 하위 집합을 정의.
- 따라서 CTS에 적용되는 모든 규칙은 CLS에도 적용되며, 둘 중 CLS 규칙이 더 엄격함.
- "CLS-Compliant인 코드라면 C#, F#, IronPython 등 언어를 가리지 않고 잘 돌아간다"는 뜻이다.
- 언어 간 호환성을 위한 최소 조건


반응형

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

참고 사이트  (0) 2010.05.25
CLI의 기본 타입  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
expert_cppcli_.net_for_visual_cpp_programmers.pdf  (0) 2010.05.24
wrapping 자동화 관련..  (0) 2010.05.24
Posted by blueasa
, |
반응형

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

CLI의 기본 타입  (0) 2010.05.25
C++/CLI 관련 용어 정리  (0) 2010.05.25
expert_cppcli_.net_for_visual_cpp_programmers.pdf  (0) 2010.05.24
wrapping 자동화 관련..  (0) 2010.05.24
C++/CLI Quick Referrence  (0) 2010.05.24
Posted by blueasa
, |
반응형

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

C++/CLI 관련 용어 정리  (0) 2010.05.25
C++/CLI 강좌: C++/CLI와 C#  (0) 2010.05.25
wrapping 자동화 관련..  (0) 2010.05.24
C++/CLI Quick Referrence  (0) 2010.05.24
c++ lib 를 c# 에서 사용하기 (c++/cli)  (0) 2010.05.17
Posted by blueasa
, |