간혹 컴파일 하다보면 이런 경고가 튀어 나올때가 있다. (주로 warning level이 높게 지정된 경우 - 4정도? - 에 튀어나온다)

 

warning C4100: 'argc' : unreferenced formal parameter
warning C4100: 'argc' : 참조되지 않은 형식 매개 변수입니다.

 

한마디로, 선언은 해놨지만 쓰이지 않고 있다는 소리다.

Console 프로그램의 argc, argv같은 경우나, 프로토타이핑할 때 함수나 클래스의 껍데기만 만들다 보면 주로 발생한다.
사실 별로 상관은 없으니까 무시하면 된다...

그러나!! 계속 눈에 거슬리니까 신경 쓰인다. (당신도 변태? -_-+)

이럴땐 UNREFERENCED_PARAMETER(...) 매크로를 사용하자.

 

void SomeFunction(int arg1)
{
    UNREFERENCED_PARAMETER(arg1);
}

실제 구현은 다음과 같다. (winnt.h에 선언되어 있다. windows.h를 include하면 알아서 따라온다.)

 

#define UNREFERENCED_PARAMETER(P)          (P)



출처 : http://blog.daum.net/studiocoma/5960320


by 흥배 2010.01.02 20:00


Windows Server 2003 이후의 OS에서는 애플리케이션이 DLL 128개 이상 로드를 못한다는 것을 아시나요? 전 근래에 우연찮게 트위터의 글을 보다가 알았습니다.

이 때까지 만든 애플리케이션이 128개 이상의 DLL을 로드한 적인 없으니 알도리가 없었죠^^

아래의 글은 128개 이상 DLL을 로드하여 실패가 발생했을 때 해결하는 방법입니다.

 

 

Visual C++ .NET 2003, Visual C++ 2005, 또는 Visual C++ 2008에서 빌드 된 애플리케이션에 128개 이상의 DLL이 포함되는 경우 Windows Server 2003 이후의 OS에서 로드 실패가 발생

 

현상

Microsoft Visual C++ .NET 2003, Microsoft Visual C++ 2005, 또는 Microsoft Visual C++ 2008에서 빌드된 애플리케이션이 128개 이상의 DLL을 로드한 경우 LoadLibrary 함수가 실패한다.

 
이 현상은 Fiber Local Storage(이하 FLS)을 지원했던 Microsoft Windows Server 2003 이후의 OS에서 발생할 가능성이 있다.

 
이 문제가 발생했을 때에 GetLastError 함수에서 얻은 자세한 에러 코드는 다음과 같닫.

 1114 : ERROR_DLL_INIT_FAILED (동적 링크 라이브러리(DLL) 초기화 루틴 실행에 실패했습니다.)

 

 

원인

1 프로세스 마다 FLS의 최대 값은 128이기 때문에 129 이상의 FLS 할당을 하면 이 현상이 발생합니다.

FLS
를 지원하지 않은 OS에서는 Thread Local Storage(이하 TLS)를 사용합니다. Microsoft Windows 2000 이후의 TLS의 최대 값은 1088입니다. FLS은 통상 Fiber 내에 국소적으로 값을 보존하기 위해 사용되어 Thread 보다도 가볍게 처리하므로 TLS 보다도 적은 용량이 설정되어 있습니다.

 

 

회피 방법

애플리케이션에 사용하는 DLL Visual C++ 컴파일 옵션으로 /MT 옵션을 사용하고 있는 경우는 /MD 옵션으로 변경하여 빌드 합니다.

/MT 옵션에서 정적으로 C 런타임 라이브러리를 사용한 경우 각각 모듈마다 C 런타임 라이브러리의 인스턴스가 존재하기 때문에 DLL의 수와 같은 수의 FLS가 할당 됩니다.

 

/MD 옵션으로 동적으로 C 런타임 라이브러리를 사용하는 것에 의해 같은 버전의 C 런타임 라이브러리의 인스턴스가 하나가 되어 FLS DLL의 수에 관계 없이 하나가 할당됩니다.

 

컴파일 옵션의 변경 순서는 다음과 같습니다.

  1. Visual C++ .NET 2003, Visual C++ 2005 또는 Visual C++ 2008의 솔루션 탐색기에서 프로젝트를 연다.
  2. 프로젝트의 [속성 페이지] 다이얼로그 박스를 연다.
  3. [C/C++] 폴더를 클릭한다.
  4. [코드 생성] 속성 페이지를 클릭한다.
  5. [런타임 라이브러리] 속성을 [멀티 스레드 DLL (/MD)] 로 변경한다.

 

 

출처 : http://support.microsoft.com/kb/969933/ja

 

 

by 흥배 2009.12.30 09:00

CAtlMap을 사용할 보통 KEY는 하나의 값을 사용합니다. 그런데 KEY 값이 하나가 아닌 두 개가 되어야 하나의 KEY가 되는 경우가 있습니다.

이럴 때는 KEY가 되는 것을 struct로 정의하고, CElementTraits을 상속 받는 Traits 클래스를 만들어야 합니다.

 

 

#include <atlcoll.h>
#include <boost/functional/hash.hpp>  // hash
를 만들기 위해 사용

// KEY가 될 유저 정의형
struct FRIENDKEY
{
    union
    {
        struct KEY
        {
            INT32    MyID;
            INT32  FriendID;
        };
        KEY Key;
        INT64 nValue;
    };

    FRIENDKEY() : nValue(0) {}
    FRIENDKEY(INT64 _value) : nValue(_value) {}
    FRIENDKEY(INT32 _MyID, INT32 _FriendID)
    {
        Key.MyID = _MyID;
        Key.FriendID = _FriendID;
    }
};

class FriendKeyTraits : public CElementTraits <FRIENDKEY>
{
public:
    static ULONG Hash(const FRIENDKEY& element) throw()
    {
        boost::hash<INT64> hasher;
        return (ULONG)hasher(element.nValue);
    }

    static bool CompareElements(const FRIENDKEY& a, const FRIENDKEY& b)
    {
        return (a.Key.nMyID == b.Key.MyID && a.Key.FriendID == b.Key.FriendID) ? true : false;
    };
};

struct FRIENDPRESENT
{
    INT32    a;
    INT32 b;
    char c;
    INT16 d;
};

 

typedef CAtlMap<FRIENDKEY, FRIENDPRESENT, FriendKeyTraits > MAP_FRIEND;
MAP_FRIEND m_Frinedlist;

 

bool IsExitFriendPresent( INT32 MyID, INT32 FriendID )
{
    FRIENDKEY FriendKey( MyID, FriendID );
    bool bIsExit = m_Frinedlist.Lookup( FriendKey );
    return bIsExit;
}

 

이거 말고 더 좋은 방법이나, KEY로 사용할 값이 3 개 이상인 경우는 어떻게 하면 좋을지 덧글이나 트랙백 부탁합니다.^^

by 흥배 2009.10.22 08:30

Window7 의 새로운 API Direct2D라는 것이 있습니다. 이것은 DirectX2D 기능을 Win32 API로 사용할 수 있는 것입니다.

 

저는 가장 최신의 Windows SDK설치 후 Visual Studio 2010 Beta1에서 Direct2D 예제를 빌드 해보니 빌드는 아주 잘 되었으나 실행이 제대로 되지 않았습니다.

이유는 D2D1CreateFactory 함수에서 에러가 발생했기 때문입니다. 에러는 I_GNOINTERFACE 였습니다. 처음에는 이유를 모라서 헤맸는데 검색을 해보니 인터페이스의 버전이 틀렸기 때문이었습니다.

 

제 PC에는 Windows SDK가 6.0A, 7.0, 7.0A 이렇게 총 3개가 설치 되어있어서 lib 파일과 헤더 파일의 버전이 서로 다르게 링킹 되었던 것 같더군요.

그래서 수동으로 lib 파일과 헤더 파일을 7.0으로 맞추니 문제 없이 실행 되었습니다.

 

Direct2D의 D2D1CreateFactory에서 실패가 발생하는 분들은 헤더 파일과 lib 파일의 디렉터리를 같은 SDK 디렉터리로 맞추면 아마 문제가 없을 것입니다.

by 흥배 2009.09.21 01:59
이전 회에서 이야기 했던 것을 토대로 이번에는 코드로 그것을 보여드리도록 하겠습니다. 이전 글에서 알쏭달쏭 했던 분들은 앞으로 보여줄 코드를 보면 앞의 설명에 대해서 이해할 수 있을 것입니다.

 첫 번째 글이 지루하고 애매했다면 두 번째 글부터 아주 흥미롭고 중요한 이야기가 나옵니다.



Move 생성자와 Move 대입 연산자

기존의 class에서는 복사 생성자와 대입 연산자만 정의할 수 있었지만 RValue Reference에 의해 ‘Move 생성자’와 ‘Move 대입 연산자’라는 것이 생겼습니다.


......계속

by 흥배 2009.05.06 15:06
CAtlMap에 대한 글입니다. 글 내용은 거의다 MSDN에 있는 것입니다.
원래는 좀 더 다듬어서 공개하려고 했는데 다른 일로 계속 바빠서 언제 될지
알 수가 없어서(원래 계획에서 3달째 연기 중이네요) 현재까지 정리한 것만 이라도
먼저 공개하고 다음에 제대로 글 적어서 다시 공개하겠습니다.



오타 수정
InitHashTable()에서 bAllocNow 파라메터 설명이 틀렸습니다.
"true일 때는 초기화 시에 해시 테이블을 할당한다.
그 이외의 경우는 필요에 따라서 테이블리 할당되어 진다." 입니다.
by 흥배 2009.04.30 00:15

이번 회부터 VSTS 2010의 VC++(버전 명으로는 VC++ 10)의 새로운 기능에 대해서 하나씩 설명하려고 합니다. C++의 새로운 표준이될 C++0x의 스펙 중 VSTS 2010에 새로 구현된 것 중 'auto'라는 Keyword를 설명하겠습니다.



정적 언어와 동적 언어의 차이

근래에 Ruby나 Python과 같은 스크립트 언어가 인기를 얻고 있습니다. Ruby나 Python 같은 언어를 '동적 언어' 라고 합니다. 반대로 제가 주로 사용하는 언어인 C/C++는 '정적 언어'라고 합니다.

정적 언어는 변수 type을 정의할 때 명시적으로 지정해야 합니다.
반대로 동적 언어인 Ruby,Python 은 변수 type을 명시적으로 지정할 필요가 없어서 편리합니다.

< Code.1  C/C++과 Ruby에서의 지역 변수 정의 >
- C/C++에서 변수 정의
void BuyItem()
{   
    int Money = 500;
     ........
}

- Ruby에서 변수 정의
def BuyItem
    Money = 500;
    ......
end


내용을 더 보고 싶은 분들은 여기를 클릭해 주세요^^;;




by 흥배 2009.04.23 13:59
녕하세요. 좀 더 빨리 이 블로그를 통해서 인사를 드려야 되는데 이제서야 첫 포스팅을 합니다.

첫 글인 만큼 딱딱한 기술 설명보다는 가벼운 이야기로 시작하겠습니다. ^^

 

 

 

첫 포스팅이니 제 소개를 해야겠죠 ?

제 이름은 최흥배 라고 합니다. 온라인 상에서는 ‘jacking’흥배라는 닉네임으로 활동하고 있습니다. 저는 게임 프로그래머로서 온라인 게임 서버를 개발하고 있습니다. 그래서 저의 주력 프로그래밍 언어는 C++입니다.

C++의 세계는 아주 깊어서 C++ 지식이 아직 부족한 부분이 많지만 열심히 노력한 결과 금년 1월부터 VC++ 분야 MVP가 되었습니다.

 

 

 

제가 VSTS 2010에서 주로 다룰 것은 VC++입니다.

VSTS 2010 공식 팀 블로그에서는 제가 하고 있는 일과 가장 밀접한 VC++에 대해서 주로 포스팅 하려고 합니다. 또 시간이 여유롭지 않아서 가능할지 모르겠지만 VC++ 이외에도 제가 관심을 가지고 있는 Visual Studio Add-In 개발이나 Windows 7 개발에 대한 글도 올려 보도록 노력하겠습니다.

작년 말에 나온 VSTS 2010 CTP판으로 아직 덜 만들어졌고 관련 정보도 많지 않아서 제가 포스팅하는 글이 부실하던가 혹 틀린 부분이 있더라도 넓은 마음으로 용서해 주세요.^^;;

( 제 글에 대한 질문이나 틀린 부분은 꼭 덧글 부탁합니다. )

.............................................


나머지 내용도 보실 분들은 아래 링크를 클릭하세요^^;
http://vsts2010.net/44


by 흥배 2009.04.21 21:52
| 1 ··· 3 4 5 6 |