Languages/C, C++2012. 8. 17. 17:17

C# 에서 C++로 작성된 dll 을 사용할 경우에는 DllImport 를 사용하여 손쉽게 사용할 수 있지만

C++ 에서 C#으로 작성된 dll 을 사용할 경우에는 COM으로 등록하는 작업이 추가적으로 필요합니다.

사용법에 대해서 하나씩 살펴보겠습니다.

 

[ C# dll ]

 

1. C++에서 사용가능한 메소드를 노출시키기 위한 인터페이스를 선언합니다.

 

Tip

 

- Guid 는 Visual Studio의 [ Tools ] - [ Create GUID ] 메뉴를 통해 쉽게 만들 수 있습니다.

- [ComVisible(true)] 대신 다음과 같이 Make assembly COM-Visible을 체크할 수 있습니다.

 

[ComVisible(true)]

[Guid("61EA822A-82BC-4CCE-A0BF-5A24855FF613")]

public interface ICShapSample

{

    void ShowMessage();

}

 

2. 인터페이스를 상속받아 클래스를 구현합니다.

 

[ComVisible(true)]

[ClassInterface(ClassInterfaceType.None)]

[Guid("36EA856C-99E3-4365-B157-6C0D75173F48")]

public class CShapSample : ICShapSample

{

    public void ShowMessage()

    {

        MessageBox.Show("Hello World!!");

    }

}

 

3. dll 을 COM으로 등록합니다.

 

두 가지 방법이 있습니다.

 

1 ) Visual Studio를 관리자 권한으로 실행 시킨 후 다음과 같이 Register for COM interop을 선택한 후 빌드합니다.

 

 

2 ) 커맨드 창을 관리 권한으로 실행시 킨 후 regasm 을 이용해 등록합니다.

- 환경변수가 설정이 되어 있지 않으면

  C:\Windows\Microsoft.NET\Framework\v4.0.30319 ( 설치 버전에 따라 다름 )

  경로에 있는 RegAsm 과 regasm 파일을 dll 폴더에 복사합니다.

  커맨드 창에서 dll 폴더로 이동한 후,

  regasm ClassLibrary.dll /tlb 를 입력 후 실행합니다.

 

[ 등록이 완료되면 tlb 파일이 생성됩니다. ]

 

[ C++ ]

 

tlb 파일을 import 하여 사용합니다.

 

#include <Windows.h>

 

#import "..\ClassLibrary\bin\Debug\ClassLibrary.tlb"

 

using namespace ClassLibrary;

 

void main()

{

             CoInitialize(NULL);

 

             ICShapSamplePtr ptr(__uuidof(CShapSample));

             ptr->ShowMessage();

 

             ptr->Release();

             CoUninitialize();

}

 

[ 실행화면 ]

 

 

CShapDllImport.zip

 

Posted by 열ㅇl
Languages/C, C++2010. 2. 8. 21:40

고급반 초기에 시스템 프로그래밍 시간에

소켓통신에 대해 학습했던 내용들입니다.

 

- AsyncSelect

 

 

 

- EventSelect

 

 

 

- Overlapped

 

 

 

- IOCP

 

 

 

- AsyncSelect 발표 PPT

 

 

Posted by 열ㅇl
Languages/C, C++2009. 10. 19. 00:12

◆ 사람들이 보통 사용하는 식은 중위 표기식으로 다음과 같습니다.

(150+60/2)*2+(78-20+60)+1

 

후위 표기식은 다음과 같은 형태로 스택을 작성하여 구현 할 수 있습니다.

150 60 2 / + 2 * 78 20 - 60 + + 1 +

 

고려사항:

- 괄호 안 연산 우선

- 연산자 우선 순위

- 숫자 자리 수

- 예외 사항 발생 시 리턴

 

절차:

1. 예외 사항 발생 시 예외 메시지 출력 후 리턴 ( 괄호 불 일치, 연산자 에러, 피연산자 에러 )

2. ' ( ' , ' { ' , ' [ ' 이면 PUSH

3. ' ) ' , ' } ' , ' ] ' 이면 ' ( ' , ' { ' , ' [ ' 가 아닐 동안 POP하여 문자 배열에 저장

4. ' + ', ' - ' 일 경우 POP 하여 연산기호 일 경우 문자 배열에 저장, 아닐 경우 다시 PUSH

   현재 연산기호 PUSH

5. ' * ', ' / ' 일 경우 POP 하여 연산 우선 순위가 같은 경우 문자 배열에 저장, 아닐 경우 다시 PUSH

   현재 연산기호 PUSH  

6. 숫자 일 경우 문자 배열에 저장.

   숫자 단위를 구분하기 위해 다음 문자(연산기호, 괄호)를 보고 ' ' 문자 삽입

7. 스택에 남아 있는 문자 POP

8. 문자 배열에 마지막에 '\0' 문자 삽입

 

[ 실행 화면 ]

 

[ 소스 코드]

  200 // 중위 표기를 후위 표기로 변환

  201 char* infix_to_postfix(char* exp)

  202 {

  203     int i=0, p=0;

  204     int length = strlen(exp);

  205     char symbol;

  206     char* postfix = (char*)malloc(length * 2);

  207 

  208     for(i=0; i<length; i++)

  209     {

  210         symbol = exp[i];

  211 

  212         switch(symbol)

  213         {       

  214         case '(' :

  215         case '{' :

  216         case '[' :

  217             push(symbol); // 열림 괄호를 스택에 저장

  218             break;

  219 

  220         case ')':

  221         case '}':

  222         case ']':

  223             postfix_case_bloack(postfix, &p);

  224             break;

  225 

  226         case '+' :           

  227         case '-' :   

  228             postfix_case_operator_1(postfix, symbol, &p);

  229             break;

  230 

  231         case '*' :           

  232         case '/' :               

  233             postfix_case_operator_2(postfix, symbol, &p);

  234             break;

  235 

  236         default:

  237             postfix_case_default(postfix, symbol, exp, &p, i);

  238             break;

  239         }

  240     }

 

 

  136 void postfix_case_operator_1(char* postfix, char symbol, int *p)

  137 {

  138     char temp;

  139 

  140     while(1)

  141     {

  142         if(top == NULL)

  143         {

  144             break;

  145         }

  146         temp = (char)pop(); // 스택에서 하나를 꺼냄

  147 

  148         if(temp == '+' || temp == '-' || temp == '*' || temp == '/') // 연산 기호라면

  149         {

  150             postfix[(*p)++] = temp; // 문자 배열에 저장\tab

  151             postfix[(*p)++] = ' ';

  152         }

  153         else

  154         {

  155             push(temp); // 연산 기호가 아니면 다시 스택에 저장

  156             break;

  157         }

  158     }

  159     push(symbol); // 현재 연산 기호 저장

  160 }

 

 

  162 void postfix_case_operator_2(char* postfix, char symbol, int *p)

  163 {

  164     char temp;

  165 

  166     while(1)

  167     {

  168         if(top == NULL)

  169         {

  170             break;

  171         }

  172         temp = (char)pop(); // 스택에서 하나를 꺼냄

  173 

  174         if(temp == '*' || temp == '/') // 우선순위가 같은 연산 기호라면

  175         {

  176             postfix[(*p)++] = temp; // 문자 배열에 저장\tab   

  177             postfix[(*p)++] = ' ';

  178         }

  179         else

  180         {

  181             push(temp); // 연산 기호가 아니면 다시 스택에 저장

  182             break;

  183         }

  184     }

  185     push(symbol); // 현재 연산 기호 저장

  186 }

 

 

  188 void postfix_case_default(char* postfix, char symbol, char* exp, int *p, int i)

  189 {

  190     postfix[(*p)++] = symbol; // 숫자를 문자 배열에 저장

  191 

  192     // 숫자 구분을 위해

  193     if(exp[i+1] == '+' || exp[i+1] == '-' || exp[i+1] == '*' || exp[i+1] == '/' ||

  194         exp[i+1] == ')' || exp[i+1] == '}' || exp[i+1] == ']' || exp[i+1] == '\0')

  195     {

  196         postfix[(*p)++] = ' '; // 공란 삽입

  197     }

  198 }

 

 

    73 // 후위 표기 연산

   74 element evalPostfix(char *exp)

   75 {

   76     double opr1, opr2;

   77     int value, i=0, count=0;

   78     int length = strlen(exp);

   79     char symbol;

   80 

   81     for(i=0; i<length; i++)

   82     {

   83         symbol = exp[i];

   84 

   85         if(symbol >= '0' && symbol <= '9')

   86         {

   87             while(exp[i + count] != ' ') // 숫자 구분을 위해 검사

   88             {

   89                 count++;

   90             }

   91             value = atoi(&exp[i]);

   92             i+=count;

   93             count=0;

   94             push(value);

   95         }

   96         else

   97         {

   98             if(symbol != ' ') // 숫자 구분을 위한 ' ' 이 아닌 경우에만

   99             {

  100                 opr2 = pop();

  101                 opr1 = pop();

  102 

  103                 switch(symbol)

  104                 {

  105                 case '+' : push(opr1 + opr2); break;

  106                 case '-' : push(opr1 - opr2); break;

  107                 case '*' : push(opr1 * opr2); break;

  108                 case '/' : push(opr1 / opr2); break;

  109             }

  110             }

  111         }

  112     }

  113     return pop();

  114 }

 

▶ 전체 소스 코드는 첨부 파일을 다운 받으시면 됩니다.

'Languages > C, C++' 카테고리의 다른 글

Import C# dll  (2) 2012.08.17
[ 고급반 ] C++ 소켓 통신  (0) 2010.02.08
단기반 실습 - C++  (0) 2009.03.05
단기반 - OOP 프로젝트_C++  (0) 2009.03.05
단기반 - 관리프로그램 프로젝트_C언어  (0) 2009.03.05
Posted by 열ㅇl
Languages/C, C++2009. 3. 5. 21:20

탕정마을

스케쥴러

 

연결리스트_더미 유

정렬

 

기수정렬

 

Posted by 열ㅇl
Languages/C, C++2009. 3. 5. 20:56

전공별 학생관리

쩔다의 전설_게임

 

100분토론

 

Posted by 열ㅇl
Languages/C, C++2009. 3. 5. 20:33

진급시험 - 관리프로그램 3가지

모듈화도 모를 때여서 참 소스가 엉망진창입니다.ㅎㅎ

-------------------------------------------------------------------- 

주차빌딩 관리 시스템
10층으로 이루어진 주차장이고 각층당 20대씩 주차 할 수 있다.
1. 입차       10
2. 출차       10
3. 주차 가능 위치 조회      10
4. 주차차량 조회(차량번호)   10
5. 요금정산         20
6. 데이터 로딩 및 세이브 (요금정산기록)   20
7.  모듈화 및 주석 10
8.  App구성 및 메뉴체계 10
--------------------------------------------------------------------
당구장 관리 프로그램
당구장에는 10개의 테이블이 있다.
1. 게임시작  10
2. 게임종료  10
3. 테이블 상황 출력 (게임진행 시간, 요금) 10
4. 빈 테이블 조회 10
5. 요금정산 및 매출액 20
6. 데이터 로딩 및 세이브 (요금 정산 기록 및 매출액) 20
7. 모듈화 및 주석 10
8. App구성 및 메뉴체계 10
--------------------------------------------------------------------
기차 예약 프로그램
1200 천안에서 서울로 가는 무궁화호 한대에 관한 매표 관리
1호차부터 6호차까지 있고 각 차량당 20개의 좌석이 존재
천안에서 서울까지 무정차로 운행 한다.
1. 예약(입석 및 좌석 구분, 이용자가 원하는 자리 선택 가능) 10
2. 가능 자리 검색           10
3. 예약 현황 조회           10
4. 예약 취소                10
5. 요금 수납 및 정산        20
6. 데이터 save & Loading   20 
7. 모듈화 및 주석    10
8. App구성 및 메뉴체계   10

 

 

 

 

 

조 프로젝트

공동사항

파일 입출력을 사용하여 종료시 저장 시작시 로드 구현
각 과목의 수강인원은 30명으로 정적 !!
나머지 부분은 전부 동적 할당 !!


비트센터 : BIT_Center
{
 BIT_SCHOOL** BIT_School;
}BIT_CENTER;


비트학원 : BIT_School
{
 BIT_CLASS** BIT_Class;
 BIT_STUDENT** BIT_Student;
}BIT_SCHOOL;

과목 : BIT_Class
{
 char* Class_Name; 과목명
 int Class_Rank; 과목성적
 char Class_Info:1 ; 과정진행중 여부
}BIT_CLASS;

학생 :BIT_Student
{
 BIT_CLASS** BIT_Class ;
 int STU_Master;   이수한과목의수
 int STU_Age;      나이
 char* STU_Name;     이름
 char* STU_Add;      주소
 char* STU_Phon;     전화번호
 char* STU_Position; 소속
}BIT_STUDENT;

 

 

'Languages > C, C++' 카테고리의 다른 글

Import C# dll  (2) 2012.08.17
[ 고급반 ] C++ 소켓 통신  (0) 2010.02.08
C - 중위표기식을 후위표기식으로 변환하여 계산하기  (5) 2009.10.19
단기반 실습 - C++  (0) 2009.03.05
단기반 - OOP 프로젝트_C++  (0) 2009.03.05
Posted by 열ㅇl