Visual Studio 2008 에서 ActiveX 컴파일시

error PRJ0019: 도구에서 오류 코드를 반환했습니다

에러가 발생하면... VS2008 을 관리자 권한으로 실행시키면 됨 ㅠㅠ

'C++ > 설정' 카테고리의 다른 글

OCX CAB 로 만들기  (0) 2012.04.18
ActiveX 테스트 컨테이너  (0) 2012.04.18

UTF-8 -> Unicode

C++/기본 2012. 6. 13. 15:20 Posted by 퓨어레드
TCHAR unicodeBuf[1024];
char *szBuff = (char *) szResp;

MultiByteToWideChar (CP_UTF8, 0, szBuff, -1, unicodeBuf, 1024); 

'C++ > 기본' 카테고리의 다른 글

TCHAR 용 스트링 함수  (0) 2012.06.13
[warning C4996] "_CRT_SECURE_NO_DEPRECATE"로 해결  (0) 2012.05.02

IOCP 이용 Socket Programming 개념

C++/Network 2012. 6. 13. 15:20 Posted by 퓨어레드
음... iocp의 동작원리를 다시한번 상기해 보시기 바랍니다.
기본적으로 iocp는 proactor라는 패턴의 성격을 가지고 있습니다.
즉, 어떤 작업에 대한 선요청이 있어야지만 해당 작업을 한다는 것이죠...
reactor와 반대되는 넘입니다.
음... 풀어서 설명해보면...

iocp를 이용해서 네떡 프로그래밍 하실때 절차를 다시함 생각해보죠...

먼저 WSARecv()를 호출해 주죠?
이것은 nt kernel에게
"어이~ NT야... 네떡에서 데이터좀 받아야 쓰겠는데... 데이터 있으면
parameter로 넘기는 버퍼에 복사하구 알려줄래?"
라고 하는 의미이지 대부분의 경우 이 함수 호출즉시 실제 데이터가 수신되지는 않죠?

그러다가 실제로 요청한 세션에 데이터가 들어와 있거나 들어오는 데이터가 있다면...
하위 네떡 레이어의 수신버퍼로부터 유저가 제공한 버퍼로
복사가 일어나게 되고, 이사실을 app에게 알려주기 위해서
Kernel은 Completion Packet을 하나 생성하구 그 넘을 Iocp에 queueing하게 되겠죠...
이때가 되서야 우리는 GetQueuedCompletionStatus()를 통해 그 사실을 알게되어
실제 데이터를 얻게되구요...

음... 맞나요?

즉! 우리가 application에서 WSARecv()같은 함수를 통해서 명시적으로
operation을 posting해주지 않는다면 절대로 completion이 일어나지
않습니다. 즉, 님께서 만든 application에서 이전에 받은 데이터를 처리하고
다음 데이터를 받기위해 WSARecv()를 호출해 주지 않는 이상은
completion이 일어나지 않는다는 것이 되기때문에 iocp의 queue가 overflow되는
경우는 발생할 수 없겠죠.

음... 근데 여담으루 이런 경우는 있을 수 있겠네요...
recv posting을 엄청 많이... 그러니깐 completion을 받건 말건 걍 무쟈게 많이
미리 해버리는 경우...
메모리 바닥날때까지 해버린다면... 맛이 갈 수는 있겠네요... ^_^;
아마도 ERROR_INSUFFICIENT_RESOURCES 에러가 나겠죠?
더구나 recv나 send를 해서 소켓 operation이 kernel로 넘어가서 pending상태가 되면
이넘들은 kernel에서 접근하기때문에 pageable메모리에 있으면 안되거든요.
반드시 locking이 가능한 physical memory에 올라와야 하죠...
근데 이 lockable 메모리의 사이즈는 그다지 크기 않기땜에 생각보다 빨리
메모리가 바닥날 수 있겠네요...
근데 일반적인 경우에 이렇게 할 일은 별로 없겠죠? ^_^;

음... 이번에는 좀더 원론적인 부분에서 생각을 해보죠...
자 우리가 사용하는 socket 프로그램의 하위엔 TCP stack이라고 하는 넘이
있습니다. 즉, 우리 일반 application프로그래머들은 신경쓰지 않아도 되는
수많은 TCP/IP protocol의 처리들을 구현해 놓은 녀석들이죠...
sliding window protocol이란 녀석을 들어보셨으리라 생각합니다.
TCP/IP 에서 Flow control을 담당하는 녀석이죠... 즉, 위에서 언급한
iocp메커니즘 관련된 것은 제외하고라도, 이넘이 관계하는
incoming/outgoing buffer가 있습니다. 들어오고 나가는 데이터를 버퍼링 하는
것이죠... 즉, 상대측에서 아무리 데이터를 날리고 싶어도 내 컴터의 app에서
어떤 불가피한 상황에 의해 데이터 받는 즉시즉시 데이터를 빼내가지 않아서
수신버퍼에 데이터가 꽉 차있는 상태라면 상대측에선 어떤 데이터도 날릴 수 없는 것이죠...
아무리 송신측에서 Send를 해도 수신측의 버퍼에 여유가 없다면 송신측은 계속
outstanding상태에 있게 된답니다.
즉, posting된 recv가 없는 상태라면 비록 네떡 수신 버퍼는 꽉꽉차있어도
iocp로부터의 completion은 발생하지 않게 됩니다.
당연하겠죠... 요청한 작업이 없는데도 nt가 알아서 completion packet을
저절로 만드는 일은 결코 없을테니까요.

분명한 사실은 iocp라는 넘의 정체는 소켓, 혹은 네떡 프로그래밍만을 위해 존재하는 녀석은
아닙니다.
말 그대로 컴터에서 일어나는 I/O 작업의 completion을 application에서 인지할 수 있게
해주고, 또한 i/o 작업시에 일어날 수 있는 app의 performance저하를 최대한
피할 수 있도록 능동적인 thread pooling의 기능을 제공하는 하나의 커널객체 입니다.
그 이상도 이하도 아니지요...
즉, 이넘을 네떡에도 쓸 수 있고, 화일처리에도 사용할 수 있습니다.
물론 그밖의 핸들을 사용하는 i/o 작업이면 어디에도 가능한 것이죠...

 

TCHAR 용 스트링 함수

C++/기본 2012. 6. 13. 15:18 Posted by 퓨어레드
_tprintf : printf
_stprintf : sprintf
_tcslen : strlen
_tcscpy : strcpy
_tsplitpath : _splitpath

 

'C++ > 기본' 카테고리의 다른 글

UTF-8 -> Unicode  (0) 2012.06.13
[warning C4996] "_CRT_SECURE_NO_DEPRECATE"로 해결  (0) 2012.05.02

[warning C4996] "_CRT_SECURE_NO_DEPRECATE"로 해결

C++/기본 2012. 5. 2. 15:03 Posted by 퓨어레드

결론은 stdafx.h 에

#define _CRT_SECURE_NO_DEPRECATE

을 추가해주면 된다.

'C++ > 기본' 카테고리의 다른 글

UTF-8 -> Unicode  (0) 2012.06.13
TCHAR 용 스트링 함수  (0) 2012.06.13

http://support.microsoft.com/kb/242577#appliesto

다음 링크에서 참고

결론은

OnInitMenuPopup 함수를 구현해야 한다는 것..;; -_- 아.. 이것때문에 한시간동간 개뻘짓을 했네 ㅠㅠ

 

OCX CAB 로 만들기

C++/설정 2012. 4. 18. 13:03 Posted by 퓨어레드

옛날에 퍼온 글이라 출처를 모르겠습니다. 혹시라도 원작자 이시면 댓글달아주세요~ 삭제 하겠습니다. 감사합니다.~

 

*. 인증서 만들기
1. 먼저 인정해주는 프로그램이 들어있는 bin 디렉토리로 간다.
2. setreg 1 true 테스트 인증서를 만들어준다.
3. makecert -n "CN=관리도사" -sv dosa.Pvk dosa.Cer
4. cert2spc dosa.cer dosa.spc
5. 끝났다.
*. dosa라는 인증서를 만든것이다.

*. cab파일 인증하기
1. cabarc N test.cab test.ocx test.inf ???.dll ???.dll ???.jpg ???.jpg ???.txt
2. signcode -v dosa.pvk -spc dosa.spc test.cab
3. setreg -q 1 true
4. chktrust test.cab
5. 끝났다.

*. INetSDK 프로그램의 bin 디렉토리에서 모든걸 처리한다.
1. 포함 파일 : 컴파일 프로그램
2. ocx 프로그램
3. inf 파일
4. 첨부해서 배포될 파일들 : 이미지파일, 텍스트 파일, 설정 파일, 윈도우에서 사용되는 dll은 포함시키지 않는다.

'C++ > 설정' 카테고리의 다른 글

error PRJ0019: 도구에서 오류 코드를 반환했습니다  (0) 2012.06.13
ActiveX 테스트 컨테이너  (0) 2012.04.18

ActiveX 테스트 컨테이너

C++/설정 2012. 4. 18. 13:01 Posted by 퓨어레드

 

tstcon.zip

 

ActiveX 테스트 컨테이너..

Visual Studio 에서 더이상 포함되어있지 않기 때문에 -_- 따로 컴파일 하여 사용해야함

'C++ > 설정' 카테고리의 다른 글

error PRJ0019: 도구에서 오류 코드를 반환했습니다  (0) 2012.06.13
OCX CAB 로 만들기  (0) 2012.04.18

Singleton Sample

C++/Pattern 2012. 4. 18. 12:54 Posted by 퓨어레드

Java 에서는 쉽게 구현되는 싱글톤 패턴이지만.. C++ 에서는 조금 신경을 써야겠다;;
 
일단 Header

 

class CSingleton
{
 
private :
 
    // 유일한 인스턴스를 유지하기 위해 클래스 포인터 선언.. 인스턴스에 종속되면 안되므로 static 으로 해주는 센스~ 
    // 외부의 접근을 막기 위해 private 으로 선언해준다.
    static CSingleton * pSingleton; 
 
protected :
 
    // 생성자는 클래스를 이용하는 외부 모듈에서 생성하는걸 방지하기 위해 protected 로 선언한다 (Private 로 해도 무관..)
    CWordLibrary (void);
 
public :
 
    // getInstance 라는 Static 함수로 외부모듈에서 이 클래스를 사용할수 있는 인터페이스를 제공해준다.
    static CWordLibrary * getInstance ();
 
    // getInstance 부분에서 new 로 클래스를 생성하기 때문에 delete 를 해준 코드를 넣어주기 위해 freeInstance 를 만들어준다.
 
    // 이 작업을 하지 않는다면.. 메모리 누수가 날 확률이 많이 때문에 신경써줘야한다. C++ 은 자바가 아니기 때문 ㅋ
    static void freeInstance ();
 
    // 나머지 클래스 구성들 .....

}

 

해더는 이런식으로 구성해주면 ㅇㅋ

이제는 Body 부분을 구현해보자
 
생성자는 별 코드가 없기 때문에 Pass
 
중요한 클래스 포인터 초기화 코드

 

// 많은 사람들이 잘 까먹는 문법이다.. 꼭 해주길.. Release 모드로 컴파일하면 문제야 없겠지만 .Debug 모드에서 문제가 발생한 확률 99.9999% ㅋ
CSingleton * CSingleton::pWordLibrary = NULL;

CSingleton * CSingleton::getInstance ()
{
	if (pSingleton == NULL)
		pSingleton = new CSingleton ();
 
	return pSingleton;
}

void CSingleton::freeInstance ()
{
	if (pSingleton != NULL)
		delete pSingleton;

	pSingleton = NULL;
}