when i compile log4cxx i get the same error message :
inputstreamreader.cpp:66: error: 'memmove' was not declared in this scope
can you tell how to fix it?

Try adding to inputstreamreader.cpp a

#include <string.h>

and see if that helps. If it doesn't, search your compiler headers to see where it defines memmove(). Please report the compiler and OS in use, since this does not occur with most compilers.
저작자 표시
Posted by 배고파씨

gcc 4.1.x 버전에서 extra qualification error 관련 해서 포스팅 합니다.

예를 들어 아래와 같은 클래스가 있다고 가정하면

class AClass
{
    public:
             AClass::AClass(){};
             virtual AClass::~AClass(){};
}

gcc (g++) 4.1.x로 컴파일 하면 아래와 같은 애러 메세지가 나옵니다.

error: extra qualification AClass:: on member AClass

4.1.x의 gcc는 위와 같은 코드에서 클래스 멤버 함수 앞에 붙은 제한자에 대해 클래스 명과 네임스페이스명을 구분 하지 못해서
위와 같은 컴파일 애러를 내는 것 같습니다.

해결책은 gcc 3.4 버전을 사용하든지 버그가 수정된 4.1.x 이후 버전을 사용하거나 제한자를 사용 하지 않아야 합니다.

요렇게...

class AClass
{
    public:
             AClass(){};
             virtual ~AClass(){};
}

Posted by 배고파씨

WindowsSDK Visual Studio, Visual Studio Servicepack의 일부 include되는 파일셋은 서로 설치하면서 덮어 써집니다.

 

따라서, 가장 최신에 나온 파일이 가장 나중에 덮어 써지게 설치를 해야 합니다. Visual Studio2008을 예로 들면, 설치 순서는

 

Visual Studio2008 -> Visual Studio SDK 6.1 -> Visual Studio Service pack1 -> Security Update

 

순으로 이루어 져야 합니다.

 

 

특히 예전 Embedded C++로 개발할 때 온갖 툴과 SDK셋들을 설치 했을 때는 Embedded C++툴을 Visual Studio와 함께 설치 오더를 맞추어 줘야 했습니다. 설치 오더가 틀리면, 컴파일이 안되던가, 링크가 안되던가 등등 개발자를 당황스럽게 하는 문제를 발생시킵니다.

 

 

이번에 Visual Studio 2008 Servicepack1용 보안 업데이트인 MS09-035(http://support.microsoft.com/kb/971092)를 설치했을 때 설치 오더가 맞지 않을 경우 컴파일이 안 되는 문제가 있었습니다.

 

 

만일, Visual Studio Servicepack1를 설치한 후 SDK를 설치했을 때, Servicepack1의 최신 CRT파일을 SDK6.1의 구 CRT파일로 교체 된 다음 VisualStudio2008 Servicepack1 ATL보안 업데이트를 하고 나면, vector를 사용한 소스 컴파일 시 아래와 같은 에러가 뜨게 됩니다.

 

error C2039: '_Swap_adl' : is not a member of 'std'    c:\program files\microsoft visual studio 9.0\vc\include\xutility    2764

error C3861: '_Swap_adl': identifier not found    c:\program files\microsoft visual studio 9.0\vc\include\xutility    2764

 

 

문제의 원인은 Visual Studio 2008 설치 후 Servicepack1을 설치해서 최신 CRT셋으로 교체 했지만, 그 후 SDK6.1에 있는 오리지날 Visual Studio2008 파일 셋으로 일부 CRT관련 파일이 롤백 되었고 Servicepack1용 보안 업데이트에서 교체한 CRT파일이 Servicepack1 CRT셋에서 추가된 파일을 사용하기 때문입니다.

 

 

문제 해결 방법은,

 

 

에러 메시지가 나타내주듯, C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility 2764라인에서 사용된 _Swap_adl의 정의를 아래와 같이 _Swap_adl사용 시점 윗부분에 추가해 주던가,

 

// TEMPLATE FUNCTION _Swap_adl

template<class _Ty> inline

void _Swap_adl(_Ty& _Left, _Ty& _Right)

{    // exchange values stored at _Left and _Right, using ADL

swap(_Left, _Right);

}

 

 

에러가 난 시점에서 Servicepack1과 보안업데이트를 순서대로 다시 설치해 주시면 됩니다.

 

 

SDK Servicepack을 설치할 때 설치 오더가 있다는 점을 분명히 알아 두시고, 설치시 Requirement부분을 참고 하시면 도움이 됩니다.

 

마찬가지 이유로, Servicepack, 보안 업데이트로 인해 최신 파일셋이 설치된 다음, SDK 인스톨파일로 SDK 복구를 하게 되면 다시 SDK파일 셋으로 롤백되니 파일셋을 복구 하실 때는 설치 오더를 고려해서 복구를 하셔야 합니다.

출처 : devpia.co.kr(데브피아 VC++ 마을)

Posted by 배고파씨

 방법은 아래 레지스트리에

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\ 이곳에
TabProcGrowth값을 DWORD값으로 생성하고 값은 0으로 해주면 됨.

LCIE라는 기술때문에, 디버깅이 안된다는데...자세한것은 검색-_-;

Posted by 배고파씨
일단 Unix호환 어플리케이션(커맨드 라인 툴 포함)은 전부 Xcode에서 개발, 빌드 및 실행과 디버깅 까지 가능며 몇가지만 알고 계시면 정말 쉽게 이용하실 수 있습니다. 예전에 Unix 어플리케이션 개발을 할때는 KDevelop을 주로 이용했습니다만 맥을 사용한 이후로는 그럴 필요가 없을 정도로 아주 편리하다고 하겠습니다.

먼저 왠만한 Unix프로그램은 처음에 프로젝트 생성하실 때 New Project에서 Command Line Utility 밑의 Standard Tool을 선택하여 프로젝트를 생성하시는 것으로 해결이 됩니다. 지금 올려주신 화면을 보았을 때 unistd.h의 getpid()를 사용하시는 것 같아서 그것만 간단히 pid를 찍는 프로그램을 만들어 봤는데 아무런 설정 없이 잘 컴파일 되고 동작했습니다.

문제는 스탠다드 라이브러리가 아닌 다른 라이브러리를 이용할 때인데, 이 때는 손품을 좀 팔아 주시면 됩니다. Xcode의 메인 프로젝트 창의 왼쪽 Groups & Files의 최상위에 위치한 프로젝트 항목을 오른쪽 클릭하고 Get Info 윈도우를 띄운 다음 Build 탭을 보시면 프로젝트를 빌드하는데 사용되는 각종 옵션들이 많이 있습니다. gcc로 개발을 해 보셨으면 아시겠지만 외부 라이브러리를 이용할 경우 -I, -L, -l 등의 옵션이 반드시 들어가게 됩니다. (순서대로 대문자 아이, 대문자 엘, 소문자 엘 입니다.) 이 옵션이 컴파일러와 링커에게 헤더와 라이브러리 패스 및 링크할 라이브러리를 일러주는데 이 옵션 역시 Build 탭 안에 있습니다.

-I (대문자 아이)와 -L은 Search Path 하위 항목을 보시면 쉽게 찾으실 수 있습니다. (Xcode 2에서는 앞의 하이픈과 옵션까지 적어줬던 것으로 기억하는데 3에서는 잘 모르겠습니다.) 또한 -l의 경우는 (소문자 엘) Linking 밑의 Other Linker Flags에 적어주시면 됩니다.

예를 들어 X11 라이브러리를 이용할 경우
-I/usr/X11/include -L/usr/X11/lib -lx11
gcc에 위와 같은 옵션을 주게 되는데 각각 앞에서 말씀드린 항목에 예쁘게 정자로 적어 주시면 되겠습니다.

그리고 실행에 대한 말씀을 하셨는데 그냥 Run하면 실행됩니다. 혹시 실행 위치라던가 하는 부분도 역시 프로젝트 옵션에서 정해줄 수 있고요, 만약 콘솔이 보고 싶으신 것이라면 Run 메뉴 밑의 Console을 선택하시면 됩니다.

PS) 예전엔 프로젝트 생성하자마자 ZeroLink를 끄는 게 일이었는데 언제부턴가 디폴트로 꺼져 나오더니 3 부터는 아예 안 쓰는 쪽으로 가기로 했나 봅니다.
Posted by 배고파씨

Visual C++ 팀이 Visual C++를 사용하는 개발자 분들이 Internet Explorer 8 설치 후에 겪는 문제에 대해 블로그를 통해 우회 방법을 소개했습니다. 방법은 아래와 같습니다.

- regedit 실행

- “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet
Settings\Zones”에서 “1000” 키 생성

- DWORD 엔트리 생성 (Name=1207, Type=REG_DWORD, Data=0x000000)

Visual C++ 사용하는 개발자가 Internet Explorer 8을 설치하고 나서, Visual Studio에서 마법사를 통해 함수 추가, 변수 추가, Smart Device 프로젝트 생성, Smart Device 클래스 추가 등과 같은 것을 실행할 때 예기치 않은 메시지와 함께 제대로 동작하지 않는 문제가 있습니다. Internet Explorer의 custom security manager 처리에서 순조롭지 않은 일이 발생했다고 하는데, 좀 더 자세한 것은 지켜봐야겠습니다.

Visual C++ Team Blog: http://blogs.msdn.com/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx

IE8 설치 후 Visual Studio에서 변수 추가 실패.doc

Posted by 배고파씨



이와 같이 버튼을 누르면 메뉴가 펼쳐지는 버튼을 많이 보아 왔을 것 입니다.
Visual Studio 2008에 포함되어 있는 MFC Feature Pack에서 이와 같은 기능을 구현 하는 방법을 설명 하겠습니다.

이 기능은 AFX_WM_RESETTOOLBAR 메세지 핸들러를 이용해서 처리 합니다.
이 메세지는 도구모음이 초기화 될때 발생 하는데 MFC Feature Pack의 구조가 메뉴나 도구모음등의 사용자 인터 페이스의
변경 사항을 레지스트리에 저장해 두었다가 그 값을 로드해서 인터페이스를 표시 하기 때문에 소스를 수정해서 인테페이스를 수정 하더라도 레지스트리의 값을 우선 하기 때문에 적용이 되지 않습니다.

그래서 도구모음을 초기화 시키면 발생하는 메세지를 이용해서 처리 하는게 가장 매끄럽다고 생각 됩니다.

그런데 불행이도 AFX_WM_RESETTOOLBAR 메세지 핸들러는 Visual studio에 기본으로 등록 되어 있지 않기 때문에
직접 코딩을 해서 등록 해야 합니다.

CMainFrame 클래스에 메세지 핸들러의 원형과 메세지맵을 등록합니다.

(MainFrm.h)

protected:
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnViewCustomize();
 afx_msg LRESULT OnToolbarCreateNew(WPARAM wp, LPARAM lp);
 DECLARE_MESSAGE_MAP()

 afx_msg LRESULT OnResetToolBar(WPARAM wParam, LPARAM lParam);


(MainFrm.cpp)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
 ON_WM_CREATE()
 ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
 ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
 ON_REGISTERED_MESSAGE(AFX_WM_RESETTOOLBAR, OnResetToolBar)
END_MESSAGE_MAP()

그리고 메세지 핸들러의 함수인 OnResetToolBar에 우리의 목적인 드롭다운 버튼을 생성하는 코드를 작성 하면 됩니다.

(MainFrm.cpp)

LRESULT CMainFrame::OnResetToolBar(WPARAM wParam, LPARAM lParam)
{
 // wParam을 통해서 리셋되는 도구모음의 리소스 ID가 전달 됩니다.
 // 리소스 ID값을 검사 하여 리셋되는 도구모음에 따라서 다른 코드를 적용 하면 됩니다.
 UINT uID = (UINT)wParam;
 if (uID == IDR_MAINFRAME_256)
 {
  CMenu MainMenu;
  MainMenu.LoadMenu(IDR_MAINFRAME);
  CMenu* pMenu = MainMenu.GetSubMenu(0);

  // 도구 모음의 버튼을 다른 스타일로 대체 합니다.
  // 여기서 CMFCToolBarButton의 파생 클래스인 CMFCToolBarMenuButton을 이용해서 메뉴가 있는 드롭다운 버튼으로 대체 합니다.
  m_wndToolBar.ReplaceButton(ID_FILE_NEW, CMFCToolBarMenuButton((UINT)-1, *pMenu, 0, _T("Drop-down button")));
 }
 return 0;
}





어떤가요? 간단 하지 않습니까? ㅎㅎ
들인 노력에 비하면 결과가 만족 스럽다고 할 수 있네요. MFC Feature Pack이 버그도 좀 있고 MS에서 개발한게 아니라 이미 판매되고 있는 다른 회사의 제품을 포함한 것이어서 좀 아쉽기는 하지만 그래도 나름대로 쓸만 하더군요.
Posted by 배고파씨

이번에 나온 리본 UI를 지원하는 Feature Pack은 BCGSoft에서 이미 판매 중인 BCG Library를 가져다 쓴것이라고 합니다.
그런데  메뉴 폰트 크기가 1 pixel 작아서 좀 어색해 보이는데요. 이번에 추가된 afxGlobalData 라는 전역 객체가 있습니다.
이것을 이용해서 메뉴 폰트를 수정 할 수 있습니다.

아래 코드는 시스템의 파라메터에서 시스템의 폰트크기를 가져와서 메뉴 폰트 크기를 수정하는 코드를 추가한 내용 입니다.

(MainFrm.cpp)

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
  return -1;

// 이 부분 추가
 LOGFONT logfont = {0};
 ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0);
 afxGlobalData.SetMenuFont(&logfont, TRUE);


참고로 아래는 데브피아에 올라와 있던 코드 입니다.
폰트의 정보를 시스템파라메터에서 가져오지 않고 직접 설정 하는 예제 입니다.

(MainFrm.h)
...
LOGFONT m_lf;
...

(MainFrm.cpp)

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
    return -1;
 
  //이부분을 추가 (사용할때는 함수를 만들어 처리할것)
 memset(&m_lf, 0, sizeof(LOGFONT));
 m_lf.lfCharSet = 0x81; // 한글 Character Set
 m_lf.lfHeight = 12; // 12 point 크기
 wcscpy_s(m_lf.lfFaceName, _T("굴림"));
 afxGlobalData.SetMenuFont(&m_lf, TRUE);
...

Posted by 배고파씨

const로 정의된 상수에 포인터를 사용할 수 있다. 이때 포인터는 const의 위치에 따라 다르게 처리된다.

1) const 객체에 대한 포인터
일반적인 포인터는 가리키는 객체의 값을 바꿀 수 있다. 하지만 const 객체를 가리키는 포인터는 해당 객체의 값(const 값)을 바꾸지 못한다. c++에서 const 객체를 가리키는 포인터는 대상의 const 성질을 따르도록 하여 이런 특징을 강제한다.

const double *cptr;  // cptr은 const인 double을 가리킬 수 있다.

2) const 포인터
const에 대한 포인터 외에  추가로 const 포인터도 있다. 즉 자신의 값을 바꿀 수 없는 포인터를 의미한다.

int errNumb = 0;
int *const curErr = &errNumb  // curErr은 상수(const) 포인터 이다.

이 정의를 오른쪽에서 왼쪽으로 읽으면 'curErr은 const 포인터이고 int 타입 객체를 가리킨다.'는 것을 알 수 있다.
다른 const와 마찬가지로, const 포인터는 자신의 값을 바꿀 수 없다(즉 다른 객체를 가리키도록 할 수 없다.)

Posted by 배고파씨
일반적으로 윈속2로 개발한다.

#include <WinSock2.h>

#pragma comment(lib, "ws2_32.lib")

이와 같이 추가해 준다.

아니면 #pragma comment(lib, "ws2_32.lib") 대신 프로젝트의 링크 옵션에 ws2_32.lib를 추가해 줘도 된다.
Posted by 배고파씨