안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2013년 10월 22일 화요일

[MySql] begin transaction, rollback, commit

MySql 사용 시 백업과 비슷한 방식이다.

Insert, Update, Delete 등과 같이 잘못 사용하면 큰 문제가 일어나는 Query문을 사용할 경우에

자신이 수행한 결과를 다시 Rollback 할 수 있고

제대로 동작했다면 Commit하는 기능을 나타낸다.

Example을 보면 쉽게 이해 할 수 있다.

【예제】
mysql> create table test2 (a int) type=innodb;
Query OK, 0 rows affected (0.01 sec)

mysql> set autocommit=1;  ☜ autocommit의 디폴트값이 '1'이므로  실행하지 
않아도 됨
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test2 values(10);
Query OK, 1 row affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test2 set a=20 where a=10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test2;
+------+
| a    |
+------+
|   20 |
+------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test2;
+------+
| a    |
+------+
|   10 |
+------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test2 set a=20 where a=10;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test2;
+------+
| a    |
+------+
|   20 |
+------+
1 row in set (0.00 sec)

mysql>


현재의 autocommit 상태를 확인하는 방법은 다음 예제와 같다. 【예제】 mysql> select @@session.autocommit; +----------------------+ | @@session.autocommit | +----------------------+ | 1 | +----------------------+ 1 row in set (0.03 sec) mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> select @@session.autocommit; +----------------------+ | @@session.autocommit | +----------------------+ | 0 | +----------------------+ 1 row in set (0.01 sec) mysql>

출처 : http://radiocom.kunsan.ac.kr/lecture/mysql/begin_commit_rollback.html

2013년 7월 25일 목요일

VC6.0 단축키

Shift + Tab : 선택된 줄을 탭 단위로 앞으로 이동

바로 내가 찾던 단축키

그외 단축키는 아래 블로그로 가세요.

http://blog.naver.com/yousilver23?Redirect=Log&logNo=50942552

2013년 7월 23일 화요일

[MySQL] You can't specify target table 'Customize' for update in FROM clause

insert 구문에서 에러가 났다.

에러메시지는 뭔소리인가..
구글링하니 한방에 나옴ㅋ

이 에러는 insert나 update를 하는 경우 서브쿼리의 FROM절에서 target 테이블과 동일한 테이블을 사용할 수 없다는 내용이다.

ㅋㅋ




UPDATE mytable_name
SET a='kim'
WHERE Exists ( SELECT* FROM ( SELECT id
FROM mytable_name
WHERE b=0
LIMIT 2 ) as temp

위와 같이  한 번 더 감싸줘야 한다.

[MySQL] Insert where not exists

Insert into Table1 (col1, col2)
select 'val1', 'val2' from Table2
where not exists
(
      select col1, col2
      from Table
      where col1 = 'val1' and col2 = 'val2'
 )

where not exists 문 아래 select 문에 값이 없을 때
Insert 처리 한다.
do0park.blog.me/40134359319


INSERT INTO propval (tocid, prop_id, pos, str_val)
VALUES (tocid, 1, 0, 'No')
WHERE NOT EXISTS (SELECT * FROM propval WHERE prop_id = 1)

Insert 시 select 쓰지 않는 소스

http://www.dbforums.com/microsoft-sql-server/1640697-insert-where-not-exists.html

위 두 방법이 되지 않는 다면...

INSERT INTO Table(col1, col2, col3) SELECT col1, col2,col3  FROM DUAL WHERE NOT EXISTS ( SELECT col FROM Table WHERE col = val1)

value 대신 Select 문을 사용하여 Insert 진행하고 From Dual 즉 더미 Table 을 적어 주고,

Where not exists 문에 Select 문을 넣으면 동작한다.

2013년 7월 16일 화요일

[MySQL] Insert 와 select 문 같이 써서 Insert 하기

Insert Into Select 를 사용하면 서, ColA 는 1로 넣고 싶을 때
아래와 같이 사용하면 된다.
INSERT INTO MyTable
           
(ColA,
             ColB
,
             ColC
)
SELECT 1,
       colBB
,
       colCC
FROM   MyTable2 

응용하여서, 하나의 칼럼에 Constant 값을 넣고 싶으면
Select 문에 넣고 싶은 칼럼에 Constant를 넣으면 됨

출처 : http://stackoverflow.com/questions/4989583/insert-combine-value-and-select

2013년 6월 26일 수요일

[MFC] MySQL 함수 정리

CString query;
query.Format(" blur blur");

쿼리 실행
ado.ExecuteSQL(query, 0)

검색결과 개수

int count = ado.GetRecordCount();

컬럼 값 구하기
CString temp;
ado.GetFieldValue( column number, temp, _T(""));

다음 값 가져오기
ado.m_ptrRecordset->Moveext();

쿼리값 마지막 찾기
while(!ado.m_ptrRecordset->adoEOF)
{

다음 값 가져오기
ado.m_ptrRecordset->Moveext();
}

[DB] Query 정리

Select

 Select Column From Table where Col1 = xx and Col2 = yy or Col3 = zz

Insert

 Insert Into Table (Col1, Col2, Col3) VALUES (Co1, Col2, Col3)

String의 경우 ' ' 혹은 " " 로 감싸준다. "이순신" '이순신'

Update

Update tabe set col1 = val1 , co2 = val2 where some_col = som_val;

Add a Column

Alter Table contacts Add email VARCHAR(60);

Column 가져오기

Show columns from Table;

2013년 6월 25일 화요일

[C++] Vector Erase

// erasing from vector#include <iostream>#include <vector>int main ()
{
  std::vector<int> myvector;

  // set some values (from 1 to 10)
  for (int i=1; i<=10; i++) myvector.push_back(i);

  // erase the 6th element
  myvector.erase (myvector.begin()+5);

  // erase the first 3 elements:
  myvector.erase (myvector.begin(),myvector.begin()+3);

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}


출처: http://www.cplusplus.com/reference/vector/vector/erase/

2013년 6월 22일 토요일

[MFC] 소멸자에 대해

소멸자를  클래스 헤더와 cpp구현파일에 만드시면 됩니다

*.h파일에서
class Test
{
public:
virtual ~Test(); // 가급적 virtual로 선언 하시길..
};

*.cpp파일에서...
Test::~Test()
{
// delete 리소스
}


출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67426403&qb=bWZjIOyGjOupuOyekA==&enc=utf8&section=kin&rank=2&search_sort=0&spq=0&pid=RNSRM35Y7vZsst0T%2BnZsssssstZ-126518&sid=UcVUNnJvLCkAAHZHGv8

[MFC] unresolved external symbol "public: __thiscall

 이 에러.. 정말 어렵다. ㅠㅠ

아아아아

해결방법이 더 쉬워서 멘붕......

 프로젝트 빌드를 하다보면 특히

svn을 사용해서 하다 보면,

있던 파일이 빠져 버리기도 한다.

새로 추가 된 파일을 Add 하지 않은 상태로

새로 Commit을 할 경우 빠져 버리는 것이다.

이런 경우에

Add files to Projet를 이용해서

해당 Files 를 추가하면 에러가 사라진다....

참조 : http://messier2000.blog.me/90007238675

감사합니다.

[MySQL] substr

db의 claim_data_tbl 테이블의 regdate 컬럼엔

20110111 이란 데이터들이 들어 있다고 하면

select substr(a.regdate,1,6) from claim_data_tbl a

라고 했을 때 201101 까지만 짤려서 나온다.

1번째 글자서부터 6개의 글자를 가져오라는 뜻이다.
출처 : http://blog.daum.net/haha25/5389296

[MySQL] Distinct

 중복된 값을 제거하고 결과를 나타내 준다고 한다.

Select Distinct item from item_list

동일한 이름의 아이템은 제거되고 나옴

DB에 a,a,a,b,b,b,c 들어 있다면

a,b,c 만 출력된다.

[MySql] where not exists

조회시 값이 있으면 insert 하지 않고

값이 없으면 insert하는 문구이다.

select문으로 isert를 하는 부분이 독특하다.

자세한 내용은 아래 블로그로


참조: http://do0park.blog.me/40134359319

좀 더 찾아보니 위의 의미 라기 보단
select column from Table1 where not exists (select * from Table wher T1 = T2)
등과 같이 쓰이는데

 () 안의 쿼리 문이 참이 아닐경우( 해당 하는 데이터가 없을 경우)

앞의 select 를 실행하라는 의미이다.

2013년 6월 12일 수요일

[C언어] printf의 특수문자

printf 내에서 %(퍼센트) 를 출력하려면

두번 적어 줘야 된다.



printf("%%");

출력 결과
%

그 외 특수문자들

\a = 경고 음 소리
\b = 빽스페이스
\f =  폼 피드
\n = 엔터
\r = 케리지 리턴
\t = 수평 탭
\v = 수직 탭
\\ = 백슬러시
\' = 작은 따옴표
\" = 큰 따옴표

2013년 6월 10일 월요일

[MFC] ComboBox

CCombobox m_combo_box;

dropdown의 edit 창의 메세지 얻기
m_combo_box.GetWindowText();

combobox의 item 모두 지우기
m_combo_box.ResetContent();

선택한 라인의 String 가져오기
CString current;
m_combo_box.GetLBText( m_combo_box.GetCurSel(), current);


2013년 6월 5일 수요일

[MFC] UpdateData

UpdateData(TRUE); => UI to Data
UpdateData(FALSE); => Data to UI

2013년 6월 3일 월요일

[MFC] dropdown ombobox의 edit 영역 가져 오기

[MFC]메모 - 리스트 박스 콤보 박스

HINE.egloos.com/1178336
리스트 박스에서 코드로 내용 입력 하기
 - CListBox 객체를 만들고, 객체의 멤버 함수 InsertString, AddStrign 등으로 추가한다.
에디트 컨트롤의 내용을 리스트 박스로 입력하기
 - 에디트 컨트롤에 입력된 문자열을 CListBox 객체의 멤버함수의 인자로 보낸다.
 - 콤보 박스에 입력할때도 같은 방식으로 할 수 있다.
사용예제)
void CListComboView::OnButtonEditToListAdd()
{
 // TODO: Add your control notification handler code here

 UpdateData(TRUE);
 m_clList.InsertString( m_clList.GetCount(), m_csListAddStr);
}
선택된 리스트 박스의 내용을 다른 곳으로 저장하기
 - GetCurSel 함수로 선택된 인덱스를 검색하고, GetText 함수로 원하는 문자열 변수로 저장시켜 준다.
사용예제)
void CListComboView::OnSelchangeList()
{
 // TODO: Add your control notification handler code here
 int index = m_clList.GetCurSel();
 m_clList.GetText(index, m_clkSelected);
 UpdateData(FALSE);
}
리스트 박스의 원하는 문자열을 검색
 -FindString() 함수를 이용한다.


콤보 박스의  Drop List 타입은 콤보 박스 내의 입력이 불가능하게 만들고
Drop Down은 에디트 컨트롤 처럼 입력이 가능하도록 해준다.

DropDown 형식의 콤보박스에서 쓰여진 텍스트를 콤보박스내에 입력하려면
DropDown형식의 콤보박스의 스트링 객체를 추가한 후에 리스트 박스에
문자열을 추가하듯이 하면 된다.
스트링 객체를 추가 하지 않고, GetWindowText 함수를 이용하면 좀더 쉽게 문자열 추가가 가능해진다


리스트박스, 콤보 박스의 삽입 추가는 해당 객체의 멤버 함수를 잘 이용하여야 한다.

출처 : http://valley.egloos.com/viewer/?url=http://hine.egloos.com/1178336

[MFC] DWORD -> CString

CString cstrTemp;
cstrTemp.Format(L"%lu", (ULONG)dword);

안되면

DWORD dwnumber = 1234;
CString csNumber;
csNumber.Format("%lu", dwNumber);

2013년 5월 31일 금요일

[C언어] vector

벡터를 사용하는 이유벡터는 배열과 비슷합니다. 그렇기 때문에 프로그래밍을 한지 얼마 안된 사람들은
벡터를 잘 사용하지 않고, 거의 배열을 사용합니다.

벡터와 배열의 공통점은
- 값이나 요소의 나열을 가질 수 있습니다.
- 그 값을 연속된 메모리에 보관합니다.

그러나 벡터는 배열보다 좀 더 많은 이점이 있습니다.
- 벡터는 값의 추가나 삭제가 배열보다 자유롭습니다.
- 벡터가 가지는 값들의 개수를 알 수 있습니다.
- 벡터가 가져야할 요소의 개수를 선언할 필요가 없습니다.

위의 이점이 가지는 강력함을 프로그래밍을 조금만 해보신 분이라면 충분히 아실 겁니다.


벡터의 정의벡터는 vector 라는 파일안에 정의되어 있습니다.
그렇기 때문에 사용하기 위해서는 vector 헤더를 선언해 주어야 합니다.

벡터의 문법으로는

vector<type> variables;
vector<type> variabels(size);
vector<type> variables(size, initialize elements);
vector<type> variables(vector);

이 있습니다.

벡터의 멤버 함수


저작자 표시

'IT > [C++]' 카테고리의 다른 글

[C++] Friend  (0) 2012/02/20
[C++] Vector  (0) 2012/02/10
[C++] Formatting Output  (0) 2012/01/27

2013년 5월 30일 목요일

[MFC] FindString

FindString의 첫 요소는 index값 두번째는 찾고자하는 검색어이다.

이때, index 를 -1 로 두면 처음 부터 검색하고
0이면 두번째 부터 검색한다.

findstring의 경우, 0으로 입력하여 두번째 부터 검색하더라도
문서의 끝에서 멈추는 것이 아니라
첫번째 값을 검색하지 않았기에 끝까지 검색한후 돌아와서
첫번째 문자 검색 후 종료한다.

즉, 3 을 입력하면 4번째 부터 검색해서, 돌아와서 3번째 값까지 검색한 후
종료 하게 된다.

그리고, FindString의 값을 못찾을 시 반환 값은 -1 이다.

0이 아님으로 주의해서 사용이 필요하다.

2013년 5월 7일 화요일

[MFC] ListCtrl 함수

GetItemCount row 개수를 가져온다.

BOOL DeleteItem(
   int nItem
);
해당 row를 삭제한다.

DeleteAllItems (전체 Row 삭제)

GetItemText - 해당 Row, Col의 Text 가져오는 코드

int GetItemText(
   int nItem,
   int nSubItem,
   LPTSTR lpszText,
   int nLen
) const;
CString GetItemText(
   int nItem,
   int nSubItem
) const;

Parameters

nItem
The index of the item whose text is to be retrieved.
nSubItem
Specifies the subitem whose text is to be retrieved.
lpszText
Pointer to a string that is to receive the item text.
nLen
Length of the buffer pointed to by lpszText.
The version returning int returns the length of the retrieved string.
The version returning a CString returns the item text.

[MFC] ComboBox 속성

DropDown = 키보드 입력 가능
DropList     = 키보드 입력 불가

2013년 5월 6일 월요일

[MFC] Vector

Temp.clear(); 삭제

Temp.push_back(cp_temp) 추가

Temp.pop_back() 마지막열 삭제
//For 문
vector<CString>::iterator start;
vector<CString>::iterator end;

start =Temp.begin();
end = Temp.end();

for(; start < end ; start++)
{
}



참조: http://blog.naver.com/k8154?Redirect=Log&logNo=80124087592

참조: http://www.cplusplus.com/reference/vector/vector/erase/

2013년 3월 14일 목요일

[LibCurl] Rest API의 Attachments 필드에 파일 업데이트하기

http://docs.atlassian.com/jira/REST/latest/#id125223

해당 REST API 중

/rest/api/2/issue/{issueIdOrKey}/attachments

위 명령어가 attachments 에 파일을 올리는 URL 입니다.

그리고, 해당 URL을 사용하여 파일으 업데이트 하는 curl 소스는

curl -D- -u admin:admin -X POST -H "X-Atlassian-Token: nocheck" -F "file=@myfile.txt" http://myhost/rest/api/2/issue/TEST-123/attachments

이며, 위 코드의 각 옵션들을 llibCurl로 변경하면 소스 코드는 완성 됩니다.

-u 즉, User Admin 하는 코드는 CURLOPT_USERPWD 옵션을 사용하면 되고,

-X는 Post, Get 등 전송 방식을 선택하는 것이고, Post 방식임으로

CURLOPT_HTTPPOST 방식을 사용하면 됩니다.

-H 는 User가 정한 Header를 넣는 코드로

CURLOPT_HTTPHEADER 를 사용하면 됩니다.

자세한 사용 방법은 각 Option 을 구글링하면 나오게 됩니다.

그리고, -F는 파일을 업로드 하는 것으로 해당 포스팅이 되겠습니다.

한참 해맸던 문제는 코드 에러가 발생하지 않는데, 전송이 되지 않는 것이었습니다.

/* Fill in the file upload field */
 curl_formadd(&formpost,
  &lastptr,
  CURLFORM_COPYNAME, "file",
  CURLFORM_FILE, "abcd.jpg",
  CURLFORM_END);

해당 코드가, 파일 업로드를 하는 필드입니다.

위 방식으로 하면 되는데, 이 때 주의점이

CURLFORM_COPYNAME 필드의 "file" 즉, 이 file 이

curl 명령어의 ""file = @myfile.txt"" 의 file 즉, filename 필드명을 적어 줘야 합니다.

COPYNAME 필드를 file이 아닌 다른 이름으로적으면 filename field를 찾지 못해

파일 전송이 되지 않는 것입니다.

참조 : http://parangbook.tistory.com/193 => filename file와 COPYNAME field 이름 통일을 알게 해준사이트

http://cboard.cprogramming.com/networking-device-communication/76842-file-upload-libcurl.html

=> file 전송에 대한 예시가 있는 사이트

2013년 2월 15일 금요일

[펌] UTF-8 인코딩 및 여러 가지 인코딩 방법

문자열을 인코딩 하는 방법은 여러가지가 있습니다..
가장 널리 알려진 방법으로는

유니코드 -> 멀티바이트
1
2
3
4
5
wchar_t strUnicode[256] = {0,};
char    strMultibyte[256] = {0,};
wcscpy_s(strUnicode,256,L"유니코드");
int len = WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, NULL, 0, NULL, NULL );    
WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, strMultibyte, len, NULL, NULL );
stl이용
1
2
3
4
wstring strUni = L"유니코드";
int len = WideCharToMultiByte( CP_ACP, 0, &strUni[0], -1, NULL, 0, NULL, NULL );
string strMulti(len,0);
WideCharToMultiByte( CP_ACP, 0,  &strUni[0], -1, &strMulti[0], len, NULL, NULL );

멀티바이트 -> 유니코드
1
2
3
4
5
wchar_t strUnicode[256] = {0,};
char    strMultibyte[256] = {0,};
strcpy_s(strMultibyte,256,"멀티바이트");
int nLen = MultiByteToWideChar(CP_ACP, 0, strMultibyte, strlen(strMultibyte), NULL, NULL);
MultiByteToWideChar(CP_ACP, 0, strMultibyte, strlen(strMultibyte), strUnicode, nLen);
stl이용
1
2
3
4
string strMulti = "멀티바이트";  
int nLen = MultiByteToWideChar(CP_ACP, 0, &strMulti[0], strMulti.size(), NULL, NULL);
wstring strUni(nLen,0);
MultiByteToWideChar(CP_ACP, 0, &strMulti[0], strMulti.size(), &strUni[0], nLen);

유니코드 -> UTF-8
1
2
3
4
wchar_t strUni[256] =L"유니코드";
char strUtf8[256] ={0,};
int nLen = WideCharToMultiByte(CP_UTF8, 0, strUni, lstrlenW(strUni), NULL, 0, NULL, NULL);
WideCharToMultiByte (CP_UTF8, 0, strUni, lstrlenW(strUni), strUtf8, nLen, NULL, NULL);

UTF-8 -> 유니코드로 변환
1
2
3
4
5
    wchar_t strUnicode[256] = {0,};
char    strUTF8[256] = {0,};
strcpy_s(strUTF8,256,"utf-8글자..");// 이건 사실 멀티바이트지만 UTF8이라고 생각해주세요 -_-;;
int nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, strlen(strUTF8), NULL, NULL);
MultiByteToWideChar(CP_UTF8, 0, strUTF8, strlen(strUTF8), strUnicode, nLen);

기본적으로 UTF-8로 변형할땐 유니코드 상태에서만 변형을 시켜야 된다!.
 만약 멀티 바이트를 UTF-8로 변형하고 싶을때에는
   멀티바이트 -> 유니코드(UTF-16) -> UTF-8
UTF-8을 멀티바이트로 변형할때에는
   UTF-8 -> 유니코드(UTF-16) -> 멀티바이트..
 


그런데 위와 같은 방식은.. 윈도우 환경에서만 사용한다면 너무 복잡하다...

우리 위대하신 MS에서 만들어주신게 있는데..
1
2
3
4
5
6
7
8
9
10
11
12
#include <atlstr.h> // 요기에 정의..  이거하면 MFC사용안하고도 CString를 사용할수 있다
void main()
{
  wstring strUni = CA2W("멀티바이트를 유니코드로 변환");
  string strMulti = CW2A(L"유니코드를 멀티바이트로 변환");
  string strUTF8 = CW2A(L"유니코드를 UTF8로변환",CP_UTF8);
  //string에서 포인터 얻어오는게 c_str()이듯.
  //CA2W나 CW2A에서 포인터 얻어오는건 m_psz 이다..
  //그리고 CA2W CW2A는 기본적으로 CString 즉 (CAtlString)에 기반을 두고 고 있기때문에.
  //CString를 사용할때 가장 빠른다!!.
  // 만약 멀티 플레폼을 기준으로 한다면 CA2W는 사용 못함!
}

사용하기도 쉽고 속도면에서 MultiByteToWideChar,WideCharToMultiByte 보다 빠르다...

이카르트님 감사합니다.

출처 : http://icartsh.tistory.com/13

2013년 2월 13일 수요일

Json Example (Json 포멧)

JSON (JavaScript Object Notation)

JSON is an extremely light text-based open standard designed for human-readable data. It originates from the JavaScript language and is used representing simple data types, arrays and associative arrays (called objects).

JSON Example

ArrayArray elements are generally of a basic type (number, string, boolean, or null), however can also be a nested array or object (see Data Structures). Elements are comma-delimited and contained within brackets.
myArray = [ "John Doe", 29, true, null ]
myArray = [ [], {} ]
myArray[2] returns true

Array with objectsThis array contains comma-delimited objects which each contain multiple comma-delimited key:value pairs. Objects within an array can be accessed using the array name and index.
myArray = [
 { "name": "John Doe", "age": 29 }, 
 { "name": "Anna Smith", "age": 24 }, 
 { "name": "Peter Jones", "age": 39 }
]
myArray[0].name returns John Doe

ObjectThis object contains multiple comma-delimited key:value pairs. Object properties can be accessed using the the object name followed by a period and property name -or- can be accessed like an array using the property name in quotes (in place of an index).
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true
}
myObject.salary returns 70000
myObject["salary"] returns 70000

Object with nested arrayThis object contains multiple comma-delimited key:value pairs and a nested array. The nested array can be accessed with the object name, property or 'key' containing the array and an array index.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ]
}
myObject.interests[0] returns Reading
myObject["interests"][0] returns Reading

Object with nested objectThis object contains multiple comma-delimited key:value pairs and a nested object. To access an object within an object, property names or 'keys' can be chained together -or- property names can be used like an array in place of indexes.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "favorites": {
  "color": "Blue",
  "sport": "Soccer",
  "food": "Spaghetti"
 } 
}
myObject.favorites.food returns Spaghetti
myObject["favorites"]["food"] returns Spaghetti

Object with nested arrays and objectsThis object is more complex and typical of what might come from an API. It contains key:value pairs, nested arrays and nested objects. Any of its elements can be accessed with a combination of the above techniques.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ],
 "favorites": {
  "color": "Blue",
  "sport": "Soccer",
  "food": "Spaghetti"
 }, 
 "skills": [
  {
   "category": "Javascript",
   "tests": [
    { "name": "One", "score": 90 },
    { "name": "Two", "score": 96 }
   ] 
  },
  {
   "category": "CouchDB",
   "tests": [
    { "name": "One", "score": 79 },
    { "name": "Two", "score": 84 }
   ] 
  },
  {
   "category": "Node.js",
   "tests": [
    { "name": "One", "score": 97 },
    { "name": "Two", "score": 93 }
   ] 
  }
 ]
}
myObject.skills[0].category returns Javascript
myObject["skills"][0]["category"] returns Javascript
myObject.skills[1].tests[0].score returns 79
myObject["skills"][1]["tests"][0]["score"] returns 79

Data Structures

Numbervar myNum = 123.456Double precision floating-point format in JavaScript; generally depends on implementation.
Stringvar myString = "abcdef"Series of characters (letters, numbers, or symbols); double-quoted UTF-8 with backslash escaping.
Booleanvar myBool = true(true or false)
Arrayvar myArray = [ "a", "b", "c", "d" ]Sequence of values, comma-separated and enclosed in square brackets; values don't need to be of the same type.
Objectvar myObject = { "id": 007 }Unordered collection of key:value pairs; comma-separated and enclosed in curly braces; the should be strings and be distinct.
Nullvar myNull = null(empty)

JSON Resources

JSONLintJSON validator


출처 :http://www.jsonexample.com/

Array

myArray = [ "John Doe", 29, true, null ]
myArray[2] returns true 

Array 형식은 myArray[0] ,myArray[1] 처럼 평소 사용하던 Array 사용 방법으로 사용할 수 있다.
0은 John Doe, 1 은 29를 반환한다.

Array with objects

myArray = [
 { "name": "John Doe", "age": 29 }, 
 { "name": "Anna Smith", "age": 24 }, 
 { "name": "Peter Jones", "age": 39 }
]
Array에 Object를 넣는 방법이다.

myArray[0].name returns John Doe
myArray[1].age 는 24를 return 하게 된다.

Object

object는 ":" 값을 기준으로 Key 값과 실제 값으로 매칭된다.
myObject = { "first": "John", "last": "Doe", "age": 39, "sex": "M", "salary": 70000, "registered": true }
myObject.salary returns 70000 myObject["salary"] returns 70000
위 두가지 방법으로 각각의 object를 추출 할 수 있다.
myobject.first 는 John을 반환하고,
myObject["first"] 로도 John을 반환할 수 있다.

Object with nested array

iterests 를 보면, interest 키 값에 Array가 대응될 수 있음을 알 수 있다.
myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ]
}
myObject.interests[0] returns Reading
myObject["interests"][0] returns Reading 
 
Object with nested arrays and objects

myObject = {
 "first": "John",
 "last": "Doe",
 "age": 39,
 "sex": "M",
 "salary": 70000,
 "registered": true,
 "interests": [ "Reading", "Mountain Biking", "Hacking" ],
 "favorites": {
  "color": "Blue",
  "sport": "Soccer",
  "food": "Spaghetti"
 }, 
 "skills": [
  {
   "category": "Javascript",
   "tests": [
    { "name": "One", "score": 90 },
    { "name": "Two", "score": 96 }
   ] 
  },
  {
   "category": "CouchDB",
   "tests": [
    { "name": "One", "score": 79 },
    { "name": "Two", "score": 84 }
   ] 
  },
  {
   "category": "Node.js",
   "tests": [
    { "name": "One", "score": 97 },
    { "name": "Two", "score": 93 }
   ] 
  }
 ]
}
myObject.skills[0].category returns Javascript
myObject["skills"][0]["category"] returns Javascript
myObject.skills[1].tests[0].score returns 79
myObject["skills"][1]["tests"][0]["score"] returns 79

위와 같이 복잡한 관계도 만들어 낼 수 있다.

기본 개념은 Array와 Object를 이용하여, Data를 Object Oriented 하게 만들어 내는 것인 듯 하다.

2013년 2월 7일 목요일

UTF-8 에서 한글 깨짐 문제 처리

UTF-8 에서 한글이 깨져서 나오는 문제를
Ansi(EUC-KR)로 바꿔서 처리하는 코드입니다.

#include <WTypes.h >
#include <oleauto.h>

위 두 헤더 파일을 include 하고,

char* UTF8ToANSI(char *pszCode)
{
    BSTR    bstrWide;
    char*   pszAnsi;
    int     nLength;
    // Get nLength of the Wide Char buffer
    nLength = MultiByteToWideChar(CP_UTF8, 0, pszCode, lstrlen(pszCode) + 1,
                                  NULL, NULL);
    bstrWide = SysAllocStringLen(NULL, nLength);
   // Change UTF-8 to Unicode (UTF-16)
    MultiByteToWideChar(CP_UTF8, 0, pszCode, lstrlen(pszCode) + 1, bstrWide,
                       nLength);
    // Get nLength of the multi byte buffer
    nLength = WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, NULL, 0, NULL, NULL);
    pszAnsi = new char[nLength];
    // Change from unicode to mult byte
    WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL);
    SysFreeString(bstrWide);
    return pszAnsi;
}

해당 코드를 추가 하면 됩니다.

이틀을 찾아 해메던, 한글 깨짐 문제를 드디어 해결하였습니다.

사랑합니다. 이광진님

출처: http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=657497&ref=657497

2013년 2월 6일 수요일

[LibCurl] 로그인 예제

/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at http://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
/* Include libraries */
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
size_t func( void* ptr, size_t size, size_t nmemb, void* stream);
int main(void)
{
  CURL *curl;
  CURLcode res;
  char* header;
  char* body;
  header = (char*)calloc(100000, sizeof(char));
  body = (char*)calloc(100000, sizeof(char));
  curl = curl_easy_init(); // Initialization 코드
  if(curl) {
// ID PWD 항목에 해당 ID와 PWD를 넣으면 알아서, ID PWD를 넣어준다.   
// curl_easy_setopt(curl, CURLOPT_USERPWD, " ID : PWD");
// URL 을 사용하는 코드 example.com에 해당 URL 을 넣으면 URL 을 저장한다.
    curl_easy_setopt(curl, CURLOPT_URL, www.example.com);
// FOLLOWLOCATION을 1로 보내면, Redirection 을 모두 따라 간다.
 curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); // Allow redirection
// 아래 두 줄은 Post 메세지에 메세지를 실어 보내기 위한 방법이다.
// curl_easy_setopt(curl, CURLOPT_POST, 1);
// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "ID : PWD");

//WriteFunction 에 Function 등록하면 Callback으로 메세지를 받게 된다.
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, func);
//WriteHeader 옵션으로 헤더 받음
    curl_easy_setopt(curl, CURLOPT_WRITEHEADER, header);
//WriteData 옵션으로 데이터 받음. WriteFunction의 Callback 메세지를 Header와 Body로
//나누어 받은 것
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, body);
// 위에 입력한 옵션들을 실행하는 함수
    res = curl_easy_perform(curl);
    /* always cleanup */
//함수 실행 후 종료 (메모리삭제)
    curl_easy_cleanup(curl);
  }
  printf("\n\nHEADER is\n%s\n\n\n", header);
  printf("\n\nBODY is\n%s\n\n\n", body);
  free(header);
  free(body);
  return 0;
}
size_t func( void* ptr, size_t size, size_t nmemb, void* stream)
{
        strncat( (char*)stream, (char*)ptr, size*nmemb);
        return size*nmemb;
}

2013년 1월 31일 목요일

[HTTP] GET, PUT, POST 방식의 차이점

GET, POST 방식의 경우는 원하는 정보를 요청하는 방식이지만,

PUT은 직접적으로 바꿀 수 있는 방식이라고 합니다.

자세한 내용은 http://blog.naver.com/yukimaro?Redirect=Log&logNo=10025580067

을 참조하세요.

[JSON] JSON에 대해

JSON에 대해 아는 만큼 알려드리겠습니다.

JSON은 HTML과 비슷하게, 서버와 클라이언트 간에

정보를 주고 받는 규약으로 생각 됩니다.

JSON Form에 맞춰서 전송하면,

JSON을 이용하는 홈페이지에 해당 정보를

저장할 수 있게 되는 것입니다.

홈페이지에서 더 자세한 내용을 살펴 보세요.

http://www.json.org/json-ko.html

2013년 1월 28일 월요일

shell32.lib(shguid.obj) : fatal error LNK1103: debugging information corrupt; recompile module

위 링크 문제는 VC 6.0 에서 발생할 가능성이 높다.

Windows Platform SDK 내의 shell32.lib 파일과

Visual Studio 6.0 내의 Shell32.lib 파일의 버전이 다를 경우 생기는 문제이다.

해결 방법은 Visual Studio 6.0 내의 Shell32.lib 파일을 PSDK 의 lib 폴더의

shell32.lib 파일에 덮어쓰면 Visual Studio 6.0 호환 lib 파일로 바껴 문제가 해결된다.

PSDK의 lib 파일이 사라지는 게 찝찝하다면, 다른 이름으로 저장해 놓고,

덮어쓰기 문제 때문에 나타났다고 생각된다면 다시 복원해 보기 바랍니다.

2013년 1월 25일 금요일

zlib1 과 libcurl 연동 시 Ordinal 55 문제 해결

참조 : http://fourthslap.blogspot.kr/2011/12/using-libcurl-in-cc-program.html

ordinal 55 coun't not be located in dynamic link library zlib1.dllthen try downloading and adding zlib1.dll file from this link. 
위 링크에 나온 zlib1.dll 파일을 받아서 설치하면 해결 됩니다.

libcurl zlib1.dll 연동 문제 Ordinal 73 에러

Ordinal 73 에러가 나타난다면, zlib1.dll 의 파일이 예전 파일이라서 나타나는 것입니다.

error C2265: '' : reference to a zero-sized array is illegal

출처 : http://hopi.tistory.com/18
http://blog.naver.com/kkn2988?Redirect=Log&logNo=38170248

배열을 0으로 할당하면 다음과 같은... reference to a zero-sized array is illegal 에러 문구가 나오나요?

..  PROGRAM FILES\MICROSOFT PLATFORM SDK\INCLUDE\wspiapi.h  파일의

template <typename __CountofType, size_t _N>
char (&__wspiapi_countof_helper(__CountofType (&_Array)[_N]))[_N];
 이부분을 컴파일 할때

error C2265: '<Unknown>' : reference to a zero-sized array is illegal 이런 에러가 납니다.




답 :
/D "_WSPIAPI_COUNTOF"

C/C++ 옵션에 저 구문을 추가해 주세요 :)
SDK를 설치하면 발생하는 문제랍니다.


위치 : Project Settings -> C/C++ -> Category(General)

Project Opitions에
/D "_WSPIAPI_COUNTOF"
추가 후 재컴파일하면 됩니다.

Unresolved Externals 해결 방법

참조 : http://www.chilkatsoft.com/p/p_124.asp

Win32 Visual C++ 링커 문제를 해결하는 방법을 알려드립니다.

아래와 같이 문제가 있을 때,

ChilkatDbgDll.lib(CryptoSP.obj) : error LNK2001: unresolved external symbol __imp__CryptAcquireContextA@20
ChilkatDbgDll.lib(Hashing.obj) : error LNK2019: unresolved external symbol __imp__CryptGetHashParam@20 referenced in function "public: bool __thiscall Hashing::hashSha1(class DataBuffer const &,class DataBuffer &,class LogBase &)" (?hashSha1@Hashing@@QAE_NABVDataBuffer@@AAV2@AAVLogBase@@@Z)
ChilkatDbgDll.lib(Hashing.obj) : error LNK2019: unresolved external symbol __imp__CryptDestroyHash@4 referenced in function "public: bool __thiscall Hashing::hashSha1(class DataBuffer const &,class DataBuffer &,class LogBase &)" (?hashSha1@Hashing@@QAE_NABVDataBuffer@@AAV2@AAVLogBase@@@Z)

여기에는 몇개의 unresolved 한 함수가 있습니다.
CryptAcquireContextA
CryptGetHashParam
CryptDestroyHash

등인데요. ( "___imp___" 와 "@" 뒤에 나오는 쓰레기 값들은 그냥 C++에서 이름을 알아 보기 힘들게 만들어 놓은 거니깐 무시하세요)
A로 끝나는 함수는 ANSI version의 함수고, W로 끝나는 것은 Unicode 버전 입니다.

A 와 W 를 없애면
CryptAcquireContext
CryptGetHashParam
CryptDestroyHash

함수가 나타나는데, 이제 검색엔진을 이용해서 위 함수를 검색하세요.
search engine (Yahoo, Microsoft, Google, etc.) "site:microsoft.com"
등에서 MSDN result 페이지가 나오면, 맨 밑의 Requirements 세션으로 가서,
무슨 Library가 필요한지 찾아서, VC++ Project에 add 하면 됩니다.

libcurl 설치 중 Libcurl.dll 빌드 시 문제

Linking...
   Creating library DLL-Debug/libcurld_imp.lib and object DLL-Debug/libcurld_imp.exp
md5.obj : error LNK2001: unresolved external symbol __imp__CryptCreateHash@20
md5.obj : error LNK2001: unresolved external symbol __imp__CryptAcquireContextA@20
md5.obj : error LNK2001: unresolved external symbol __imp__CryptHashData@16
md5.obj : error LNK2001: unresolved external symbol __imp__CryptReleaseContext@8
md5.obj : error LNK2001: unresolved external symbol __imp__CryptDestroyHash@4
md5.obj : error LNK2001: unresolved external symbol __imp__CryptGetHashParam@20
DLL-Debug/libcurld.dll : fatal error LNK1120: 6 unresolved externals
Error executing link.exe.

Unresolved Externals 문제는 환경 세팅 (lib 파일을 제공하지 않는 문제) 로 인해 발생하는 거 같습니다.
위 문제에 대한 해결책을 제시합니다.

Project -> Settings -> Link -> Object/library modules 에

Windows Server Platform SDK 의 AdvAPI32.lib 파일을 추가합니다.

아래의 Windows Server Platform SDK를 참조하세요.

http://dreamchallenger.blogspot.kr/2013/01/msvc-60-windows-server-psdk.html

MSVC 6.0 용 Windows Server PSDK 설치 방법

http://social.msdn.microsoft.com/Forums/en/windowssdk/thread/e1147034-9b0b-4494-a5bc-6dfebb6b7eb1

위 사이트가 MSVC 6.0에서 사용할 수 있는 마지막 PSDK

Microsoft Platform SDK Febuary 2003 (Last version with VC6 support)

을 받을 수 있는 사이트 입니다.

다운 받은 후,

cmd 창을 넣어, 다운 받은 폴더로 이동 후

PSDK-FULL Setup Folder 하면 설치파일이 인스톨 됩니다.

예) PSDK-FULL C:\

이렇게 하여, 다운로드 후, setup 파일을 클릭하면 Setup 할 수 있는

인터넷 창이 나타나고, 거기서 Install 하면 됩니다.

Install 완료 후에는,

MSVC 6.0에 환경 설정을 해야 합니다.

MSVC 6.0 -> Tool -> Option -> Directories 로 이동하여,

Include Files 항목에

설치 된 경로의 Include 폴더를 넣은 후, 맨 위로 올립니다.

예) C:\Program Files\MICROSOFT PLATFORM SDK\INCLUDE

library Files 항목에

설치 된 경로의 Lib 폴더를 넣은 후, 맨 위로 올립니다.

이제, Windows Server PSDK 를 사용할 수 있습니다.

2013년 1월 17일 목요일

[MFC] OnEraseBkgnd 사용해서 배경화면 그리기

 각탭을 구성하는 대화상자인 TabView1, TabView2 의 배경색을 
 변경하고자 한다면 OnPaint 가 아닌 OnEraseBkgnd 함수에서 하셔야 합니다. 

 WM_ERASEBKGND 메시지는 대화상자기반에서 클래스위저드 목록에 나오지않습니다. 하지만, 설정
 만 조금 바꾸시면 사용하실수 있습니다. ^^;; 일단, 클래스 위저드를 실행하고.. class info 탭을 
 선택하고, Message filter를 Dialog에서 window로 바꾸어 주시고 다시 Message Maps에 가시면 
 해당 메시지가 보일겁니다... ^^;

출처 : http://www.tipssoft.com/bulletin/board.php?bo_table=QnA&wr_id=10381

위와 같이 WM_ERASEBKGND 메세지를 이용하여,
OnEraseBkgnd를 사용한다.

BOOL CHoneybeeView::OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
 CBrush backBrush(RGB(255, 255, 255)); // <- 흰색칼러로.
 CBrush* pOldBrush = pDC->SelectObject(&backBrush);
 CRect rect;
 pDC->GetClipBox(&rect);
 pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
 pDC->SelectObject(pOldBrush);

 return TRUE; //흰 배경이 아닌 배경을 그리면 true, 흰 배경 false
}

OnEraseBkgnd 함수에 위와 같이 넣으면, RGB 컬러로 배경이 지정되게 된다.

OnEraseBkgnd는 OnDraw와 달리, 배경을 그려주는 것이라서,

새로 배경을 그리게 될 때, 다른 탭 위에 나타나지 않는 듯하다.

OnDraw의 경우, 새로 그릴 때, 탭 위에 잠시 나타났다 사라지지만,

OnEraseBkgnd의 경우는 그렇지 않다.

2013년 1월 16일 수요일

[MFC] Bitmap의 크기 알아내는 방법

비트맵 이미지 크기를 알아 낼 수 있다. 가로, 세로... 즉, 이미지 사이즈.

[Source Code]        :
     CBitmap m_bitmap;
     m_bitmap.LoadBitmap(IDB_BITMAP1);     // 비트맵 로드...
        :
     BITMAP bmp;
     m_bitmap.GetObject(sizeof(BITMAP), &bmp);   // 비트맵 오브젝트

    // bmp.bmWidth, bmp.bmHeight  이용하여 가로, 세로 크기 알수 있다....

     //CString str;                   // 확인을 위해서.... 메세지 박스로...  여기서 부터는 사실상 필요 없는 코드...
     //str.Format("%d, %d", bmp.bmWidth, bmp.bmHeight);
     //AfxMessageBox(str);          
출처 : http://i0nucleus.egloos.com/2737113

[MFC] Bitmap 출력하기

BITMAP
DIB(Device Independent Bitmap, *.bmp)
- 장치 독립적 : *.bmp로 존재 하며 운영체제에서 사용하기 위해서 DDB로 변환하는 작업을 거처야 한다.
DDB(Device Dependent Bitmap, *.raw)
- 장치 종속적 : 해당 장치에서만 사용

Window 생성시 반드시 생성되는 것
- Message Queue
- DC → CGDIObject [ (CBitmap), (CPen, CBrush, CFont) ]
- CBitmap :     GDIObject 3개와는 성격이 다르다, 도화지의 성격,
                SelectObject 사용으로 CBitmap 변경시 도화지가 바뀐다.

DC 생성 (메모리 DC)
- Window 생성시 기본으로 생성되는 DC 외에 사용자가 추가로 DC를 생성할수있다, 이를 메모리 DC라 부른다.

CBitmap class
BITMAP을 사용에 필요한 API를 모아놓은 MFC Class

Member Function
LoadBitmap( UINT nIDResource );
- 비트맵 리소스를 읽어온다, DIB 포맷을 DDB 포맷으로 변환.

BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
- 하나의 DC에 있는 비트맵을 다른 DC로 복사하는 비트맵 함수

StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );
- BitBlt와 동작하는 방식이 같다, 크기와 높이를 따로 지정할 수 있어 확대및 축소 복사가 가능.

GetBitmap( BITMAP* pBitMap );
- BITMAP 정보를 BITMAP Struct에 넘겨준다.

Example
CPaintDC dc(this);
CDC temp_dc;
//temp_dc.CreateDC( ... ); // 속성을 다 지정해야 한다.
temp_dc.CreateCompatibleDC(&dc); // 넘겨받은 dc와 호환가능한 DC를 생성한다.
temp_dc.SelectObject(&m_my_bitmap); //CBitmap class  멤버변수 m_my_bitmap 선언
dc.BitBlt(200, 0, 60, 60, &temp_dc, 50, 50, SRCCOPY);
dc.DeleteDC();












① - 전체 window
② - 전체 window중 bitmap이 보여질 위치 및 범위.

***위 함수를 이용한 간단한 Bitmap 출력하기

비트맵 로드는 OnCreate()에서 하고
그리기 코드는 OnDraw() 내에서 실행함.

int CTetris_copyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO: Add your specialized creation code here
   CBitmap m_coverBitMap; // Bitmap 변수를 선언하고 그 변수에 LoadBitmap 하여
                                            // Bitmap 로드함
    m_coverBitMap.LoadBitmap(IDB_BITMAP1);
    return 0;
}

void CTetris_copyView::OnDraw(CDC* pDC)
{
    CTetris_copyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);
    CBitmap *pOldBitmap = memDC.SelectObject(&m_coverBitMap);
    pDC->BitBlt(0, 0, 715, 543, &memDC, 0, 0, SRCCOPY);
    memDC.SelectObject(pOldBitmap);
    memDC.DeleteDC();
}

출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68372414&qb=bWZjIG9uZHJhdyBiaXRtYXA=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=RniKs35Y7thssc3XcGCsssssssh-101170&sid=UPZLTHJvLBYAAH4LFTU

2013년 1월 4일 금요일

[MFC] 실행 중인 프로그램 리스트를 얻어오고 제어하기

<<함수 선언부>>

//콜백 함수 선언
BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam);
//

<<InitInstance() 내부에 선언>>

// 이미 프로그램이 실행 중이면 종료하고 아니면, 업데이트 진행
BOOL RTSnotRun = EnumWindows(EnumWindowCallBack,0);

 if(RTSnotRun == FALSE)
 {
  AfxMessageBox("프로그램 종료 후 실행해 주시기 바랍니다.");
  return FALSE;
 }
 //

<<CallBack 함수 선언>>

//프로그램 이름 가져오기
BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam)
{
 char str_title[255];
 int length;
 GetWindowText(hwnd, str_title,255);
 length = GetWindowTextLength(hwnd);

 // Windows ctrl + alt + delete 에 나오는 프로그램 명
 if (IsWindowVisible(hwnd) && length > 0 && !strncmp(str_title, "프로그램명",10))  {
  printf("callback enumwindows in str_title : %s\n", str_title);
  return FALSE;
 }
 return TRUE;
}
CallBack 함수를 호출하여, 실행 중인 프로그램 리스트를 얻어 온다.

얻어 온 리스트 중 제어할려는 프로그램 명을 적은 후, 반환 받아서 제어.

위 소스에서 "프로그램명" 에 해당 하는 프로그램 이름을 적으면 된다.

예) Excel  => "Excel" 로 적고, strncmp 기능을 이용하여, 자신이 비교할려는

문자 수를 정하고, 해당 문자와 같은 문자가 있는 프로그램일 경우, false를 반환,

그렇지 않을 경우, true를 반환 한다.

 false 를 반환 할 경우, 동일 프로그램이 실행 중임으로 이 때 해당하는 프로세스 진행

true 를 반환 할 경우, 프로그램이 실행 하고 있지 않을 때 코드를 작성하면 된다.

IsWindowVisible(hwnd) && length > 0 은 ctrl+Alt + del 키를 눌렀을 때 나오는 프로그램인지

확인 하는 것이고, str_title에 ctrl + Alt + del 키를 눌렀을 때 나오는 프로그램 이름이 저장

되게 된다.


참조 : http://frog3147.tistory.com/entry/MFC%EC%97%90%EC%84%9C-%ED%98%84%EC%9E%AC-%EC%8B%A4%ED%96%89-%EC%A4%91%EC%9D%B8-%EC%9D%91%EC%9A%A9%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%AA%A9%EB%A1%9D-%EC%96%BB%EC%96%B4%EC%98%A4%EA%B8%B0

http://blog.naver.com/PostView.nhn?blogId=qblan&logNo=60135883727&categoryNo=47&viewDate=&currentPage=1&listtype=0