Native Application

convert char[] to string problem

7월 15, 2016 C# No comments

Fixed된 char[]을 string으로 변환시 \0이 포함되는 문제가 발생됩니다.

char chBuffers[128];
Copy(Chbuffers, “test123”);
String strBuffers = new string(chBuffers);
//strBuffers 에는 “test123\0\0\0\0\0”이 들어가 있음
//strBuffers 에는 “test123\0\0\0\0\0.dcm”이 들어가 있음
strBuffers += “.dcm”;
  • 아래와 같이 Trim(‘\0’)을 수행하여 제거 해 주면 됩니다.

    Encoding .Unicode. GetString(patientName).Trim( ‘\0’);

Binary File Read faster

7월 15, 2016 C# No comments

기존 BinaryReader를 통한 read보다 .Net Framework 4.0에서 새로 지원하는 MemoryMappedFile로 Read시 CPU Performance와 속도가 빠릅니다.

ex) MemoryMappedFile을 이용하여 Read

Reference가 없는 Struct는 자체 Generic Function으로 지원

Reference가 있는 것은 하단과 같이 변환

using( var  mmf = MemoryMappedFile. CreateFromFile(fileName,  FileMode.Open, "MemoryFileID"   ))                                    
{
   using  ( var  accessor =  mmf.CreateViewAccessor())
   {
        long  pos  =  0 ;
        index = accessor.ReadInt32(pos);
        pos  +=  sizeof(Int32);
        dataCount = accessor.ReadInt32(pos);
        pos  +=  sizeof(Int32);

        BookParam = BookStruct.FromMemoryFile(accessor, pos);
        pos += Marshal.SizeOf(typeof   (  BookParam10 ));
        PageParams  =  new PageParam[channelGroupCount];
        int  pageRawSize  =  0;
        int  pageRawTotalSize  =  0 ;
        for  ( int  chn  =  0  ; chn  <  channelGroupCount; chn ++  )
        {
            accessor.Read <PageParam> (pos, out PageParams[chn]);
            pos  +=  Marshal.SizeOf(typeof(PageParam));
            pageRawSize = PageParams[chn].PageCount *  BookParam  .   PageDataLength;
            pageRawTotalSize += pageRawSize;
        }  
        accessor.ReadArray<short>(pos, pPageRawBuffer, 0, pageRawTotalSize);
   }
}

check class instance in runtime

7월 14, 2016 C & C++ No comments

CObject를 상속받은 Class인경우

class Header에

DECLARE_DYNCREATE (CAnalyzeChildFrame) 를 추가하고

구현부에

IMPLEMENT_DYNCREATE (CAnalyzeChildFrame, CMDIChildWndEx) 를 추가 합니다.

비교하고자 하는 부분에서

CObject의 IsKindOf를 활용 Parameter로 RUNTIME_CLASS(CMyClassFrame)을 전달하여 확인 가능 합니다.

ex) MDI구조에서 현재 Active된 ChildFrame이 내가원하는 ChildFrame인지 확인하기
if(pMainFrm ->MDIGetActive()-> IsKindOf(RUNTIME_CLASS (CAnalyzeChildFrame)) == TRUE)
{
    //현재 Active된 ChildFrame이 CAnalyzeChildFrame 이다.
}     

C++ constructor overriding problem

7월 14, 2016 C & C++ No comments

CTest :: Test()
{
    Test ( 1);
}

CTest :: Test( int n)
{
    m_nValue = n;
}

위와 같은 생성자 Overriding시 m_nValue에 1값이 생성되지 않습니다.

Test()에서 새로운 Instance가 생성후 바로 소멸되어 m_nValue는 초기화 되지 않기에 발생되는 문제.

초기화를 위해서는 아래와 같이 this를 통해 직접 호출 해야만 합니다.

CTest :: Test()
{
    this ->CTest :: Test( 1 );
}

c++ json library

7월 14, 2016 C & C++ No comments

쉽게 사용할 수 있는 c++용 json library

1.libjson download ( http://sourceforge.net/projects/libjson/?source=navbar )

2.source파일을 기존 프로젝트에 복사후 import하기

3.Debug모드인 경우 JSON_DEBUG Project속성에 PreDefine 추가

4.Write Sample (int형인경우 json_int_t로 형변환 필요)

JSONNode node ( JSON_NODE);
node.push_back( new JSONNode( "String Node" , "String Value" ));
node.push_back( new JSONNode( "Integer Node" , ( json_int_t) 42 ));
node.push_back( new JSONNode( "Floating Point Node" , 3.14 ));
node.push_back( new JSONNode( "Boolean Node" , true ));
std::string jc = node .write_formatted ();
OutputDebugStringA ( jc. c_str ());

SHFileOperation() tip

7월 14, 2016 C & C++ No comments

SHFileOperation()의 pFrom, pTo를 전달시 CString을 casting하여 전달 or String.GetBuffer()를 통한 전달시 “파일을 찾을 수 없다”라는 Error발생 되는 경우가 발생 됩니다. wchar_t의 wsprintf()를 통한 buffer를 직접 전달하고 전달시 pFrom, pTo마지막에 ‘\0\0’ Double NULL 추가 해줍니다.

wchar_t szToFileName[MAX_PATH ];
wchar_t szFromFileName[MAX_PATH ];
memset(szToFileName , 0 , sizeof (szToFileName));
memset(szFromFileName , 0 , sizeof (szToFileName));

wsprintf (szToFileName, _T("%s" ), dlg. GetPathName());
wsprintf (szFromFileName, _T("%s" ), NDTDataManager:: getInstance().GetSaveDataFileName ());

//복사       
SHFILEOPSTRUCT sh ;
memset(&sh , 0 , sizeof (SHFILEOPSTRUCT));
sh.hwnd = pMainFrm-> GetSafeHwnd();
sh.wFunc = FO_MOVE;
sh.pFrom = szFromFileName;
sh.pTo = szToFileName;
sh.fFlags = 0 ;
if(SHFileOperation (&sh) == 0)
{
      //Move성공시 USS File 삭제
      memset (szToFileName, 0, sizeof( szToFileName));
      wsprintf (szToFileName, _T("%s" ), NDTDataManager:: getInstance().GetSaveUSSFileName ());
      DeleteFile (szToFileName);
}

cl.exe option

7월 14, 2016 C & C++ No comments

기본적으로 알고 있어야 하는 컴파일 및 링크 옵션을 정리하면 아래와 같습니다.

[컴파일 옵션]

/I : 추가 포함 디렉토리 설정
/D : 매크로 설정
/MT : 다중 스레드 정적 버전의 런타임 라이브러리를 사용
/Zi   : 완전한 디버깅 정보를 생성합니다.

[링크 옵션]

/MACHINE: 대상 플랫폼 지정 (X86, X64, IA64)
/OUT: 출력 파일 이름 설정
/LIBPATH: 추가 포함 라이브러리 디렉토리 설정
/DEBUG : 디버깅 정보를 만듭니다.

[매우 단순한 예제]

Sample.lib를 생성하고, main.exe에 링크하는 예제

main.c  Sample.c  Sample.h

해당 파일들을 한 폴더에 몰아놓고..
아래 명령어를 차근 차근 실행한다.

C:> cl  -c  Sample.c
C:> lib  Sample.obj  -OUT:Sample.lib
C:> cl  -c  main.c
C:> link  /OUT:main.exe  main.obj  Sample.lib

그리고, 아래는 컴파일 및 링커 옵션을 활용한 약간 더 복잡한 예제 입니다.

C:> cl /MT /I ".\\" /I "..\\" /D "WIN32" /D "UNICODE" -c Sample.c
C:> lib /MACHINE:X86 /LIBPATH:".\\" /LIBPATH:"..\\"  Sample.obj -OUT:Sample.lib
C:> cl /MT /I ".\\" /I "..\\" /D "WIN32" /D "UNICODE" -c main.c
C:> link /MACHINE:X86 /OUT:main.exe main.obj Sample.lib

cl.exe 실행을 위한 cmd 환경 설정

x86)
%windir%\system32\cmd.exe /k ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall""

x64)
%windir%\system32\cmd.exe /k ""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall"" amd64

class member function pointer

7월 14, 2016 C & C++ No comments

간혹 event 목적으로 function pointer를 사용하기도 합니다.

그런데 class member 를 function pointer로 사용하고 싶어도

static fuction 형태만 call이 가능하고 class member는 function pointer로 사용할 수 없죠.

찾다보니 c++ STL 에서 지원하네요.

1.STL 함수 포인터 선언

typedef std::function<void(int, int)> event_callback2;

2.class member function을 bind하여 전달

//placeholders는 parameter 수만큼 추가
event_callback2 eventCallback = std::bind(&MyClass::ReDraw, this, std::placeholders::_1, std::placeholders::_2);

//function pointer를 이용한 call 이 가능
eventCallback(1, 2);