'팁&테크/Winapi & MFC'에 해당되는 글 10건
- 2013.10.08 액티브엑스 테스트 인증서 작성
- 2013.10.07 [MFC] SHGetSpecialFolderPath() 함수를 이용한 각 폴더경로 가져오기
- 2010.05.19 MFC URLEncode / URLDecode
- 2008.12.20 CFileDialog 파일을 읽거나 저장할때 파일창 띄우기 1
- 2008.12.20 CString , int 형변환
- 2008.12.20 pdh.h 를 이용한 CPU,메모리 사용량 확인 라이브러리 데모 1
- 2008.12.19 자신의 IP 얻기
- 2008.11.27 유니코드에서 초,중,종성 분리
- 2008.11.19 MFC에서 현재 실행 중인 응용프로그램 목록 얻어오기
- 2008.11.19 VC2005에서 VC6의 클래스 위자드 처럼 사용하기 1
액티브엑스 테스트 인증서 작성
1. INF 파일 작성 ( 작성한 ActiveX 컨트롤러와 동일한 이름으로 작성 )
[version]
signature="CHICAGOS"
AdvanceINF=2.0
[Add.Code]
(your OCX).ocx=(your OCX).ocx
[(your OCX).ocx]
file-win32-x86=thiscab
clsid={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
FileVersion=1,0,0,1
DestDir=11
RegisterServer=yes
- clsid : ocx의 클래스 아이디 .idl 파일에서 가장 하단의 uuid
2. 테스트 인증 루트 만들기
OCX를 배포할 때 인증 경로가 필요함. 내 컴퓨터를 루트로 하는 인증경로를 만든다.
SETREG 1 TRUE
3. 암호화와 사인 넣기
배포하기 전 인증에 관한 암호화를 실행하고, 사인을 넣는 작업
MAKECERT -n "CN=(your OCX)" -sv (your OCX).pvk (your OCX).cer
4. 인증서 만들기
위에서 만든 파일들로 실제적인 테스트 인증서를 만든다.
CERT2SPC (your OCX).cer (your OCX).spc
5. CAB 파일 압축 생성
CABARC -s 6144 N (your OCX).cab (your OCX).inf (your OCX).ocx
6. 인증서 첨부하기
배포하기전 인증서를 CAB 파일에 첨부한다.
SIGNCODE -spc (your OCX).spc -v (your OCX).pvk -n "(your OCX) ActiveX" -i (your URL) (your OCX).cab
7. 웹 배포
HTML 예제
<OBJECT ID=(your OCX) CODEBASE=http://www.test.com/(your OCX).cab#viersion=1,0,0,1 width=100 height=100 CLASSID="CLSID:ActiveX 컨트롤러 클래스 아이디"></OBJECT>
[MFC] SHGetSpecialFolderPath() 함수를 이용한 각 폴더경로 가져오기
SHGetSpecialFolderPath() - 윈도우 특별한 폴더 경로
바탕화면, 즐겨찾기, 내 문서 등의 패스얻기
|
4. Window Vista 이후 버젼은 SHGetKnownFolderPath() 함수를 사용
MFC URLEncode / URLDecode
inline BYTE CURLEncode::toHex(const BYTE &x) {
return x > 9 ? x + 55: x + 48;
}
inline BYTE CURLEncode::toByte(const BYTE &x) {
return x > 57? x - 55: x - 48;
}
CString CURLEncode::URLDecode(CString sIn)
{
CString sOut;
const int nLen = sIn.GetLength() + 1;
register LPBYTE pOutTmp = NULL;
LPBYTE pOutBuf = NULL;
register LPBYTE pInTmp = NULL;
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen);
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if('%'==*pInTmp)
{
pInTmp++;
*pOutTmp++ = (toByte(*pInTmp)%16<<4) + toByte(*(pInTmp+1))%16;
pInTmp++;
}
else if('+'==*pInTmp)
*pOutTmp++ = ' ';
else
*pOutTmp++ = *pInTmp;
pInTmp++;
}
*pOutTmp = '\0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
CString CURLEncode::URLEncode(CString sIn)
{
CString sOut;
const int nLen = sIn.GetLength() + 1;
register LPBYTE pOutTmp = NULL;
LPBYTE pOutBuf = NULL;
register LPBYTE pInTmp = NULL;
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3);
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if(isalnum(*pInTmp) || '-'==*pInTmp || '_'==*pInTmp || '.'==*pInTmp)
*pOutTmp++ = *pInTmp;
else if(isspace(*pInTmp))
*pOutTmp++ = '+';
else
{
*pOutTmp++ = '%';
*pOutTmp++ = toHex(*pInTmp>>4);
*pOutTmp++ = toHex(*pInTmp%16);
}
pInTmp++;
}
*pOutTmp = '\0';
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
CFileDialog 파일을 읽거나 저장할때 파일창 띄우기
파일에 변수의 내용을 직렬화 해서 저장,읽어들이는 예제
CFileDialog dlg(
TRUE(읽기)/FALSE(저장),
기본확장자,
기본파일명,
열기모드->MSDN 참고,
파일창 아래쪽에 나오는 필터링
)
파일을 열어 변수에 읽어들일때
char szFilter[] = "PCMON (*.CFG) | All Files(*.*)|*.*||";
CFileDialog dlg(TRUE, "cfg", "pcmon", OFN_HIDEREADONLY, szFilter);
if(IDOK == dlg.DoModal())
{
CString strPathName = dlg.GetPathName();
CFile fp;
CFileException e;
if(!fp.Open(strPathName, CFile::modeRead, &e)) {
e.ReportError();
return;
}
CString str;
CArchive ar(&fp, CArchive::load);
ar >> str;
}
파일을 선택해서 저장할때
char szFilter[] = "PCMON (*.CFG) | All Files(*.*)|*.*||";
CFileDialog dlg(FALSE, "cfg", "pcmon", OFN_HIDEREADONLY, szFilter);
if(IDOK == dlg.DoModal())
{
CString strPathName = dlg.GetPathName();
CFile fp;
CFileException e;
if(!fp.Open(strPathName,CFile::modeWrite|CFile::modeCreate, &e)) {
e.ReportError();
return;
}
CString str = _T("문자열");
CArchive ar(&fp, CArchive::store);
ar << str;
}
CString , int 형변환
CString str = _T("100);
int num;
num = _ttoi(str);
int -> CString
CString str;
int num = 100;
str.Format("%d,num);
_ttoi 함수는 유니코드일 경우 _wtoi 안시코드일경우 atoi를 호출한다고 인터넷에서 그러더만 확인은 안해봤다.
pdh.h 를 이용한 CPU,메모리 사용량 확인 라이브러리 데모
프로젝트에 pdh.lib 를 링크하거나
소스에
#pragma comment(lib,"pdh.lib")
를 추가해서 사용하면 됩니다.
예제파일의 소스를 보면 어렵지 않지만 간단히 설명하면.
CPU,메모리 사용량을 확인할려고 하면.
초기화 - OnCreate() 같은곳에 넣으면 되겠죠.
------------------------------------------------------------------------
//cpu,mem 사용량 처리용/////////////////////////////////
// TODO: Add extra initialization here
if (!m_PerfMon.Initialize())
{
AfxMessageBox("Could not initialize CPerfMon!");
return true;
}
// add counters
m_nCPU = m_PerfMon.AddCounter(CNTR_CPU);
m_nMEM = m_PerfMon.AddCounter(CNTR_MEMINUSE_PERCENT);
// init timer
SetTimer(1, 5000, NULL); // every half second refresh the counters
---------------------------------------------------------------------------
타이머 - OnTimer() 에서 필요한 작업을 하면 되겠네요.
---------------------------------------------------------------------------
if (!m_PerfMon.CollectQueryData())
{
AfxMessageBox("Failed Query!");
return;
}
// update counters
long lcpu = m_PerfMon.GetCounterValue(m_nCPU);
long lmem = m_PerfMon.GetCounterValue(m_nMEM);
// update dialog
if (lcpu != -999)
{
m_strCpu.Format("%d%%", lcpu);
}
if (lmem != -999)
{
m_strMem.Format("%d%%", lmem);
}
CString str;
str.Format("%d%% %d%%",lcpu,lmem);
AfxMessageBox(str);
자신의 IP 얻기
자신의 IP 얻기
if(WSAStartup(wVersionRequested, &wsaData) == 0) { return ip; CString getMyIp() { |
유니코드에서 초,중,종성 분리
주의:
PB v4.0에서 UTF-8 소스 인코딩을 선택하고, 컴파일 옵션은 유니코드 실행 파일로
설정하고 아래 코드를 실행한다.
C++ 코드와 설명 출처: 데브피아
;- 유니코드 한글의 자모 분리법.
;
;
; 유니코드 완성형 한글 코드는 배치가 매우 잘되어 있어서 초성 중성 종성의 분리가 가능하다.
;
; wchar_t CompleteCode = L'가';
; 이렇게 완성형 코드가 있을 때
;
; wchar_t UniValue = CompleteCode - 0xAC00;
;
; 0xAC00은 한글 코드의 시작 값이다. 따라서 저 값을 빼면
; 우선적으로 우리가 원하는 한글 값만을 가지게 된다.
;
; 이제 저장한 UniValue로부터 종성을 분리한다.
; wchar_t Jong = UniValue % 28;
;
; 유니코드에서 사용가능한 초성은 19개, 중성은 21개, 종성은 28개이고
; 유니코드가 같는 값의 공식은
;
; 유니코드 완성형 값 = ( ( ( 초성 * 21 ) + 중성 ) * 28 ) + 종성 + 0xAC00;
;
; 이렇게 된다. 따라서 UniValue에서 28로 나눈 나머지는 종성이 된다.
;
; 이번에는 중성을 찾는다.
; wchar_t Jung = ( ( UniValue - Jong ) / 28 ) % 21;
; wchar_t Cho = ( ( UniValue - Jong ) / 28 ) / 21;
;
; 이렇게 하여 유니코드 완성형 값에서 초성, 중성, 종성의 값을 분리해낼 수 있다.
; 주의할 점은 저렇게 나오는 값은 인덱스 값이라는 점이다.
; 정확한 자모 값을 받기 위해서는 유니코드 한글 자모 코드표를 통해서
; 초성에는 초성 시작 값을 더해주고, 중성에는 중성 시작값을,
; 종성에는 종성의 시작값을 더해주어야 정확한 자모 값을 얻을 수 있다.
;
; 자, 이제 코드를 살펴보자...
;
; // unicode3.cpp
; #include <windows.h>
; #include <iostream>
; #include <locale>
;
; using namespace STD;
;
; INT main()
; {
; wcout.imbue( locale("korean") );
;
; wchar_t CompleteCode = L'개';
; wchar_t UniValue = CompleteCode - 0xAC00;
;
; wchar_t Jong = UniValue % 28;
; wchar_t Jung = ( ( UniValue - Jong ) / 28 ) % 21;
; wchar_t Cho = ( ( UniValue - Jong ) / 28 ) / 21;
;
; cout << "초성 : " << Cho << "\t" << "중성 : " << Jung << "\t" << "종성 : " << Jong << endl;
; }
;
; 위와 같은 코드를 작성하여 살펴보면 '개'의 초성은 'ㄱ'이고, 중성은 'ㅐ', 종성은 없다.
; 따라서 'ㄱ'은 자모 코드 중 초성의 첫번째이므로 0의 값을 가지며,
; 'ㅐ'는 중성의 두번째이므로 1의 값을 가지고 종성은 없으므로 0의 값을 가지게 된다.
; 문제점은 종성의 0이다. 한글 코드는 초성이 없는 경우가 없고, 중성이 없는 경우는 없으나
; 종성이 없는 경우는 있다. 따라서 종성의 인덱스는 1부터 시작해야 한다.
; 저 위의 코드 중 L'개'를 L'객'으로 바꿔 살펴보면 종성 값이 1로 나오는 것을 확인할 수 있다.
;
; 유니코드의 자모값의 코드표에 대하여 알고 싶을 경우
; http://www.unicode.org/charts/PDF/U1100.pdf
;
; 그리고 한글 완성형 코드표에 대하여 알고 싶을 경우
; http://www.unicode.org/charts/PDF/UAC00.pdf
; 위의 링크에 가면 된다.
UniValue = Asc("객") - $AC00
Debug UniValue
jong = UniValue % 28
jung = ( ( UniValue - jong ) / 28 ) % 21
cho = ( ( UniValue - jong ) / 28 ) / 21
;각각의 인덱스 출력.
Debug cho
Debug jung
Debug jong
;실제 자모의 출력.
Debug Chr(cho+$1100)
Debug Chr(jung+$1161)
If jong ;종성이 있으면 이하 처리.
Debug Chr(jong+$11a7)
EndIf
실행 결과
29 0 1 1 ㄱ ㅐ ㄱ |
MFC에서 현재 실행 중인 응용프로그램 목록 얻어오기
EnumWindows라는 함수는 윈도우 운영체제 상의 모든 윈도우 목록을 조사해서
콜백함수로 넘겨줍니다. 콜백함수로 넘겨지는 데이터는 윈도우의 핸들이 되겠구
요. 콜백함수에서는 넘겨받은 핸들을 이용하여 윈도우 핸들로 가능한 모든 작업
을 할 수 있습니다. 말하자면, 윈도우의 캡션이라든가 Rect 좌표 같은 정보를 알
아내거나 해당 윈도우로 메시지를 보낸다든지 하는 그런 것들 말이죠.
MSDN에서 따온 함수원형은 아래와 같습니다.
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // pointer to callback function
LPARAM lParam // application-defined value
);
lpEnumFunc 이라는 놈은 보시다시피 콜백함수의 포인터라는군요.
다음으로 lParam 라는 놈이 나오는데요 다들 알고 계시겠죠??
자 그럼 실제로 EnumWindows라는 함수를 한 번 써보겠습니다.
먼저 함수의 첫번째 파라미터로 넘겨줄 콜백함수를 만들어야겠지요?
저는 EnumWindowCallBack이라는 이름으로 만들었습니다.
BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam);
함수의 내부는 다음과 같이 만들었습니다.
BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam)
{
char Cap[255];
RECT rt;
CString HwndInfo;
int length;
GetWindowText(hwnd, Cap, 255);
length = GetWindowTextLength(hwnd);
GetWindowRect(hwnd, &rt);
if (IsWindowVisible(hwnd) && length > 0)
{
HwndInfo.Format("%s", Cap, rt.left, rt.top, rt.right, rt.bottom);
pDlg->m_comboControl.AddString(HwndInfo);
pDlg->OpenWindow[pDlg->count] = hwnd;
}
return TRUE;
}
EnumWindows 함수로부터 hwnd라는 윈도우의 핸들을 가지고 놀아봅시다.
GetWindowText 함수를 이용해서 해당 윈도우의 캡션을 Cap이라는 배열에
저장하고 캡션의 길이를 length에 저장합니다. Rect를 얻어오는건 제가 필요
해서 한거구요...없어도 실행 중인 응용 프로그램 목록을 얻어오는데는 문제
가 없습니다. 위의 소스에서는 if문을 이용해서 작업관리자의 목록만을 가져
오지만 혹시나 모든 윈도우의 핸들이 필요하시다면 if문을 살짝 지우면 다 가
져 올 수 있겠지요...ㅎㅎ
IsWindowVisible 함수를 이용해서 윈도우의 WS_VISIBLE 속성이 On이면서
캡션의 길이가 0보다 큰 녀석들만 가져옵니다.
pDlg는 다이얼로그의 포인터이구요 컨트롤형 변수로 선언된 콤보박스에 CString
으로 선언된 HwndInfo를 AddString으로 넘겨주면 아래의 그림과 같이 작업
관리자와 똑같은 목록을 얻어 올 수가 있습니다.
[출처] http://frog3147.tistory.com/64
VC2005에서 VC6의 클래스 위자드 처럼 사용하기
클래스에 이벤트를 적용할 수 있습니다.
1. 클래스에서 마우스 오른쪽 속성을 선택합니다.
2. 속성창에서 "메세지" 툴박스를 선택합니다.
3. 원하는 이벤트를 추가/삭제/편집합니다.
4. 리소스 에디터에서 컴포넌트를 선택후 마우스 오른쪽으로 변수 추가를 선택
5. 변수에 관한 설정을 합니다.
그럼 클래스 위자드와 비슷하게 작업이 가능하게 됩니다.