'팁&테크/Winapi & MFC'에 해당되는 글 10건

  1. 2013.10.08 액티브엑스 테스트 인증서 작성
  2. 2013.10.07 [MFC] SHGetSpecialFolderPath() 함수를 이용한 각 폴더경로 가져오기
  3. 2010.05.19 MFC URLEncode / URLDecode
  4. 2008.12.20 CFileDialog 파일을 읽거나 저장할때 파일창 띄우기 1
  5. 2008.12.20 CString , int 형변환
  6. 2008.12.20 pdh.h 를 이용한 CPU,메모리 사용량 확인 라이브러리 데모 1
  7. 2008.12.19 자신의 IP 얻기
  8. 2008.11.27 유니코드에서 초,중,종성 분리
  9. 2008.11.19 MFC에서 현재 실행 중인 응용프로그램 목록 얻어오기
  10. 2008.11.19 VC2005에서 VC6의 클래스 위자드 처럼 사용하기 1
2013. 10. 8. 14:56

액티브엑스 테스트 인증서 작성

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>

2013. 10. 7. 18:39

[MFC] SHGetSpecialFolderPath() 함수를 이용한 각 폴더경로 가져오기

SHGetSpecialFolderPath() - 윈도우 특별한 폴더 경로

 

바탕화면, 즐겨찾기, 내 문서 등의 패스얻기

 

 

1.요약 

SHGetSpecialFolderPath()
를 이용하여 윈도우에서 사용하는 특별한 폴더들의 패스를 얻어오는 방법을 설명합니다.


2.본문 

SHGetSpecialFolderPath()
를 이용하면 윈도우에서 사용하는 특별한 폴더들의 패스를 얻어올 수 있습니다.

파라미터는 윈도우 핸들, 폴더이름을 복사할 버퍼, 패스 플래그, 생성 플래그입니다.

세번째와 네번째는 각각 얻고자하는 패스를 지정하는 플래그와 만약 폴더가 없다면 생성할 것인지를 지정하는 플래그입니다.

네번째 플레그가 NULL(0)이 아니고 폴더가 없다면 폴더를 생성합니다. 세번째 플래그는 다음과 같은 폴더를 지정합니다.(MSDN 참조) 

CSIDL_ADMINTOOLS 
Version 5.0. File system directory that is used to store administrative tools for an individual user. The Microsoft Management Console will save customized consoles to this directory and it will roam with the user.

 

CSIDL_ALTSTARTUP 
File system directory that corresponds to the user's nonlocalized Startup program group.

CSIDL_APPDATA 
File system directory that serves as a common repository for application-specific data. A common path is C:\WINNT\Profiles\username\Application Data.

 

CSIDL_BITBUCKET 
Virtual folder containing the objects in the user's Recycle Bin.

CSIDL_COMMON_ADMINTOOLS 
Version 5.0. File system directory containing containing administrative tools for all users of the computer.

 

CSIDL_COMMON_ALTSTARTUP 
File system directory that corresponds to the nonlocalized Startup program group for all users. Valid only for Windows NT? systems.

 

CSIDL_COMMON_APPDATA 
Version 5.0. Application data for all users. A common path is C:\WINNT\Profiles\All Users\Application Data.

 

CSIDL_COMMON_DESKTOPDIRECTORY 
File system directory that contains files and folders that appear on the desktop for all users. A common path is C:\WINNT\Profiles\All Users\Desktop. Valid only for Windows NT? systems.

 

CSIDL_COMMON_DOCUMENTS 
File system directory that contains documents that are common to all users. A common path is C:\WINNT\Profiles\All Users\Documents. Valid only for Windows NT? systems.

 

CSIDL_COMMON_FAVORITES 
File system directory that serves as a common repository for all users' favorite items. Valid only for Windows NT? systems.

 

CSIDL_COMMON_PROGRAMS 
File system directory that contains the directories for the common program groups that appear on the Start menu for all users. A common path is c:\WINNT\Profiles\All Users\Start Menu\Programs. Valid only for Windows NT? systems.

 

CSIDL_COMMON_STARTMENU 
File system directory that contains the programs and folders that appear on the Start menu for all users. A common path is C:\WINNT\Profiles\All Users\Start Menu. Valid only for Windows NT? systems.

 

CSIDL_COMMON_STARTUP 
File system directory that contains the programs that appear in the Startup folder for all users. A common path is C:\WINNT\Profiles\All Users\Start Menu\Programs\Startup. Valid only for Windows NT? systems.

 

CSIDL_COMMON_TEMPLATES 
File system directory that contains the templates that are available to all users. A common path is C:\WINNT\Profiles\All Users\Templates. Valid only for Windows NT? systems.

 

CSIDL_CONTROLS 
Virtual folder containing icons for the Control Panel applications.

 

CSIDL_COOKIES 
File system directory that serves as a common repository for Internet cookies. A common path is C:\WINNT\Profiles\username\Cookies.

 

CSIDL_DESKTOP 
Windows Desktopvirtual folder that is the root of the namespace.

 

CSIDL_DESKTOPDIRECTORY 
File system directory used to physically store file objects on the desktop (not to be confused with the desktop folder itself). A common path is C:\WINNT\Profiles\username\Desktop

 

CSIDL_DRIVES 
My Computer
virtual folder containing everything on the local computer: storage devices, printers, and Control Panel. The folder may also contain mapped network drives.

 

CSIDL_FAVORITES 
File system directory that serves as a common repository for the user's favorite items. A common path is C:\WINNT\Profiles\username\Favorites.

 

CSIDL_FONTS 
Virtual folder containing fonts. A common path is C:\WINNT\Fonts.

 

CSIDL_HISTORY 
File system directory that serves as a common repository for Internet history items.

 

CSIDL_INTERNET 
Virtual folder representing the Internet.

 

CSIDL_INTERNET_CACHE 
File system directory that serves as a common repository for temporary Internet files. A common path is C:\WINNT\Profiles\username\Temporary Internet Files.

 

CSIDL_LOCAL_APPDATA 
Version 5.0. File system directory that serves as a data repository for local (non-roaming) applications. A common path is C:\WINNT\Profiles\username\Local Settings\Application Data.

 

CSIDL_MYPICTURES 
Version 5.0. My Pictures folder. A common path is C:\WINNT\Profiles\username\My Documents\My Pictures.

 

CSIDL_NETHOOD 
File system directory containing objects that appear in the network neighborhood. A common path is

C:\WINNT\Profiles\username\NetHood.

 

CSIDL_NETWORK 
Network Neighborhoodvirtual folder representing the top level of the network hierarchy.

 

CSIDL_PERSONAL 
File system directory that serves as a common repository for documents. A common path is C:\WINNT\Profiles\username\My Documents.

 

CSIDL_PRINTERS 
Virtual folder containing installed printers.

 

CSIDL_PRINTHOOD 
File system directory that serves as a common repository for printer links. A common path is C:\WINNT\Profiles\username\PrintHood.

 

CSIDL_PROFILE 
Version 5.0. User's profile folder.

 

CSIDL_PROGRAM_FILES 
Version 5.0. Program Files folder. A common path is C:\Program Files.

 

CSIDL_PROGRAM_FILES_COMMON 
Version 5.0. Program Files folder that is common to all users. A common path is C:\Program Files\Common. Valid only for Windows NT? systems.

 

CSIDL_PROGRAM_FILES_COMMONX86 
Version 5.0. Program Files folder that is common to all users for x86 applications on RISC systems. A common path is C:\Program Files (x86)\Common.

 

CSIDL_PROGRAM_FILESX86 
Version 5.0. Program Files folder for x86 applications on RISC systems. Corresponds to the %PROGRAMFILES(X86)% environment variable. A common path is C:\Program Files (x86).

 

CSIDL_PROGRAMS 
File system directory that contains the user's program groups (which are also file system directories). A common path is C:\WINNT\Profiles\username\Start Menu\Programs.

 

CSIDL_RECENT 
File system directory that contains the user's most recently used documents. A common path is C:\WINNT\Profiles\username\Recent. To create a shortcut in this folder, use SHAddToRecentDocs. In addition to creating the shortcut, this function updates the shell's list of recent documents and adds the shortcut to the Documents submenu of the Start menu.

 

CSIDL_SENDTO 
File system directory that contains Send To menu items. A common path is c:\WINNT\Profiles\username\SendTo.

 

CSIDL_STARTMENU 
File system directory containing Start menu items. A common path is c:\WINNT\Profiles\username\Start Menu.

 

CSIDL_STARTUP 
File system directory that corresponds to the user's Startup program group. The system starts these programs whenever any user logs onto Windows NT? or starts Windows? 95. A common path is C:\WINNT\Profiles\username\Start Menu\Programs\Startup.

 

CSIDL_SYSTEM 
Version 5.0. System folder. A common path is C:\WINNT\SYSTEM32.

 

CSIDL_SYSTEMX86 
Version 5.0. System folder for x86 applications on RISC systems. A common path is C:\WINNT\SYS32X86.

 

CSIDL_TEMPLATES 
File system directory that serves as a common repository for document templates.

 

CSIDL_WINDOWS 
Version 5.0. Windows directory or SYSROOT. This corresponds to the %windir% or %SYSTEMROOT% environment variables. A common path is C:\WINNT.

 


3.예제


// 
바탕화면의 패스얻기

char pBuffer[MAX_PATH]; 
SHGetSpecialFolderPath(GetSafeHwnd(), 
(LPWSTR)pBuffer, CSIDL_DESKTOP, 0); 

AfxMessageBox((LPCTSTR)pBuffer);


4. Window Vista 이후 버젼은 SHGetKnownFolderPath() 함수를 사용

2010. 5. 19. 10:49

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;
}

2008. 12. 20. 01:56

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;
 }

2008. 12. 20. 01:17

CString , int 형변환

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를 호출한다고 인터넷에서 그러더만 확인은 안해봤다.
2008. 12. 20. 01:04

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);

2008. 12. 19. 16:33

자신의 IP 얻기

자신의 IP 얻기



#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

CString getMyIp() {
 WORD wVersionRequested;
 WSADATA wsaData;
 char name[255];
 CString ip;
 PHOSTENT hostinfo;
 wVersionRequested = MAKEWORD(2,0);

 if(WSAStartup(wVersionRequested, &wsaData) == 0) {
  if(gethostname(name,sizeof(name)) == 0) {
   if((hostinfo = gethostbyname(name)) != NULL) {
    ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
   }
  }
 }

 return ip;
}



참고

자신의 IP가 여러개일때는 다음의 방법을 사용하도록 합니다.

----------------

CString getMyIp() {
 WORD wVersionRequested;
 WSADATA wsaData;
 char name[255];
 CString ip;
 PHOSTENT hostinfo;
 wVersionRequested = MAKEWORD(2,0);

 if(WSAStartup(wVersionRequested, &wsaData) == 0) {
   if(gethostname(name,sizeof(name)) == 0) {
for(int i=0; pHostInfo->h_addr_list[i] != NULL ;i++) {// 반복해서 IP얻기
memcpy(&(addr.sin_addr), pHostInfo->h_addr_list[i], pHostInfo->h_length);
ip.Format("My address:%s\n", inet_ntoa(dest.sin_addr));
AfxMessageBox(ip);
}
}
}

 return ip;
}


2008. 11. 27. 10:58

유니코드에서 초,중,종성 분리

주의:

  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
 ㄱ
 ㅐ
 ㄱ

 


2008. 11. 19. 14:07

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

2008. 11. 19. 14:02

VC2005에서 VC6의 클래스 위자드 처럼 사용하기

VC2005에는 VC6과 같은 클래스 위자드가 없습니다. 그래서 다른 방법으로
클래스에 이벤트를 적용할 수 있습니다.

1. 클래스에서 마우스 오른쪽 속성을 선택합니다.

2. 속성창에서 "메세지" 툴박스를 선택합니다.

3. 원하는 이벤트를 추가/삭제/편집합니다.


4. 리소스 에디터에서 컴포넌트를 선택후 마우스 오른쪽으로 변수 추가를 선택

5. 변수에 관한 설정을 합니다.

그럼 클래스 위자드와 비슷하게 작업이 가능하게 됩니다.