본문 바로가기

분류 전체보기277

memcmp 바이트 Array 비교를 할 때 사용 C, C++ 표준 함수 중에 memcmp 함수가 존재하다. #include // C++ 에서는 int memcmp(const void* ptr1, const void* ptr2, size_t num); ptr1 이 가리키는 처음 num 바이트의 데이터와 ptr2 가 가리키는 처음 num 바이트의 데이터를 비교하여 이들이 같다면 0 을 리턴하고 다르다면 0 이 아닌 값을 리턴. 이 함수를 사용하는 바이트 Array가 같은지 확인을 할 수 있다. for 문을 돌면서 바이트 하나씩 비교하는 함수를 만들 필요가 없다. 2021. 3. 31.
DNPTIME Convert unsigned int ComputeDayOfYear(unsigned short year, unsigned short mon, unsigned short day ) { return ((mon * 275 / 9) - (((mon + 9) / 12) * (1 + (((year % 4) + 2) / 3))) + day - 30); } void conv_dnp_to_gmt(unsigned char *buf, unsigned short *pSysTime) { unsigned int lsg, msg, lval; unsigned short year=0,mon=0,day=0,hour=0,min=0,sec=0,msec=0; lsg = buf[0] | (buf[1] >24) & 0xff; memcpy(&buf[2], &w.. 2020. 11. 3.
convert time_t to System.Datetime and TimeZoneInfo C#에서 time_t 값을 System.Datetime으로 변경하는 방법과 UTC --> Local Time 변경 방법 time_t ttime; System.DateTime timeUtc = new System.DateTime(1970, 1, 1).AddSeconds(ttime); TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Korea Standard Time"); DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone); time_t는 1970년 1월 1일 기준으로 지난 초를 표시한다. 따라서 System.DateTime의 AddSeconds 함수를 이용해서 컨버를 한다. U.. 2020. 10. 14.
QT Plugins 폴더 Windows 배포 문제 이번에 작업을 하면서 QT가 설치 되지 않는 컴퓨터에서는 DLL을 모두 포함해서 배포를 해서 실행 해도 프로그램이 강제 종료되는 문제가 발생했다. 원인을 파악한 결과 Plugins 폴더를 함께 배포하지 않아서 발생한 것으로 확인 되었다. 그러나 문제는 Plugins 폴더를 실행 파일과 같은 경로에 추가해도 정상 작동을 하지 않는 것이다. 빌드를 할 때 Plugins 폴더 위치가 배포되는 컴퓨터에도 같은 위치에 존재해야만 정상 작동하는 것을 확인 했다. 빌드 할 때 관련 내용이 실행 파일에 포함되기 때문에 문제를 수정하기 위해서는 아래와 같이 소스에 추가를 해야 한다. QApplication a(argc, argv); #if defined(Q_OS_WIN32) //Windows 배포할 때 필요하다. a.a.. 2020. 7. 24.
AfxGetMainWnd() 함수 NULL 리턴 문제 CMainFrame* pFrm = (CMainFrame *)AfxGetMainWnd(); 기존에 잘 사용했는데 갑자기 pFrm이 NULL로 리턴되는 문제가 발생했다. 검색을 해 보니 이런 문제로 올라온 글이 있어서 수정을 했다. 이전과 달라진 부분을 확인해 보니 기존에 OnTimer에서 호출하던 함수를 성능 개선을 위해 Thread를 만들어서 호출하도록 변경을 했다. 이것 때문에 문제가 발생한 것으로 보인다. 아래와 같은 방식으로 사용을 하면 NULL로 리턴을 하지 않는 것을 확인했다. CMainFrame* pFrm = (CMainFrame *)AfxGetApp()->GetMainWnd(); https://frostguy.tistory.com/37 2019. 12. 12.
Switch MDI Active MDI에서 ChildForm이 여러개 존재하는데 그 ChildForm을 사용자가 Active로 변경하고 싶을 경우가 있다. 여러개의 Sub Dialog가 열린 상태에서 Dialog를 선택하면 그 Dialog의 ChildForm이 Active 되게 처리를 해야 하는데 이럴 경우에 MFC에서는 WM_MDIACTIVATE 메시지를 이용해서 처리를 할 수가 있다. 1. 먼저 Sub Dialog에서 포커스를 확인 하는 방법은 OnActivate을 이용한다. - MessageMap에 WIM_ONACTIVATE을 추가한다. - Dialog의 virtual 함수인 OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)를 추가한다. 2. OnActivate함수에서 nSta.. 2019. 11. 15.
Ethernet Status Check WinAPI 참조) https://docs.microsoft.com/ko-kr/windows/win32/api/netioapi/nf-netioapi-getifentry2 GetIfEntry2 function (netioapi.h) Retrieves information for the specified interface on the local computer. docs.microsoft.com https://msdn.microsoft.com/zh-tw/visualc/aa365917(v=vs.90) GetAdaptersInfo function (Windows) The GetAdaptersInfo function retrieves adapter information for the local computer. On Wind.. 2019. 7. 2.
AFX_MANAGE_STATE(AfxGetStaticModuleState()); MFC에서 동적 DLL을 만들고 Dialog 등을 만들어 사용할 때 DLL 함수의 첫 라인에 이 매크로 함수를 써야 한다. 예들들어 Sample Dialog를 만들어 DoModal()로 화면에 표시를 하려고 하는데 DoModal()이 -1로 리턴하며 화면에 표시되지 않는 경우를 확인 할 수 있다. 원인을 찾지 못하다가 타 소스를 참조해서 확인했다. 맨처음 제작했을 때에는 아래와 같이 만들었었다. int ShowSampleDlg() ///< DLL 함수 { CSampleDlg dlg(); int nReturn = dlg.DoModal(); if( nReturn == IDOK ) { } else if( nReturn == IDCANCEL ) { } return nReturn; } 그런데 dlg.DoModal.. 2019. 5. 17.
MFC Error C2248 (CSocket 상속 클래스 사용할 때 에러 발생) 보호되어 있는 글 입니다. 2019. 5. 3.