libcurl.lib 를 링크하여 사용하는 경우

 

error LNK2019: __imp__curl_global_init
error LNK2019: __imp__curl_global_cleanup
error LNK2019: __imp__curl_easy_cleanup
error LNK2019: __imp__curl_easy_perform
error LNK2019: __imp__curl_easy_setopt
error LNK2019: __imp__curl_easy_init

 

위와 같은 에러 메시지를 보게 될 수 있다.

 

이는 static lib를 사용하겠다는 명시를 하지 않아서 발생하는 에러로 CURL_STATICLIB 를 전처리기에 추가하거나 curl.h include 전에 #define 으로 선언해 주면 된다. 

최근 Database 입력 툴을 만들다 보니 많은 쿼리문을 배열로 묶어서 for문을 이용해 동작시키는 경우가 있어 2차원 배열을 쓰게 되었다.

 

TCHAR *pszQuery[] = {
	"", ""
};
int size;

// 배열 행의 개수
size = sizeof(pszQuery)/sizeof(pszQuery[0]);

// 배열 열의 개수
size = sizeof(pszQuery[0])/sizeof(pszQuery[0][0]);

// 배열 개수
size = sizeof(pszQuery)/sizeof(pszQuery[0][0]);

 

 

이상

 

 

1. 개요

C++/MFC 등의 프로젝트에서 OLE DB를 사용하여 MS-SQL에 직접 연결하고자 하는 경우 연결에 사용하는 문자열을 쉽게 작성하기 위한 방법

 

2. 방법

1. txt파일을 만드시고 이름을 XXXX.udl로 변경

2. 저장한 파일 더블클릭

3. 데이터 연결 속성-공급자 탭에서 Microsoft OLE DB Provider for SQL Server 선택

4. 연결탭에서 서버명과 암호 데이터베이스를 선택한 후 연결테스트

5. 연결테스트가 성공이라면 확인 버튼을 누른 후 실행한 파일을 텍스트 편집기로 읽기

 

[oledb]

; Everything after this line is an OLE DB initstring

Provider=SQLOLEDB.1;Persist Security Info=False;User ID=XXXX;Initial Catalog=XXXX;Data Source=XXXX

 

1. 개요

안드로이드의 마이크로 5핀 단자에 시리얼 통신 장비를 연결 한 후, 안드로이드에서 패킷을 전송하고 수신 받아 화면에 표시하는 예제이다.

 

 

SerialTester.zip

 

1. 개요

 

C/C++ Project 중에서 SNMP를 통해 장비의 정보를 얻어오는 기능이 있다

net-snmp(www.net-snmp.org)라는 Open 소스를 이용하면 되는데, 이 때 장비의 각 성능을 얻어오기 위해 필요한 OID가 있어야 하기에 따로 정리해 두도록 한다.

 

2. OID

 

CPU Statistics

Load
1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1
5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2
15 minute Load: .1.3.6.1.4.1.2021.10.1.3.3

 

[CPU]
percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0
raw user cpu time: .1.3.6.1.4.1.2021.11.50.0
percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0
raw system cpu time: .1.3.6.1.4.1.2021.11.52.0
percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0
raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0
raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0

 

[Memory Statistics]

Total Swap Size: .1.3.6.1.4.1.2021.4.3.0
Available Swap Space: .1.3.6.1.4.1.2021.4.4.0
Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0
Total RAM used: .1.3.6.1.4.1.2021.4.6.0
Total RAM Free: .1.3.6.1.4.1.2021.4.11.0
Total RAM Shared: .1.3.6.1.4.1.2021.4.13.0
Total RAM Buffered: .1.3.6.1.4.1.2021.4.14.0
Total Cached Memory: .1.3.6.1.4.1.2021.4.15.0

 

[Disk Statistics]

The snmpd.conf needs to be edited. Add the following (assuming a machine with a single ‘/’ partition):

disk / 100000 (or)

includeAllDisks 10% for all partitions and disks

The OIDs are as follows

 

Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1
Path of the device for the partition: .1.3.6.1.4.1.2021.9.1.3.1
Total size of the disk/partion (kBytes): .1.3.6.1.4.1.2021.9.1.6.1
Available space on the disk: .1.3.6.1.4.1.2021.9.1.7.1
Used space on the disk: .1.3.6.1.4.1.2021.9.1.8.1
Percentage of space used on disk: .1.3.6.1.4.1.2021.9.1.9.1
Percentage of inodes used on disk: .1.3.6.1.4.1.2021.9.1.10.1

System Uptime: .1.3.6.1.2.1.1.3.0

1. 개요

Dialog 기반 소스 생성 시 Enter, ESC 키를 누르면 다이얼로그가 바로 종료 되는 문제점을 개선해 보도록 한다.

 

2. 소스코드

ResourceView의 다이얼로그를 하나 열고 Ctrl + w 키를 눌르 매니저를 호출한다.

Message Maps에서 Object ID를 다이얼로그 아이디로 선택하고 Messages에서 PreTranslateMessage를 더블클릭하여 함수를 생성한다.

 

BOOL CViewerDlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)
		return TRUE;
	return CDialog::PreTranslateMessage(pMsg);
}

 

 

다음의 소스 코드를 입력한다.

'프로그래밍 > C++' 카테고리의 다른 글

[C/C++ OLE DB] DB 연결 문자열 쉽게 만들기  (0) 2014.04.17
SNMP OID  (0) 2013.10.17
[MFC] 마우스 커서 모래시계(대기) 변경  (0) 2013.06.13
시간 구조체  (0) 2013.04.26
Wininet을 이용한 URL 파일 다운로드  (1) 2013.04.24

 

 

 

 

 

 

 

 

1. 개요

MFC 프로그래밍을 하다 보면 많은 데이터를 화면에 표시하는데 있어 시간이 오래 걸릴 경우 프로그램이 죽지 않았다는 것을 표시하기 위해 많이 쓰는 것이 바로 마우스 커서 모양을 변경 시키는 부분일 것이다. MFC 에서는 아주 간단하게 커서 모양을 모래시계로 바꿀 수가 있다.

 

2. 소스코드

BeginWaitCursor();
Sleep(...)
EndWaitCursor();

위의 소스에서 Sleep 으로 표시 한 부분에 오래 걸리는 작업을 넣어 두면 된다.

단, 위의 소스로 안 되는 경우가 많은데(Thread로 분리해서 사용 하는 경우) 그럴 때는 직접 시작 전에 커서를 바꿔주고, 작업이 종료 되는 시점에서 다시 커서를 변경 해 주면 된다.

HCURSOR hCursor;     
hCursor = AfxGetApp()->LoadStandardCursor(IDC_WAIT);     
SetClassLong(*AfxGetMainWnd(),GCL_HCURSOR,(LONG)hCursor);

작업영역

hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);     
SetClassLong(*AfxGetMainWnd(),GCL_HCURSOR,(LONG)hCursor);

이렇게 하면 커서를 직접적으로 변경하는 것이기 때문에 해당 영역 안에서 커서가 수정이 된다.

'프로그래밍 > C++' 카테고리의 다른 글

SNMP OID  (0) 2013.10.17
[MFC] Enter, ESC 키로 Dialog 종료 방지  (0) 2013.06.28
시간 구조체  (0) 2013.04.26
Wininet을 이용한 URL 파일 다운로드  (1) 2013.04.24
헝가리안 표기법  (0) 2013.04.24

 

 

 

 

 

 

 

 

<ListView

android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000" />

1. 개요
프로그래밍을 하다보면 날짜를 하루 씩 증가 시킬 필요가 발생한다
보통 단순히 날짜에 1씩 증가시키면 되지만.....
만일 한 달이 넘어 간다면?
일 년이 넘어간다면?
2월 윤달이 껴서 29일이 되어 버리면?

이럴 땐 단순하게 1씩 증가해서는 아무 소용이 없어진다.
그렇다고 그걸 예외 처리로 if .. else if 써 가면서 일일히 했다간 머리 깨질 지도....
그런 사람들을 위해 준비했다

 

2. 소스코드

time_t  	ct;			// 현재 시간 값을 저장할 변수
struct tm *tm;	// 현재 시간을 년월일시분 단위로 저장할 구조체(이건 vc에 기본으로 선언 되어 있으니 이대로 쓰면 된다)
CString  	currentTime;		// 현재 시간을 표시하기 위한 변수
TCHAR  week[7][3] = { "일", "월", "화", "수", "목", "금", "토"};	// 요일 표시를 위한 배열

ct = time(NULL);	// 시스템으로부터 현재 시간을 가져와 ct에 저장하는 함수
ct +=  24 * 3600;	// ct에서 하루를 증가 ( 한 시간은 3600 )
tm = localtime(&ct);	// ct 값을 사람들이 알 수 있도록 tm 배열에 저장

// 년도의 경우 1900년을 기준으로 몇 년 흘러 갔는지 저장되므로 1900을 더함
// 달의 경우 0부터 시작하기 때문에 1을 더함
currentTime.Format("%04d년 %02d월 %02d일 (%s요일)", tm->tm_year+1900 tm->tm_mon+1, tm->tm_mday, week[tm->tm_wday]);

3. 구조체 원형 및 저장 된 헤더

 

#include 

struct tm
{
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;
};

 

 

 멤버  의미  값의 범위
 tm_sec  초

 0-61

 tm_min  분  0-59
 tm_hour  시  0-23
 tm_mday  일  1-31
 tm_mon  월  0-11
 tm_year  년(1900 이후)

 

 tm_wday  요일

 0-6

 tm_yday  1월 1일부터 경과 일 수  0-365
 tm_isdst  서머 타임제 실시 여부

 0 이상 : 실시, 0 : 미실시, 0 이하 : 알 수 없음

 

* tm_sec 은 보통의 경우 0 부터 59 까지의 값을 가지게 되겠지만 종종 지구 자전 속도의 차이로 인해서 몇 년 마다 한 번 씩 '윤초' 를 도입하여 시간을 보정하는 경우가 있는데 이 때문에 tm_sec 의 값이 60 혹은 61 이 될 수 있다.

 

 

 

'프로그래밍 > C++' 카테고리의 다른 글

SNMP OID  (0) 2013.10.17
[MFC] Enter, ESC 키로 Dialog 종료 방지  (0) 2013.06.28
[MFC] 마우스 커서 모래시계(대기) 변경  (0) 2013.06.13
Wininet을 이용한 URL 파일 다운로드  (1) 2013.04.24
헝가리안 표기법  (0) 2013.04.24

 

 

 

 

 

 

 

 

1. 개요

프로그래밍 작업을 하다보면 대개 정보를 제공해 주는 서버를 통해 파일을 가져와 파싱해 사용하는 경우가 존재한다.(예를 들어 기상청의 기상정보 xml 파일을 가져온다는 등)

이를 위해 실제 파일을 가져 올 수 있는 함수가 존재하여 포스팅 해보도록 하겠다.

 

2. 소스

HINTERNET   m_hInternet, m_hURL;	// URL 파일 다운에 필요한 핸들
DWORD dwValue = 10000;
HANDLE hFile;	// 다운 받은 파일 저장 핸들
DWORD dwSize = 0, dwRead = 0, dwWritten = 0;

// Set Internet Open
m_hInternet = InternetOpen ("AZITROAPPDOWN", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

 
// Open Option
InternetSetOption (m_hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_CONTROL_SEND_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &dwValue, sizeof(dwValue));
InternetSetOption (m_hInternet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &dwValue, sizeof(dwValue));

// URL Open
m_hURL= InternetOpenUrl (m_hInternet, "파일을 다운 받을 URL 주소", NULL, 0, INTERNET_FLAG_RELOAD, 0);
 

// URL Open 실패를 방지 하기 위한 루틴
TCHAR *szStatusCode = (TCHAR*)malloc(10000);
DWORD dwInfoSize = sizeof(szStatusCode);
HttpQueryInfo(m_hURL, HTTP_QUERY_STATUS_CODE, szStatusCode, &dwInfoSize, NULL);
long nStatusCode = _ttol(szStatusCode);

if(nStatusCode == HTTP_STATUS_OK)
{
	// 다운 받은 파일을 저장할 파일 생성
	hFile = CreateFile (szAlertPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	InternetQueryDataAvailable (m_hURL, &dwSize, 0, 0);	// 파일로 저장할 버퍼 크기 알아냄
	InternetReadFile (m_hURL, pDownBuf, dwSize, &dwRead);	// 알아낸 크기 만큼 읽기(dwRead는 실제 읽은 크기)
	WriteFile (hFile, pDownBuf, dwRead, &dwWritten, NULL);	//  읽은 크기만큼 저장
}
	
// 사용이 끝난 핸들 비우기
InternetCloseHandle (m_hURL);
m_hURL = NULL;
InternetCloseHandle (m_hInternet);
m_hInternet = NULL; 

 

3. 이슈

한글 URL 인식 이슈 : http://blog.naver.com/sin_01/70147909216 참조

'프로그래밍 > C++' 카테고리의 다른 글

SNMP OID  (0) 2013.10.17
[MFC] Enter, ESC 키로 Dialog 종료 방지  (0) 2013.06.28
[MFC] 마우스 커서 모래시계(대기) 변경  (0) 2013.06.13
시간 구조체  (0) 2013.04.26
헝가리안 표기법  (0) 2013.04.24

+ Recent posts