기본 콘텐츠로 건너뛰기

3월, 2006의 게시물 표시

문자열(스트링) 전격 분석 2부 2강(끝

울트라매니아! | 울트라맨 http://blog.naver.com/alshrl999/20020402126 백택 ( bektekk@yahoo.co.kr ) 홈페이지 : http://bektekk.wo.to 문자열(스트링) 전격 분석 2부 2강(끝) 이제 실제 클래스들을 다룹니다. 사실 원문에는 VARIANT타입과 VC7 CLR 환경에서의 스트링에 관련된 부분까지 포함하고 있으나, 제가 CLR에 대해서는 문외한인 관계로 생략했고, VARIANT부분은 특별히 의미가 있어 보이지 않아 생략했음을 알려드립니다. 본 강좌는 코드 프로젝트에 제가 좋아하는 프로그래머인 Michael Dunn의 강좌 The Complete Guide to C++ Strings, Part I 과 II 를 번역한 글입니다. 최대한 의역을 하려고 노력했지만, 이런쪽의 경험이 부족하다 보니 많이 모자란 강좌가 되겠지만, 많은 도움이 되셨으면 합니다. 기타 문의 사항이나 질문은 쪽지나 메일을 이용해 주셨으면 합니다. 본강좌는 제 홈페이지(위의 링크)를 통해서도 보실수 있습니다. 스트링 랩퍼 클래스들 지금까지 여러가지의 스트링 타입에 대해 설명했고, 이제 스트링 랩퍼 클래스들에 대해 설명하겠다. 각각 어떻게 생성을 하고 어떻게 C스타일 스트링으로 변환시킬수 있는지 설명하겠다. 왜냐하면 C스타일 스트링 포인터는 API함수를 호출하거나 다른 랩퍼클래스들을 생성하는데 필요하기 때문이다. 나는 그외의 함수들 예를 들자면 정렬, 비교 등의 기능들에 대해서는 생략하도록 하겠다. 다시한번 강조하지만, 확실하지 않다면 절대로 강제 형변환을 하지 않도록 하자. CRT에서 제공하는 클래스들 _bstr_t _bstr_t 클래스는 아주 잘 만들진 BSTR 랩퍼 클래스다. 그리고 BSTR의 내부구현이나 기타 등등의 문제를 랩핑 했다. 이 클래스는 여러가지 연산자를 재정의 했을 뿐만 아니라, 사용자의 편의

이미지 리스트에서 하나의 비트맵 이미지를 가져오는 ..

당신은 소중한 사람이 있나요? | 바람전설 http://blog.naver.com/pkl95/40008086966 void GetImageFromList(CImageList *lstImages, int nImage, CBitmap *destBitmap) { //First we want to create a temporary image list we can manipulate CImageList tmpList; tmpList.Create(lstImages); //Then swap the requested image to the first spot in the list tmpList.Copy( 0, nImage, ILCF_SWAP ); //Now we need to get som information about the image IMAGEINFO lastImage; tmpList.GetImageInfo(0,&lastImage); //Heres where it gets fun //Create a Compatible Device Context using //the valid DC of your calling window CDC dcMem; dcMem.CreateCompatibleDC (GetWindowDC()); //This rect simply stored the size of the image we need CRect rect (lastImage.rcImage); //Using the bitmap passed in, Create a bitmap //compatible with the window DC //We also know that the bitmap needs to be a certain size. destBitmap->CreateCompatibleBitmap (t

인라인함수 대 일반함수

NEOJZS :: jazonsim | 자존심 http://blog.naver.com/neojzs/140016270063 프로그래밍을 지도하는 관련된 책들(Code Complete, Effective C++등)을 보게 되면, 인라인 함수에 대한 이야기가 나온다. 무분별한 사용을 하지말라는 이야기이다. 그럼 무분별한 사용이란 무엇일까? 테스트를 통해 해답을 찾아 보자. 주의할 것은 테스트환경은 VC6과 VC.NET 2003이라는 것이다. 그러므로 여기서 해답이라는 것은 이 환경에서의 해답이 되겠다. 테스트를 통해 알아낸 사항은 비교적 단순하다. 코드가 간단하다(라인 2줄이내의 간단한 코드)면 인라인으로 만드는 것이 좋다. (대부분 알고 있는 사항이다) 그렇지만 inline함수로 구현하더라도 inline이라는 키워드를 사용하지 않는 것이 좋다 (컴파일러 최적화 옵션을 다른 식으로 만지지 않는다면..말이다) 결과가 무슨 이야기인가 하면.. 컴파일러 기술이 발전해서 이제는 inline으로 명시되지 않은 곳이라도 컴파일러가 적당히 inline을 해주고 헤더화일에 정의되어 있다고 해서 무조건 inline해주지 않는다는 것이다. 컴파일러가 최적화를 위해 더 좋은 방식을 구현하겠다는데, 프로그래머가 inline이라는 키워드로 그러한 최적화를 방해하는 것이 안 좋다는 것이다. 참고로 대부분의 경우 최적화 옵션에서fast speed보다 small size 옵션이 보다 더 좋은 결과를 준다는 것은 알고 계시지요? 얼핏 생각하면 코드가 짧은 함수들을 모두 inline으로 처리하는 것이 함수 오버헤드를 줄이기 때문에 빨라 질거라 생각할 수 있지만, 멀티 스레드 환경의 운영체제에서는 수행되는 기계어 명령어 숫자만 줄인다고 해서 꼭 속도가 빨라지는 것은 아니다. 각 프로세스 마다 가상메모리를 가지고 여러 프로세스가 동시에 수행되기 때문에 각 가상 메모리들이 하드 디스크와 주 메

[펌]mfc로 만든 ocx를 Explore에서 사용시 뜨는 보안 경고창 없애기

MFC 위저드로 만든 컨트롤을 등록하고 Explore에서 참조하려면 계속 보안 경고창이 떠서 귀찮게 합니다. 익스플로어의 인터넷 옵션의 "보안"의 "이 영역에 적용할 보안수준"부분을 "최소"로 변경하면 해결되지만 그러면 신뢰할 수 없는 사이트에 들어가도 경고를 하지 않으므로 추천할 만한 방법은 아닙니다. 이 문제는 소스차원에서 해결이 가능한 부분으로 아래의 함수를 약간만 수정하면 됩니다. 위저드로 만든 소스를 찾아보면 UpdateRegistry(...)함수가 있을 겁니다. 안에 포함된 내용을 보시면 대략 다음과 같이 되어 있을 겁니다. return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_TESTCTRL, --> 프로그램마다 다름 IDB_TESTCTRL, --> 프로그램마다 다름 afxRegApartmentThreading, _dwTestCtrlOleMisc, --> 프로그램마다 다름 _tlid, _wVerMajor, _wVerMinor); 이 부분을 아래처럼 변경하시면 됩니다. if(bRegister) { BOOL retval = AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_TESTCTRL, IDB_TESTCTRL, afxRegApartmentThreading, _dwTestCtrlOleMisc, _tlid, _wVerMajor, _wVerMinor); // mark as safe for scri

Cannot open compiler intermediate file

다잡아에서 최적화를 시키고 났더니만 멀쩡하던 VC++이 컴파일이 되지 않는게 아닌가? 이곳 저곳을 찾아보니 컴파일에 필요한 임시 파일을 생성하지 못해서 에러가 난것을 알았다. 그래서 시스템의 환경변수를 C:\TEMP로 고쳐서 컴파일을 하니 컴파일이 되었다. 다잡에서 최적화할때 임시폴더를 지워버린 것이다.

릴리즈 모드에서 브레이크 포인트 사용하기

Go TOP !!! | 백귀야행 http://blog.naver.com/jdk7613/100020788390 우연히 얻었는데,..,...쓸만하군요. <요약> 어플리케이션을 릴리즈 모드로 Build 할 때 디버깅 정보를 남기어서 VC++ Debugging Tool에서 디버깅을 가능하게 합니다. 이 방법을 사용하는 경우, 실제 릴리즈 실행 파일은 거의 영향을 받지 않으면서, 디버그에서 브레이크 포인터를 잡거나, Trace를 가능하게 하므로, 릴리즈모드 에서만 발생하는 버그를 잡을수 있습니다. <추가정보>  이 방법을 사용하게 되면 _DEBUG free define으로 포함되는 디버깅 메크로는 포함되지 않으나, Source code안으로 Step in 가능하게 하는 디버깅 정보들은 OBJ와 PDB 파일에 남게 됩니다.  이를 이용하게 되면 VC++ IDE 환경에서 source level 까지의 step in이 가능해 집니다. <방법> 1. Project를 open한뒤 menu 'Project/Settings'를 선택합니다. 2. 'Settings For'를 'Win32 Release'로 선택합니다. 3. 'C/C++' tab에서 'category'를 'General'로 선택하고 'Program Database'로 선택합니다. 4. 'Link' tab에서 'category'를 General'로 선택하고 'Generate debug info'를 체크합니다. 5. 'Rebuild All'를 실행하여서 프로그램을 다시 빌드 합니다. 이제 디버깅 하고자 하는 위치에 브레이크포인터를 잡고 'Go'를 실행하면, 디버깅을 진행할수 있습니다. 출처: 데브피아 .. 장중한

BSTR의 메모리 할당 및 해제

주혀니 in ... | 가을하늘 http://blog.naver.com/mydaylee/140021474733 BSTR을 만들고 COM 개체 간에 전달할 때는 BSTR에서 사용하는 메모리 처리에 주의하여 메모리 누수를 방지해야 합니다. BSTR이 인터페이스 내부에 있을 경우 사용한 메모리는 반드시 해제해야 합니다. 그러나 BSTR 이 인터페이스 외부로 전달되는 경우에는 받는 개체에서 메모리를 관리합니다. BSTR에 대해 메모리를 할당하고 할당된 메모리를 해제하는 일반적인 규칙은 다음과 같습니다. BSTR 인수가 필요한 함수를 호출할 때는 호출하기 전에 BSTR에 대한 메모리를 할당한 후 나중에 해제합니다. 다음 코드에서는 이러한 예를 보여 줍니다. HRESULT IWebBrowser2::put_StatusText( BSTR bstr ); // shows using the Win32 function // to allocate memory for the string: BSTR bstrStatus = ::SysAllocString( L"Some text" ); if (bstrStatus == NULL) return E_OUTOFMEMORY; pBrowser->put_StatusText( bstrStatus ); // Free the string: ::SysFreeString( bstrStatus ); //... BSTR을 반환하는 함수를 호출할 때는 문자열을 직접 해제해야 합니다. 다음 코드에서는 이러한 예를 보여 줍니다. HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr ); //... BSTR bstrStatus; pBrowser->get_StatusText( &bstrStatus ); // shows using the Win32 function // to freee the memory for the string: ::SysFree

** BSP트리구성시 유의할점들... **

카페 > 게임 MOD에 관한 모든것 .. | 늘바나 http://cafe.naver.com/moduser/82 ** BSP트리구성시 유의할점들... ** BSP트리는 잘못구성하게 될경우 최악의 성능을 보장(?)하게 됩니다. 따라서 트리를 구성할 때는 다음과 같은것들을 유의하셔야 합니다. 분할면을 신중하게 선택할것. 분할면을 선택하는 순간이 트리의 질을 결정하는 순간입니다. 이것을 잘못결정할경우 트리가 한쪽으로 치우친다거나 비정상적으로 많은 폴리곤 조각이 생긴다거나 하게되죠. 참고로 퀘이크에서는 대략 다음과 같은것들을 종합적으로 검사해서 평가치를 반환하는 함수를 만들어 사용했답니다. (첨부화일 Solidbsp.c에있는 SelectPartition,ChoosePlaneFromList함수를 참고하세요) 주어진 공간을 균등분할할것 분할면 양쪽에 걸쳐있는 폴리곤의 수가 적을것. xy,yz,zx 평면과 평행할것(axis aligned). 퀘이크에선 각 노드의 분할면이 axis aligned일경우 플래그를 설정,저장하는것을 보아, 이런 노드를 검색할 경우 평면의 방정식을 수행하지 않도록 하는 방법을 사용하는거 같습니다. 월드가 너무 세부적이라면, 트리구성을 위한 별도의 월드를 제작할것. 너무 자세하고 세부적인 월드는 비정상적으로 많은 폴리곤 분할과 쓸데없이 작은 공간들을 만들게 됩니다. 따라서 이때는 별도의 단순버젼을 만들어 트리를 구성하고, 그후에 세부월드의 폴리곤들 각 공간에 배치하는것이 좋습니다. 이렇게 하면 공간의 크기와 복잡도를 적당하게 유지하기가 수월해지죠. 물론 별도의 월드를 제작하는 부담이 있습니다만, 게임은 런타임에서 성능이 최우선이니.. 월드가 너무 방대하거나 탁트여있다면 계층적인 구성을 이용할것. 제목 그대로입니다. 특히, 탁트인 외부공간과 실내공간을 적절히 섞어서

CFileDialog 에서 파일 한번에 여러개 읽기 ..

9992028 블로그 입니다!! | 구리구리 http://blog.naver.com/9992028/120020372939 1. 파일다이얼로그 생성할때 옵션에 아래것 추가하고 .. OFN_NOLONGNAMES | OFN_EXPLORER | OFN_ALLOWMULTISELECT 2.  파일다이얼로그 클래스dlg  의 멤버변수 아래처럼 set한다. CString strFileName; dlg.m_ofn.nMaxFile = 2048; dlg.m_ofn.lpstrFile = strFileName.GetBuffer(2048); 3.  여러개의 파일 읽을때는  POSITION을 이용한다. POSITION pos = dlg.GetStartPosition(); while( pos != NULL ) { CString strFile = dlg.GetNextPathName(pos); ............. }

[C++] Cast에 대해서...

출처 AiWisdom님의 블로그 | 갱주니 원문 http://blog.naver.com/process3/20017834722 캐스트 연산은 주어진 식이 가지고 있는 형을 다른 형으로 강제로 바꾸는것입니다. C++에는 (C 시절부터 존재하는 C 스타일 캐스트를 제외하고) 다음 네 가지 종류의 캐스트 연산이 있습니다. dynamic_cast static_cast reinterpret_cast const_cast dynamic_cast dynamic_cast(e)는 부모 클래스와 자식 클래스의 관계에 있는 포인터 형 사이의 변환 또는 레퍼런스 형 사이의 변환을 수행하는데, 같은 형 사이의 변환 널 포인터의 변환 자식 클래스로부터 부모 클래스로의 변환 과 같은 '뻔한' 경우가 아니라면 e는 다형적 형(polymorphic type; 가상 함수가 포함된 클래스 형)의 좌변값이나 포인터여야 하며, 컴파일시에 변환이 이루어지는 다른 종류의 캐스트 연산과는 달리 실행시에 동적 형(dynamic type)에 근거한 변환이 시도되고, 변환의 성공 여부를 검사하는 의미도 함께 가지고 있습니다. 포인터의 경우 변환이 실패하면 결과값은 널 포인터가 되는데, 이를 if 등의 조건 검사에 활용할 수 있습니다. struct animal { virtual void ~animal(); }; struct dog : animal { void bark(); }; struct cat : animal { void mew(); }; void test(animal* a) { if (dog* d = dynamic_cast(a)) d->bark(); else if (cat* c = dynamic_cast(a)) c->mew(); } 레퍼런스의 경우 변환이 실패하면 헤더에 정의되어 있는 std::bad_cast 예외가 발생합니다. 즉 이는 주어진 변환