이건 테스트
'Jedi's Move' 카테고리의 다른 글
| 테스트 (0) | 2009/05/27 |
|---|---|
| [c++] 리눅스와 윈도우간의 UDP 통신 (0) | 2008/09/28 |
| [VC++] therad in Visual C++ (0) | 2008/05/05 |
| [VC++] MFC 단축키 등록 및 사용 (0) | 2008/04/29 |
| [C++] String Utilts (0) | 2008/02/19 |
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
근데 소스가 좀 잘못되어 있어서 나름 새로 수정
원본 출처 : http://cafe.naver.com/bitworld/439
새로 만든것
/////
또하나의 좋은 소스
출처 : http://blog.naver.com/swjli/53996098
Windows 방화벽 사용안함으로 바꾸시고, 무선랜도 사용안함으로 바꾸세요.
그리고 다이렉트 케이블로 연결하시고 IP주소 잘 맞추시구요.
------------------------------------------------------------------------
//////////// Client.cpp /////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<iostream>
using namespace std;
#define BUFSIZE 512
int main()
{
// socket() 생성
int sock=socket(AF_INET, SOCK_DGRAM, 0);//소켓 변수 선언(주소 체계, 소켓 타입, 프로토콜)
// bind() 소켓에 주소 구조체 초기화
sockaddr_in serveraddr; //소켓 주소 구조체를 수신자 주소로 초기화한다.
bzero(&serveraddr, sizeof(serveraddr)); //0으로 초기화
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(5000); // 포트 번호
serveraddr.sin_addr.s_addr=inet_addr("xxx.xxx.xxx.xxx"); // "127.0.0.1"(자기 컴)
// 데이터 통신에 사용할 변수
sockaddr_in peeraddr; //송신자 주소 저장을 위한 변수 선언
int addrlen;
char buf[BUFSIZE+1]; //보낼 데이터를 저장할 버퍼 선언
int len;
// 서버와 데이터 통신
while(1)
{// 데이터 입력
cout<<endl<<"[보낼 데이터] ";
if(fgets(buf,BUFSIZE+1,stdin)==NULL)
break;
// '\n' 문자 제거
len=strlen(buf);
if(buf[len-1]=='\n')
buf[len-1]='\0';
if(strlen(buf)==0)
break;
//데이터 보내기
int retval;
retval=sendto(sock,buf,strlen(buf),0,(sockaddr*)&serveraddr,sizeof(serveraddr));
cout<<"[UDP 클라이언트] "<<retval<<"바이트를 보냈습니다."<<endl;
// 데이터 받기
addrlen=sizeof(peeraddr);
retval=recvfrom(sock,buf,BUFSIZE,0,(sockaddr*)&peeraddr,(socklen_t*)addrlen);
// 받은 데이터 출력
buf[retval]='\0';
cout<<"[UDP 클라이언트] "<<retval<<"바이트를 받았습니다."<<endl;
cout<<"[받은 데이터] "<<buf<<endl;
}// 클라이언트 소켓 연결 종료
close(sock);
return 0;
}
--------------------------------------------------------------------------
//////////// Server.cpp /////////////
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<iostream>
using namespace std;
#define BUFSIZE 512
int main()
{
// socket() 생성
int sock=socket(AF_INET, SOCK_DGRAM, 0); //(주소 체계, 소켓 타입, 프로토콜)
int retval;
// bind() 소켓에 주소 할당
sockaddr_in serveraddr;
bzero(&serveraddr, sizeof(serveraddr)); //0으로 초기화
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(5000);
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
retval=bind(sock, (sockaddr*)&serveraddr, sizeof(serveraddr));
// 데이터 통신에 사용할 변수
sockaddr_in clientaddr;
int addrlen;
char buf[BUFSIZE+1];
// 클라이언트와 데이터 통신
while(1){
// 데이터 받기
addrlen=sizeof(clientaddr);
retval=recvfrom(sock,buf,BUFSIZE,0,(sockaddr*)&clientaddr,(socklen_t*)&addrlen);
//받은 데이터 출력
buf[retval]='\0';
cout<<"[UDP/"<<inet_ntoa(clientaddr.sin_addr)<<":"<<ntohs(clientaddr.sin_port)<<"] "<<buf<<endl;
//데이터 보내기
retval=sendto(sock,buf,retval,0,(sockaddr*)&clientaddr, sizeof(clientaddr));//(소켓,보낼 데이터 주소,데이터 크기,0,목적지 주소, 소켓 주소 구조체 크기)
}
// 클라이언트 소켓 연결 종료
close(sock);
return 0;
}
[출처] 윈도우와 리눅스간 통신|작성자 잔소리
'Jedi's Move' 카테고리의 다른 글
| 테스트 (0) | 2009/05/27 |
|---|---|
| [c++] 리눅스와 윈도우간의 UDP 통신 (0) | 2008/09/28 |
| [VC++] therad in Visual C++ (0) | 2008/05/05 |
| [VC++] MFC 단축키 등록 및 사용 (0) | 2008/04/29 |
| [C++] String Utilts (0) | 2008/02/19 |
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
---
설명이나 메모 필드와 같은 긴 텍스트 문자열이 들어 있는 셀이나 셀 범위에서 단어 수가 몇 개인지 알아보려고 합니다. 여러 가지 방법으로 이 작업을 실행할 수 있습니다.
셀의 단어 수 계산
이 작업을 실행하려면 LEN, TRIM 및 SUBSTITUTE 함수를 사용합니다.
예제
예제를 빈 워크시트에 복사한 다음 살펴보면 쉽게 이해할 수 있습니다.
- 빈 통합 문서 또는 워크시트를 만듭니다.
- 도움말 항목에서 예제를 선택합니다.
참고 행 머리글이나 열 머리글은 선택하지 마십시오.
- Ctrl+C를 누릅니다.
- 워크시트에서 A1 셀을 선택하고 Ctrl+V를 누릅니다.
- 결과를 반환하는 수식 보기와 결과 보기 사이를 전환하려면 Ctrl+`(억음 악센트 기호)를 누르거나 수식 탭의 수식 분석 그룹에서 수식 표시 단추를 클릭합니다.
이 예제에서는 A1 셀에 "즐거운 하루 되세요!"라는 텍스트가 있고 A2 셀에 수식이 있습니다. 이 수식은 셀에 공백으로 구분된 3개의 단어가 있음을 나타내는 값 3을 반환합니다. 단어 사이에 공백이 여러 개 있거나 단어 앞뒤에 공백이 있는 경우에도 마찬가지입니다. TRIM 함수는 셀의 텍스트에서 추가 공백과 단어 앞뒤의 공백을 제거합니다.
|
| ||||||||||||
참고 순환 참조를 방지하려면 단어 수를 계산할 셀 외부의 셀에 수식을 입력해야 합니다. 또한 계산할 단어가 포함된 셀을 나타내도록 수식에서 셀 참조를 변경해야 합니다.
함수 정보
셀 범위에서 단어 수 계산
이 작업을 실행하려면 배열 수식에 SUMIF, LEN, TRIM 및 SUBSTITUTE 함수를 사용합니다.
예제
예제를 빈 워크시트에 복사한 다음 살펴보면 쉽게 이해할 수 있습니다.
- 빈 통합 문서 또는 워크시트를 만듭니다.
- 도움말 항목에서 예제를 선택합니다.
참고 행 머리글이나 열 머리글은 선택하지 마십시오.
- Ctrl+C를 누릅니다.
- 워크시트에서 A1 셀을 선택하고 Ctrl+V를 누릅니다.
- 결과를 반환하는 수식 보기와 결과 보기 사이를 전환하려면 Ctrl+`(억음 악센트 기호)를 누르거나 수식 탭의 수식 분석 그룹에서 수식 표시 단추를 클릭합니다.
이 예제에서 수식은 범위에 공백으로 구분된 단어가 37개 있음을 나타내는 값 37을 반환합니다. 단어 사이에 공백이 여러 개 있거나 단어 앞뒤에 공백이 있는 경우에도 마찬가지입니다. TRIM 함수는 셀의 텍스트에서 추가 공백과 단어 앞뒤의 공백을 제거합니다. 지정된 범위의 전체 단어 수를 계산하기 위해 배열 수식은 해당 범위의 각 셀에 있는 단어 수를 계산하고 SUM 함수가 각 셀의 값을 더하여 합계를 구합니다.
|
| |||||||||||||||||||||||||||||||||||
참고
- 순환 참조를 방지하려면 단어 수를 계산할 범위 외부의 셀에 수식을 입력해야 합니다. 또한 계산할 단어가 포함된 셀 범위를 나타내도록 수식에서 범위 참조를 변경해야 합니다.
- 배열 수식을 입력하려면 수식이 있는 셀을 선택하고 F2 키를 누른 다음 Ctrl+Shift+Enter를 누릅니다.
팁 함수가 계산되는 과정을 단계별로 보려면 수식이 포함된 셀을 선택한 후 수식 탭의 수식 분석 그룹에서 수식 계산을 클릭합니다.
함수 정보
thread 를 만들고, 기다리는 방법
출처 : http://hemswell.lincoln.ac.uk/~slawson/napier/CO42018/labs/lab06.html
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
DWORD WINAPI MyThread(LPVOID);
int _tmain(int argc, _TCHAR* argv[])
{
DWORD iID[4];
HANDLE hThread[4];
DWORD waiter;
// create
hThread[0] = CreateThread(NULL,0,MyThread,"T1",NULL,&iID[0]);
hThread[1] = CreateThread(NULL,0,MyThread,"T2",NULL,&iID[1]);
// Ex of CreateThread
// CreateThread(
// NULL, // default security attributes
// 0, // use default statck size
// ThreadFunc, // thread function
// &dwThrdParam // argument to thread function
// 0, // use default creation flags
// &dwThreadID // returns the thread identifier
// wait
waiter = WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
return 0;
}
DWORD WINAPI MyThread(LPVOID n)
{
char* name = (char*)n;
for( int i=0; i < 100; i++)
printf("Thread %s: i=%d\n",name,i);
return 0;
}
'Jedi's Move' 카테고리의 다른 글
| 테스트 (0) | 2009/05/27 |
|---|---|
| [c++] 리눅스와 윈도우간의 UDP 통신 (0) | 2008/09/28 |
| [VC++] therad in Visual C++ (0) | 2008/05/05 |
| [VC++] MFC 단축키 등록 및 사용 (0) | 2008/04/29 |
| [C++] String Utilts (0) | 2008/02/19 |
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
퍼온 글입니다
원본 글이 없어질 까봐. 모두 긁어왔습니다.
원본 : http://blog.naver.com/silzon/30029175691
안녕하세요~ 오늘 저녁에 시간의 여유가 있어서, 강좌를 여러개 올리네요. ^^
다음 주 부턴, 죽음 입니다. ㅠㅠ; 새로운 프로젝트가 시작 되었거든요 ㅠㅠ;
***********************************************************************************
MFC 다이알로그 기반에서 Accelerator 를 사용하는 방법에 대해 알아 봅시다!
(다이얼로그, Dialog, 대화상자, 엑셀러레이터, 단축키)
이번에, 단축키를 이용하여서, 메세지 박스가 띄어 지는 Dialog 기반 프로젝트를 만들어 보겠습니다.
강의 내용은, 초보자를 대상으로 만들어 졌습니다.
왠만큼, MFC 를 다뤄보신 분들은, 강의 내용을 빠르게 쑤욱~ 넘겨 보시면 됩니다.
::::: 1 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
MFC 의 SDI 나 MDI 의 경우 가속키(Accelerator) 기능이 기본적으로 들어가 있지만, Dialog Based 프로젝트에는
가속키 기능이 들어가 있지 않습니다.
Dialog Based 프로젝트에 가속키를 넣는 순서는, 대략 다음과 같습니다.
1) 리소스로부터 가속키를 읽어, 가속키 테이블을 프로그램에서 설정
2) 기본 메세지가 처리 되기 전에 미리 PreTranslateMessage() 에서 메세지 처리
::::: 2 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Dialog Based 프로젝트를 만듭니다.
Resource Tab 을 보면, Accelerator 폴더가 없습니다. (SDI, MDI 에는 Accelerator 폴더가 있음)
::::: 3 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

1) Accelerator resources 마우스 오른쪽 버튼 클릭
2) Insert.... 따닥!
그럼 아래와 같은 그림이 뜹니다.

1) Resource type 의 Accelerator 마우스 왼쪽 따닥!
2) New 버튼 따닥!
::::: 4 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

그럼, 다음과 같이, Accelerator 편집기가 뜹니다.

빨간색 부분을 마우스 왼쪽 따다닥! 누르면
윗 그림과 같이, Accel Properties 상자가 뜹니다!
우리는, 단축키 Ctrl + D 를 누르면, 대화 박스가 뜨게 만들어 봅시다!
::::: 5 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

1) ID 에다가 사용자 임의데로 써줍니다.
2) 단축키 설정을 위해 Next Key Typed 버튼을 따닥!
그럼 아래와 같은 그림이 뜹니다.

3) 우리는 아까, 단축키를 Ctrl + D 로 하기로 했으므로, Ctrl + D 를 누릅니다!
::::: 6 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

그럼, 윗 그림과 같이
Key 에 D 가 들어가 있고, 오른쪽 상단 Ctrl 키가 체크 되어 있습니다.
그럼, 프로그램 입장에선, 사용자가 Ctrl + D 를 누르면, IDC_HELLO 라는 메세지가 날라 옵니다.
우리는 이 IDC_HELLO 라는 ID 를 받아, 처리 할 수 있습니다.
::::: 7 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

1) Ctrl + W 를 눌러 클래스 위자드를 실행 시킵니다.
2) Message Map 탭 에서 Project, Class Name 을 확인 하시고, Object IDs 의 IDC_HELLO 따닥!
3) 오른쪽 Messages 에서 COMMAND 따다닥!
그럼 아래와 같은 그림이 나옵니다.

4) OK 버튼 따닥!

5) 아래쪽 Member functions 에서 OnHello 함수가 생긴것을 확인 하시고,
오른쪽 Edit Code 버튼 따닥!
::::: 8 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

그럼 다음과 같이, OnHello() 라는 함수가 생성 되었습니다~
즉, Ctrl + D 단축키를 누르면, OnHello() 함수가 호출 됩니다.
여기에다가, Hello~ Silzon 라는 대화상자를 띄어 보도록 합시다~! ㅋㅋㅋ
::::: 9 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
void CAcceleratorDlg::OnHello() |
다음과 같이 코딩하고 실행 시켜 봅시다~
Ctrl + D 를 눌러 보아요!
.
.
.
.
역시.. 아무 반응이 없습니다. ㅋㅋ
맨처음에 설명 했듯이, 다음과 같은 과정이 필요 합니다.
1) 리소스로부터 가속키를 읽어, 가속키 테이블을 프로그램에서 설정
2) 기본 메세지가 처리 되기 전에 미리 PreTranslateMessage() 에서 메세지 처리
::::: 10 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

1) Class View Tab 에서, CAcceleratorDlg 오른쪽 마우스 따닥!
2) Add Member Variable... 따닥!

3) Variable Type 과 Variable Name 입력!
4) OK 따닥!
::::: 11 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

1) OnInitDialog() 따닥!
2) 다음과 같이 코딩!
|
.... .... SetIcon(m_hIcon, TRUE); // Set big icon m_hAccelTable = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1)); .... .... |
여기서 주의 할 점은 IDR_ACCELERATOR1 은
4번에서 우리가 만들어 준 Accelerator 이다.
::::: 12 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
자, 이제 PreTranslateMessage 함수를 코딩 해 보자.
이 함수는, 프로그램에서 발생하는 모든 Message 를 받아, 처리 할 수 있다.

1) Ctrl + W 를 눌러, 클래스 위자드를 실행 시킨다.
2) PreTranslateMessage 따다닥!
3) Member functions 에 PreTranslateMessage 생겼다 확인
4) Edit Code 따닥!
::::: 13 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

PreTranslateMessage 함수에 다음 내용을 코딩 한다.
|
BOOL CAcceleratorDlg::PreTranslateMessage(MSG* pMsg) |
::::: 실행 및 결과 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
컴파일 후, 실행 시켜 보자.
Ctrl + D 단축키를 눌러보자!
그럼 다음 과 같은 결과가 뜨면 성공~ ^^

여기까지, 허졉 실존인물의 강의를 따라와 주셔서~ 모두 수고 하셨습니다. ㅋㅋ
휴~ 강좌 하나 만드는것도, 엄청 손이 많이 가는 작업이네요 ^^;;;
'Jedi's Move' 카테고리의 다른 글
| [c++] 리눅스와 윈도우간의 UDP 통신 (0) | 2008/09/28 |
|---|---|
| [VC++] therad in Visual C++ (0) | 2008/05/05 |
| [VC++] MFC 단축키 등록 및 사용 (0) | 2008/04/29 |
| [C++] String Utilts (0) | 2008/02/19 |
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
| [C#] StringBuilder 에 대한 진실 혹은 거짓말 (0) | 2008/02/04 |
내가 자주쓰는
string processing functions 들을 모아봤다.
namespace SU // SU represents 'String Utilities'
{
std::vector<std::string> split(std::string& text, std::string separators )
{
size_t n = text.length();
size_t start, stop;
std::vector<std::string> result;
start = text.find_first_not_of(separators);
while ((start >= 0) && (start < n)) {
stop = text.find_first_of(separators, start);
if ((stop < 0) || (stop > n)) stop = n;
result.push_back(text.substr(start, stop - start));
start = text.find_first_not_of(separators, stop+1);
}
return result;
}
std::string FindAndReplace (const std::string& source, const std::string target, const std::string replacement)
{
std::string str = source;
std::string::size_type pos = 0, // where we are now
found; // where the found data is
if (target.size () > 0) // searching for nothing will cause a loop
{
while ((found = str.find (target, pos)) != std::string::npos)
{
str.replace (found, target.size (), replacement);
pos = found + replacement.size ();
}
}
return str;
}; // end of FindAndReplace
bool IsTherePattern(const std::string source, const std::string pattern)
{
// Source string 에 pattern 이 존재하는지 안하는지 boolean value를 리턴한다.
if( source.find(pattern) != std::string::npos) { // exist?
return true;
}
else {
return false;
}
}
// Trim related methods
// Refer : http://www.codeproject.com/vcpp/stl/stdstringtrim.asp
// 약간 수정함
std::string TrimStart(std::string str, const char *delims) // trim delims in the start of string
{
str.erase(0, str.find_first_not_of(delims));
return str;
}
std::string TrimEnd(std::string str, const char *delims) // trim delims in the end of string
{
str.erase(str.find_last_not_of(delims) + 1);
return str;
}
std::string Trim(std::string str, const char *delims) // trim delims in the start and end of string
{
str = TrimStart(str, delims);
str = TrimEnd(str, delims);
return str;
}
// 소문자 대문자 변환
int ToLower(int c)
{
if(c>='A' && c<='Z') return c-'A'+'a';
else return c;
}
std::string ToLowerStrings(std::string str)
{
std::string result = "";
for(size_t i=0; i < str.length(); i++)
result += ToLower(str[i]);
return result;
}
int ToUpper(int c)
{
if(c>='a' && c<='z') return c-'a'+'A';
else return c;
}
std::string ToUpperStrings(std::string str)
{
std::string result = "";
for(size_t i=0; i <str.length(); i++)
result += ToUpper(str[i]);
return result;
}
#ifdef FOR_WINDOWS_ONLY
std::string CString2std_string(CString str)
{
return LPSTR(LPCTSTR(str));
}
char* CString2char_pointer(CString str)
{
return LPSTR(LPCTSTR(str));
}
CString GetCurrentPath()
{
HMODULE hModule;
hModule = ::GetModuleHandle(NULL); // handle of current module
ASSERT(hModule != 0);
CString strExeFileName;
VERIFY(::GetModuleFileName(hModule, strExeFileName.GetBuffer(_MAX_PATH),
_MAX_PATH));
strExeFileName.ReleaseBuffer();
char Drive[_MAX_DRIVE];
char Path[_MAX_PATH];
char Filename[_MAX_FNAME];
char Ext[_MAX_EXT];
// suha, for VC++ 2005, convert to char array from CString
char CharPath[_MAX_PATH];
for (int it = 0 ; it < _MAX_PATH ; it++)
{
CharPath[it] = strExeFileName.GetAt(it);
if (CharPath[it] == '\0') break;
}
_splitpath(CharPath, Drive, Path, Filename, Ext);
return CString(Drive)+CString(Path); // has trailing backslash
}
#endif
}
'Jedi's Move' 카테고리의 다른 글
| [VC++] therad in Visual C++ (0) | 2008/05/05 |
|---|---|
| [VC++] MFC 단축키 등록 및 사용 (0) | 2008/04/29 |
| [C++] String Utilts (0) | 2008/02/19 |
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
| [C#] StringBuilder 에 대한 진실 혹은 거짓말 (0) | 2008/02/04 |
| [C#] C++ 클래스 및 메소드를 C# 에서 가져다 쓰는 방법 (0) | 2008/01/30 |
나는 학부 2학년 때부터 계속 C++ 만을 써왔다.
최근에 들어서야, 최신 프로그래밍 기술들이 '제대로' 적용된 C#이나 Java 를 사용하게 되었다.
본 글은, C++ 을 사용해서 프로그래밍 했던 프로그래머들이
C#으로 같은 일을 수행하거나, 더 수월하게 수행하게 될 때 어떠한 문법이나, 명령어를 사용해야 하는지 정리하는 글이다.
C++ -> C#
1. Std::vector --> generic 을 사용한다. 보통 List<> 정도면 충분
2. XML parsing & Writing --> XMLDocument, XPath 등을 사용하면 금방 구현할 수 있음
3. string에서 앞, 뒤 trim --> c# 의 string 에서 기본적으로 trim operation 을 제공함
'Jedi's Move' 카테고리의 다른 글
| [VC++] MFC 단축키 등록 및 사용 (0) | 2008/04/29 |
|---|---|
| [C++] String Utilts (0) | 2008/02/19 |
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
| [C#] StringBuilder 에 대한 진실 혹은 거짓말 (0) | 2008/02/04 |
| [C#] C++ 클래스 및 메소드를 C# 에서 가져다 쓰는 방법 (0) | 2008/01/30 |
| [C#] C#에서 외부 프로그램 부르기 (0) | 2008/01/22 |
StringBuilder 에 대한 진실 혹은 거짓말 (1)
StringBuilder 에 대한 진실 혹은 거짓말 (2)
StringBuilder 에 대한 진실 혹은 거짓말 (3)
'Jedi's Move' 카테고리의 다른 글
| [C++] String Utilts (0) | 2008/02/19 |
|---|---|
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
| [C#] StringBuilder 에 대한 진실 혹은 거짓말 (0) | 2008/02/04 |
| [C#] C++ 클래스 및 메소드를 C# 에서 가져다 쓰는 방법 (0) | 2008/01/30 |
| [C#] C#에서 외부 프로그램 부르기 (0) | 2008/01/22 |
| [C#] Web Service - C# 으로 시작하기 (0) | 2008/01/22 |
이분이 기술한것이 최고의 방법인듯 !!
출처 : http://blog.naver.com/limdp99/60034273093
이번에 파티클 에디터를 만들면서 mfc 말고 c# 을 사용해보았는데 c# 문법에 대한 자료는 많지만,
c++ lib 를 c# 에서 사용하는 방법에 대해 자세히 나온곳이 없어서 간단하게 정리해보았습니다.
작업순서는
1) c++ 로 lib 작성 (lib)
2) c++/cli 로 wrapper 를 만들고 (dll)
3) c# 에서 wrapper dll 를 호출해서 작업을 하게됩니다.
직접 해보자면
1) c++ 로 lib 를 하나 만듭니다. 저는 간단하게 다음과 같은 class 를 만들었습니다.
class cppLib
{
public :
int addValue( int value1, int value2 )
{
return ( value1 + value2 );
}

namespace cliWrap
{
public ref class cppLibWrap
{
protected :
cppLib * m_pCppLib;
public :
cppLibWrap();
virtual ~cppLibWrap();
int addValue( int value1, int value2 );
};
} // namespace - cliWrap
[ source ]
namespace cliWrap
{
cppLibWrap::cppLibWrap() : m_pCppLib( new cppLib )
{}
cppLibWrap::~cppLibWrap()
{
if( m_pCppLib )
{
delete m_pCppLib;
m_pCppLib = 0;
}
}
//////////////////////////////////////////////////////////
int cppLibWrap::addValue( int value1, int value2 )
{
return m_pCppLib->addValue( value1, value2 );
}
} // namespace - cliWrap
3) wrapper class 작성이 끝났으면 c# 으로 프로젝트를 만듭니다.

c# 프로젝트 생성후에 위에서 작업한 2개의 프로젝트를 추가시켜줍니다.
wrapper class 쪽에서 만들어지는 dll 을 c# 에서 사용하게 되는데 매번 변경사항이
있을때마다 복사하기가 번거롭기 때문에 빌드시마다 자동으로 복사해주는 작업을 해줍시다.

Command Line 에 copy "$(TargetPath)" "$(SolutionDir)\simpleProject\$(TargetFileName)" 를
자신의 프로젝트 폴더에 맞게 적당히 수정해서 적어줍니다.

그 후에 dll 복사를 위해 wrapper 프로젝트를 다시 빌드해줍니다.
이제 c# 프로젝트에 c++/cli 로 만든 dll 을 붙여줍니다.

아까 만든 wrapper class dll 을 추가시켜줍니다.

이제 작업이 끝났습니다.
c# 프로젝트에서는 다음과 같이 그냥 사용하시면 됩니다.
namespace simpleProject
{
public partial class Form1 : Form
{
private cliWrap.cppLibWrap m_cppLibWrap = null;
public Form1()
{
InitializeComponent();
m_cppLibWrap = new cliWrap.cppLibWrap();
int returnValue = m_cppLibWrap.addValue(1, 2);
MessageBox.Show(returnValue.ToString());
}
}
}
'Jedi's Move' 카테고리의 다른 글
| [C#, C++] Migration from C++ to C# (0) | 2008/02/11 |
|---|---|
| [C#] StringBuilder 에 대한 진실 혹은 거짓말 (0) | 2008/02/04 |
| [C#] C++ 클래스 및 메소드를 C# 에서 가져다 쓰는 방법 (0) | 2008/01/30 |
| [C#] C#에서 외부 프로그램 부르기 (0) | 2008/01/22 |
| [C#] Web Service - C# 으로 시작하기 (0) | 2008/01/22 |
| [C#] 순차적 쓰레드 실행에 관해 (0) | 2008/01/22 |
이올린에 북마크하기
udp_ex.rar
csproject-limdp99.zip
