<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7886148019381873383</id><updated>2011-04-21T17:48:52.368-07:00</updated><title type='text'>Syncsong</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-2242117428746177554</id><published>2007-12-06T16:29:00.000-08:00</published><updated>2007-12-06T16:37:27.222-08:00</updated><title type='text'>실행중인 인터넷 익스플로러 종료</title><content type='html'>void CAboutDlg::OnIeExit()&lt;br /&gt;{&lt;br /&gt;  CWnd * pWnd = CWnd::FindWindow("IEFrame",0);//인터넷 익스플롤에 대한 객체 포인터 얻음&lt;br /&gt;  if(pWnd)&lt;br /&gt;   {&lt;br /&gt;       pWnd-&gt;Postmessage(WM_QUIT);//인터넷 익스플로러에 종료 메시지 전달&lt;br /&gt;        return;&lt;br /&gt;   }   &lt;br /&gt;     AfmMessageBox("실행중인 인터넷 익스플로러가 없군요");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//FindWindow()함수의 첫번째 인자 "IEFrame"은 인터넷 익스플로러의 &lt;윈도우 클래스 이름&gt;이다&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-2242117428746177554?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/2242117428746177554/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=2242117428746177554' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/2242117428746177554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/2242117428746177554'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/12/blog-post.html' title='실행중인 인터넷 익스플로러 종료'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-799255932675296958</id><published>2007-11-27T21:52:00.000-08:00</published><updated>2007-11-27T21:53:12.672-08:00</updated><title type='text'>读取INI配置文件GetProfileString和GetPrivateProfileString参数说明和示例</title><content type='html'>/&lt;br /&gt;/读取win.ini配置文件&lt;br /&gt;DWORD GetProfileString(&lt;br /&gt;  LPCTSTR lpAppName,        // section name&lt;br /&gt;  LPCTSTR lpKeyName,        // key name&lt;br /&gt;  LPCTSTR lpDefault,        // default string&lt;br /&gt;  LPTSTR lpReturnedString,  // destination buffer&lt;br /&gt;  DWORD nSize,              // size of destination buffer&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;//读取INI配置文件&lt;br /&gt;DWORD GetPrivateProfileString(&lt;br /&gt;  LPCTSTR lpAppName,        // section name&lt;br /&gt;  LPCTSTR lpKeyName,        // key name&lt;br /&gt;  LPCTSTR lpDefault,        // default string&lt;br /&gt;  LPTSTR lpReturnedString,  // destination buffer&lt;br /&gt;  DWORD nSize,              // size of destination buffer&lt;br /&gt;  LPCTSTR lpFileName        // initialization file name&lt;br /&gt;);&lt;br /&gt;示例:&lt;br /&gt; CFileDialog myFileDialog(true,&lt;br /&gt; "ini",&lt;br /&gt; "NS900",&lt;br /&gt; OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT |&lt;br /&gt; OFN_ALLOWMULTISELECT|OFN_EXPLORER, &lt;br /&gt; "配置文件(*.ini)|*.ini||",&lt;br /&gt; NULL); &lt;br /&gt; &lt;br /&gt; if(myFileDialog.DoModal() == IDOK)&lt;br /&gt; {&lt;br /&gt;  CString strPath = myFileDialog.GetPathName();&lt;br /&gt;  //打开文件显示&lt;br /&gt;  CString str;&lt;br /&gt;  int nSize = 254;&lt;br /&gt;  GetPrivateProfileString("NS900","身份码",NULL,str.GetBuffer(254),nSize,strPath);&lt;br /&gt; }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-799255932675296958?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/799255932675296958/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=799255932675296958' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/799255932675296958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/799255932675296958'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/11/inigetprofilestringgetprivateprofilestr.html' title='读取INI配置文件GetProfileString和GetPrivateProfileString参数说明和示例'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3195451512451252859</id><published>2007-11-15T16:27:00.000-08:00</published><updated>2007-11-15T16:28:20.008-08:00</updated><title type='text'>API</title><content type='html'>특정 디렉토리 뒤지기&lt;br /&gt;지정한 디렉토리에 있는 모든 파일을 찾아내는 코드를 만들려면 어떻게 해야 합니까 ?&lt;br /&gt;&lt;br /&gt;이 때 사용할 수 있는 API가 바로 FindFirstFile과 FindNextFile, FindClose라는 API들입니다. 사용 예제는 다음과 같습니다. &lt;br /&gt;&lt;br /&gt;WIN32_FIND_DATA  findFileData;&lt;br /&gt;HANDLE hFileHandle;&lt;br /&gt;&lt;br /&gt;// szDir에 뒤지고자 하는 디렉토리의 경로명을 준다. 예를 들면 "C:\\TEMP\\*.*"&lt;br /&gt;       // 찾아진 파일의 속성은 findFileData의 dwFileAttributes를 살펴본다.&lt;br /&gt;hFileHandle = FindFirstFile(m_szDir, &amp;findFileData);  &lt;br /&gt;if (hFileHandle != INVALID_HANDLE_VALUE)   // 파일을 찾은 경우 &lt;br /&gt;{&lt;br /&gt; // 찾은 파일의 이름은 cFileName 필드로 들어온다.&lt;br /&gt; ...&lt;br /&gt; // 다음 파일을 찾는다.&lt;br /&gt; while(FindNextFile(hFileHandle, &amp;findFileData))   {&lt;br /&gt;  ...&lt;br /&gt; }&lt;br /&gt; FindClose(hFileHandle);&lt;br /&gt;}    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. API를 이용하는 유니코드와 ANSI 문자열간의 변환 방법&lt;br /&gt;API를 이용해서 유니코드와 ANSI 문자열간의 변환은 어떻게 수행합니까 ? &lt;br /&gt;&lt;br /&gt;Visual C++에서 유니코드 문자열은 BSTR이란 타입으로 표시됩니다. 또 유니코드와 ANSI 문자열간의 변환을 위해서 윈도우 시스템에는 MultiByteToWideChar와 WideCharToMultiByte라는 API가 존재합니다. MFC에서의 BSTR 타입 변환방법이나 ATL로 하는 BSTR 타입 변환도 참고하시기 바랍니다.&lt;br /&gt;&lt;br /&gt;- ANSI 문자열에서 유니코드로의 변환 방법 &lt;br /&gt;&lt;br /&gt;// sTime이란 ANSI 문자열을 bstr이란 이름의 유니코드(BSTR 타입) 변수로 변환&lt;br /&gt;char sTime[] = "유니코드 변환 예제";&lt;br /&gt;BSTR bstr;&lt;br /&gt;// sTime을 유니코드로 변환하기에 앞서 먼저 그 길이를 알아야 한다.&lt;br /&gt;int nLen = MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), NULL, NULL);&lt;br /&gt;// 얻어낸 길이만큼 메모리를 할당한다.&lt;br /&gt;bstr = SysAllocStringLen(NULL, nLen);&lt;br /&gt;// 이제 변환을 수행한다.&lt;br /&gt;MultiByteToWideChar(CP_ACP, 0, sTime, lstrlen(sTime), bstr, nLen);&lt;br /&gt;// 필요없어지면 제거한다.&lt;br /&gt;SysFreeString(bstr);&lt;br /&gt;- 유니코드에서 ANSI 문자열로의 변환 방법 &lt;br /&gt;&lt;br /&gt;// newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환&lt;br /&gt;char *sTime;&lt;br /&gt;int nLen = WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 0, NULL, NULL);&lt;br /&gt;sTime = malloc(nLen+1);&lt;br /&gt;WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 128, NULL, NULL);&lt;br /&gt;// 필요없으면 메모리를 제거한다.&lt;br /&gt;free(sTime);&lt;br /&gt;- 유니코드 문자열을 UTF-8으로 변환하기 &lt;br /&gt;&lt;br /&gt;WideCharToMultiByte 함수를 호출할 때 첫 번째 인자로 CP_UTF8을 지정하면 된다. UTF-8은 유니코드의 인코딩 스킴 중의 하나로 쉽게 말하자면 문자열 스트림에서 0을 빼고 표현하는 방법이라고 볼 수 있다.&lt;br /&gt;&lt;br /&gt;3. 레지스트리 읽기/쓰기&lt;br /&gt;API를 이용해서 레지스트리에 한 항목을 생성하거나 기존 항목의 값을 읽어들이려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;레지스트리 관련 API를 사용하려면 winreg.h라는 헤더 파일을 소스에 포함해야 합니다. 레지스트리에 키를 생성하는 방법과 레지스트리에 존재하는 키의 값을 읽는 방법을 차례로 살펴보겠습니다.&lt;br /&gt;&lt;br /&gt;- 레지스트리 키 생성 예제 &lt;br /&gt;&lt;br /&gt;// 예를 들어 HKEY_LOCAL_MACHINE밑의 System\CurrentControlSet\Services\GenPort라는 키를&lt;br /&gt;// 생성하고 거기에 DWORD 타입의 값으로 Type을 만들고 문자열 타입의 값으로 Group&lt;br /&gt;// 을 만들어 본다.&lt;br /&gt;#include "winreg.h"&lt;br /&gt;LONG error = 0;&lt;br /&gt;HKEY hKey;&lt;br /&gt;DWORD dwDisp, dwData;&lt;br /&gt;char lpData[] = "Write this down";&lt;br /&gt;&lt;br /&gt;// 먼저 만들려는 키가 이미 존재하는 것인지 살혀본다.&lt;br /&gt;error = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\GenPort",&lt;br /&gt;                        0, KEY_ALL_ACCESS, &amp;hKey);&lt;br /&gt;&lt;br /&gt;if (error != ERROR_SUCCESS) // 없다면 새로 생성한다.&lt;br /&gt;{&lt;br /&gt; // 키를 생성한다.&lt;br /&gt; error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,&lt;br /&gt;  "System\\CurrentControlSet\\Services\\GenPort", 0, "REG_BINARY", &lt;br /&gt;         REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &amp;hKey, &amp;dwDisp);&lt;br /&gt;               // 위의 키 밑에 Type이란 DWORD 타입의 값을 만들고 1로 초기화&lt;br /&gt; dwData = 0x1;&lt;br /&gt; error = RegSetValueEx( hKey, "Type", 0, REG_DWORD,&amp;dwData,4); &lt;br /&gt;               // 위의 키 밑에 Group이란 문자열 타입의 값을 만들고 lpData의 값으로 초기화&lt;br /&gt; error = RegSetValueEx( hKey, "Group", 0, REG_SZ, lpData, strlen(lpData)); &lt;br /&gt;&lt;br /&gt;               // 키를 닫는다.&lt;br /&gt; RegCloseKey(hKey); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- 기존의 레지스트리 키에서 값 읽기 &lt;br /&gt;&lt;br /&gt;// HKEY_CURRENT_USER\Software\Netscape\Netscape Navigator\Main 밑의 Install Directory&lt;br /&gt;// 값의 문자열 값을 읽어들인다.&lt;br /&gt;DWORD dwType, cbData;&lt;br /&gt;HKEY hSubKey; &lt;br /&gt;long lRet;&lt;br /&gt;char pszString[255];&lt;br /&gt;&lt;br /&gt;// 키를 오픈한다.&lt;br /&gt;if ((lRet = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Netscape\\Netscape Navigator\\Main",&lt;br /&gt;  0, KEY_READ | KEY_QUERY_VALUE , &amp;hSubKey)) == ERROR_SUCCESS)&lt;br /&gt;{&lt;br /&gt; cbData = 255; // 문자열 값을 읽어올 데이터의 크기를 준다.&lt;br /&gt; if ((lRet = RegQueryValueEx(hSubKey, "Install Directory",&lt;br /&gt;  NULL, &amp;dwType, pszString, &amp;cbData)) == ERROR_SUCCESS)&lt;br /&gt; {&lt;br /&gt;  // 제대로 읽힌 경우&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  // 에러가 발생한 경우&lt;br /&gt; }&lt;br /&gt; RegCloseKey(hSubKey);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- 레지스트리 키 삭제하기 - RegDeleteKey 함수를 사용한다. &lt;br /&gt;&lt;br /&gt;4. 윈도우 탐색기로부터의 Drag&amp;Drop을 받으려면&lt;br /&gt;윈도우 탐색기로부터 제가 만든 윈도우로의 drag&amp;drop이 가능하게 하려면 어떻게 해야 합니까 ?&lt;br /&gt;&lt;br /&gt;다음 순서를 따라서 프로그래밍하시면 됩니다. &lt;br /&gt;&lt;br /&gt;프로그램의 초기화시에 DragAcceptFiles(hWnd, TRUE) 함수를 호출한다. 첫 번째 인자인 hWnd는 드롭의 타겟이 되는 윈도우의 핸들이다. &lt;br /&gt;탐색기로부터 파일이 드롭되는 순간에 WM_DROPFILES 메시지가 날라온다. 이를 처리한다. &lt;br /&gt;&lt;br /&gt;case WM_DROPFILES :&lt;br /&gt;{&lt;br /&gt; POINT pt;&lt;br /&gt; // 어느 위치에 드롭되었는지 그 항목을 알아낸다.&lt;br /&gt; if (DragQueryPoint((HDROP)wParam, &amp;pt)) &lt;br /&gt; {&lt;br /&gt;  UINT i = 0;&lt;br /&gt;  // 모두 몇 개의 파일이 드롭되었는지 알아낸다.&lt;br /&gt;  // 만일 폴더가 드롭되었다면 폴더의 이름만 넘어온다.&lt;br /&gt;  UINT uCount = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL ,0);&lt;br /&gt;&lt;br /&gt;  for(i = 0;i &lt; uCount;i++)&lt;br /&gt;  {&lt;br /&gt;   // 드롭된 파일의 이름을 알아온다.&lt;br /&gt;   DragQueryFile((HDROP)wParam, i, buffer ,255);&lt;br /&gt;   // 드롭된 파일 이름을 출력해본다.&lt;br /&gt;   MessageBox(hWnd, buffer, "File Name", MB_OK);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; // drag and drop 작업을 끝낸다.&lt;br /&gt; DragFinish((HDROP)wParam);&lt;br /&gt; break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Drag&amp;drop을 더 사용할 필요가 없어지면 DragAcceptFiles를 호출한다. &lt;br /&gt;&lt;br /&gt;DragAcceptFiles(hWnd, FALSE);&lt;br /&gt;5. 시스템의 모든 드라이브 알아내기&lt;br /&gt;현재 시스템에 붙어있는 모든 드라이브(네트웍 드라이브 포함)에 대한 정보를 알아내고 싶습니다.&lt;br /&gt;&lt;br /&gt;GetLogicalDriveStrings로 시스템에 마운트되어있는 모든 드라이브 정보를 알아낸다. 두 번째 인자인 buffer로 드라이브 정보가 들어오는데 그 구조는 c:\,d:\과 같은 형식이며 리턴값으로 그 버퍼의 크기가 들어온다.&lt;br /&gt;&lt;br /&gt;char buffer[256];&lt;br /&gt;DWORD dwRet;&lt;br /&gt;LPSTR token;&lt;br /&gt;&lt;br /&gt;dwRet = GetLogicalDriveStrings(256, buffer);&lt;br /&gt;&lt;br /&gt;루프를 돌면서 드라이브별 정보를 알아낸다. 이 때는 GetVolumeInformation 함수를 이용한다.&lt;br /&gt;&lt;br /&gt;token = buffer; // token이 지금 처리해야할 드라이브를 가리킨다.&lt;br /&gt;while (dwRet &gt; 0)&lt;br /&gt;{&lt;br /&gt; DWORD FileSystemFlag;&lt;br /&gt; char FileSystemName[64];&lt;br /&gt;   &lt;br /&gt; strcpy(DriveString, token);&lt;br /&gt; // VolumeName으로 드라이브에 대한 설명 문자열이 넘어온다.&lt;br /&gt; if (GetVolumeInformation(token, VolumeName, 255, NULL, NULL, &lt;br /&gt;                         &amp;FileSystemFlag, FileSystemName, 63))&lt;br /&gt; {&lt;br /&gt;        // 원하는 작업을 수행한다.  &lt;br /&gt; }&lt;br /&gt; dwRet -= (strlen(token)+1);&lt;br /&gt; token = token + strlen(token)+1; // 다음 드라이브로 진행한다.&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;6. 드라이브/디렉토리/파일의 이미지 리스트 인덱스 얻기&lt;br /&gt;특정 드라이브/디렉토리/파일이 시스템 이미지 리스트에서 어떤 인덱스를 갖는지 알고 싶습니다.&lt;br /&gt;&lt;br /&gt;각 파일이나 드라이브 및 디렉토리에 대한 정보는 Shell 라이브러리에서 제공해주는 SHGetFileInfo 함수를 이용하면 됩니다. 다음의 함수는 첫 번째 인자인 lpFileName으로 주어진 파일에 대한 설명을 두 번째 인자로 받아오고 세 번째 인자로는 시스템 이미지 리스트에서의 인덱스를 얻어옵니다.&lt;br /&gt;&lt;br /&gt;void GetFileInfo(LPSTR lpFileName, LPSTR lpDesc, int *nIndex)&lt;br /&gt;{&lt;br /&gt;    DWORD dwAttr;&lt;br /&gt;    SHFILEINFO sfi;&lt;br /&gt;&lt;br /&gt;    int hIcon = SHGetFileInfo(lpFileName, dwAttr, &amp;sfi, sizeof(SHFILEINFO), &lt;br /&gt;   SHGFI_TYPENAME | SHGFI_SYSICONINDEX); &lt;br /&gt;    *nIndex = sfi.iIcon;&lt;br /&gt;    strcpy(lpDesc, sfi.szTypeName);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;7. 리스트 컨트롤에 칼럼 헤더 넣기&lt;br /&gt;리포트뷰 형식의 리스트 컨트롤에 컬럼 헤더를 집어 넣으려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;// &lt;문서명, 등록날짜, 상태&gt; : 3개의 헤더를 만든다.&lt;br /&gt;LV_COLUMN col;&lt;br /&gt;&lt;br /&gt;col.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;&lt;br /&gt;col.fmt = LVCFMT_LEFT;&lt;br /&gt;col.cx = 100;&lt;br /&gt;col.pszText = "문서명";&lt;br /&gt;col.cchTextMax = strlen(col.pszText);&lt;br /&gt;ListView_SetColumn(hListView, 0, &amp;col); &lt;br /&gt;&lt;br /&gt;col.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;&lt;br /&gt;col.fmt = LVCFMT_LEFT;&lt;br /&gt;col.cx = 100;&lt;br /&gt;col.pszText = "등록날짜";&lt;br /&gt;col.cchTextMax = strlen(col.pszText);&lt;br /&gt;ListView_InsertColumn(hListView, 0, &amp;col); &lt;br /&gt;&lt;br /&gt;col.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;&lt;br /&gt;col.fmt = LVCFMT_LEFT;&lt;br /&gt;col.cx = 100;&lt;br /&gt;col.pszText = "상태";&lt;br /&gt;col.cchTextMax = strlen(col.pszText);&lt;br /&gt;ListView_InsertColumn(hListView, 1, &amp;col);&lt;br /&gt;&lt;br /&gt;8. 리스트뷰에 항목 삽입하기&lt;br /&gt;리스트뷰에 한 항목을 추가하고 싶습니다.&lt;br /&gt;&lt;br /&gt;// 이미지 리스트와 부가 정보를 사용하지 않는 리스트뷰 컨트롤이다.&lt;br /&gt;int nIndex;&lt;br /&gt;LV_ITEM item;&lt;br /&gt;&lt;br /&gt;// - 첫번째 컬럼 -&lt;br /&gt;item.mask = LVIF_TEXT; // 이미지 리스트를 사용하려면 LVIF_IMAGE를 추가하고&lt;br /&gt;                              // 부가정보를 지정해야할 일이 있다면 LVIF_PARAM을 추가한다.&lt;br /&gt;item.pszText = lpDocName;&lt;br /&gt;item.cchTextMax = strlen(lpDocName);&lt;br /&gt;item.iItem = 1;&lt;br /&gt;item.iSubItem = 0;&lt;br /&gt;nIndex = ListView_InsertItem(hListView, &amp;item); &lt;br /&gt;// - 두번째 컬럼 -&lt;br /&gt;item.mask = LVIF_TEXT;&lt;br /&gt;item.iItem   = nIndex;&lt;br /&gt;item.pszText = lpDate;&lt;br /&gt;item.cchTextMax = strlen(lpDate);&lt;br /&gt;item.iSubItem = 1;&lt;br /&gt;ListView_SetItem(hListView, &amp;item); &lt;br /&gt;// - 세번째 컬럼 -&lt;br /&gt;item.mask = LVIF_TEXT;&lt;br /&gt;item.iItem   = nIndex;&lt;br /&gt;item.pszText = "";&lt;br /&gt;item.cchTextMax = strlen(lpDocName);&lt;br /&gt;item.iSubItem = 2;&lt;br /&gt;ListView_SetItem(hListView, &amp;item); &lt;br /&gt;&lt;br /&gt;9. 리스트뷰 컨트롤에서의 정렬 구현&lt;br /&gt;리스트뷰 컨트롤에서 칼럼 헤더를 눌렀을 때 정렬이 되도록 하려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;일단 리스트뷰 컨트롤의 생성시 윈도우 스타일로 LVS_NOSORTHEADER를 주지 않는다. &lt;br /&gt;리스트뷰로부터 칼럼 헤더가 눌렸을 때 오는 이벤트를 받아들인다.&lt;br /&gt;&lt;br /&gt;NM_LISTVIEW *pnmtv = (NM_LISTVIEW FAR *)lParam;&lt;br /&gt;&lt;br /&gt;switch(pnmtv-&gt;hdr.code)&lt;br /&gt;{&lt;br /&gt; case LVN_COLUMNCLICK :&lt;br /&gt; {&lt;br /&gt;  // 어느 항목(pnmtv-&gt;iSubItem)이 눌렸는지부터 검사한다. &lt;br /&gt;  // g_iSubItem은 어느 항목이 눌렸는지 기록해두는 인덱스이다.&lt;br /&gt;  g_iSubItem = pnmtv-&gt;iSubItem;&lt;br /&gt;  // 정렬함수를 호출한다. CompareFunc가 정렬함수이다.&lt;br /&gt;  ListView_SortItems(hListView, (PFNLVCOMPARE)CompareFunc, (LPARAM)this); &lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;리스트뷰 항목을 정렬하는데 사용되는 CompareFunc라는 함수를 만든다. 이는 보통 C 함수로 만들거나 클래스를 사용할 경우에는 클래스 내의 static 함수로 만든다. CompareFunc의 코드는 다음과 같다.&lt;br /&gt;&lt;br /&gt;int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)&lt;br /&gt;{&lt;br /&gt; LV_FINDINFO lvfi;&lt;br /&gt; int iFirstItem, iSecondItem;&lt;br /&gt;&lt;br /&gt; lvfi.flags = LVFI_PARAM;&lt;br /&gt; lvfi.lParam = lParam1;&lt;br /&gt; iFirstItem = ListView_FindItem(hListWnd, -1, &amp;lvfi); &lt;br /&gt;&lt;br /&gt; lvfi.flags = LVFI_PARAM;&lt;br /&gt; lvfi.lParam = lParam2;&lt;br /&gt; iSecondItem = ListView_FindItem(hListWnd, -1, &amp;lvfi); &lt;br /&gt;&lt;br /&gt; char lpFirst[100];&lt;br /&gt; char lpSecond[100];&lt;br /&gt; ListView_GetItemText(hListWnd, iFirstItem, g_iSubItem, lpFisrt, 100);&lt;br /&gt; ListView_GetItemText(hListWnd, iSecondItem, g_iSubItem, lpSecond, 100);&lt;br /&gt;&lt;br /&gt; // g_iSubItem 컬럼의 성격에 따라 비교한다. 문자열이라면 아래와 같이 한다.&lt;br /&gt; int iRet = strcmpi(lpFirst, lpSecond); &lt;br /&gt; return iRet;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;10. 버전 정보 알아내기 코드&lt;br /&gt;파일의 버전을 API를 통해 알아내려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;Resource의 한 타입으로 VERSIONINFO라는 것이 존재합니다. 여기에 해당 파일의 버전 정보를 기록하도록 되어있습니다. 이 버전 정보를 읽어오는데 ver.dll이라는 DLL에 들어있는 API들을 사용합니다. 주의할 점은 버전 리소스는 언어별로 설정이 되기 때문에 영어로도 읽어보고 한국어 로도 읽어봐야 한다는 것입니다. 다음 예제를 참고하시기 바랍니다. &lt;br /&gt;&lt;br /&gt;// szDrvName이란 파일에 들어있는 버전 정보를 읽어온다. &lt;br /&gt;#include &lt;br /&gt;&lt;br /&gt;DWORD      dwSize, handle;&lt;br /&gt;LPSTR      lpstrVffInfo;&lt;br /&gt;HANDLE     hMem;&lt;br /&gt;LPSTR      lpVersion;    // 이 변수로 파일의 버전 정보가 들어온다.&lt;br /&gt;char       szDrvName[80];  // 버전 정보를 알아내고자 하는 파일 이름이 여기에 들어온다.&lt;br /&gt;&lt;br /&gt;....&lt;br /&gt;// 버전 정보 블록의 크기를 알아온다.&lt;br /&gt;dwSize = GetFileVersionInfoSize(szDrvName , &amp;handle);&lt;br /&gt;if (dwSize) // 버전 정보 블록이 존재하면&lt;br /&gt;{ &lt;br /&gt; // 버전 정보 블록을 포함할 메모리 블록을 할당 받아둔다.&lt;br /&gt; hMem = GlobalAlloc(GMEM_MOVEABLE, dwSize);&lt;br /&gt; lpstrVffInfo  = GlobalLock(hMem);&lt;br /&gt; // 버전 정보 블록의 내용을 읽어온다. &lt;br /&gt; GetFileVersionInfo(szDrvName, handle, dwSize, lpstrVffInfo);&lt;br /&gt;        // 버전 정보 블록에서 버전 정보를 읽어온다.&lt;br /&gt;        VerQueryValue((LPVOID)lpstrVffInfo, &lt;br /&gt;                       (LPSTR)"\\StringFileInfo\\041204B0\\FileVersion",&lt;br /&gt;                       (void FAR* FAR*)&amp;lpVersion, (UINT FAR *)&amp;dwSize);&lt;br /&gt; // lpVersion에 들어있는 버전 정보를 사용한다.&lt;br /&gt; ....&lt;br /&gt; GlobalUnlock(hMem);&lt;br /&gt; GlobalFree(hMem);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;위에서 041204B0가 바로 버전 리소스에 사용된 언어가 무엇인지를 나타냅니다. 이는 영어를 나타내며 한국어의 경우에는 040904B0를 사용하면 됩니다. 이 밖에도 version.lib를 링크의 라이브러리 항목에 추가해야 합니다. &lt;br /&gt;&lt;br /&gt;11. 시스템 사양 알아내기&lt;br /&gt;현재 시스템에 부착되어 있는 메인 메모리의 양과 CPU와 운영체제의 종류를 알고 싶습니다.&lt;br /&gt;&lt;br /&gt;먼저 시스템에 부착되어 있는 메인 메모리의 크기는 GlobalMemoryStatus라는 API를 이용하면 됩니다. 예제 코드는 다음과 같습니다. &lt;br /&gt;&lt;br /&gt;//===========================================================&lt;br /&gt;// lMemTotal      : 실제 메모리의 전체 크기 (KB 단위)&lt;br /&gt;// lAvailMemTotal : 사용 가능한 실제 메모리의 크기 (KB 단위)&lt;br /&gt;// lVirtualTotal  : 가상 메모리의 전체 크기  (KB 단위)&lt;br /&gt;//===========================================================&lt;br /&gt;void GetMemoryStatus(long *lMemTotal, long *lAvailMemTotal, long *lVirtualTotal)&lt;br /&gt;{&lt;br /&gt; double var;&lt;br /&gt; MEMORYSTATUS memoryStatus;&lt;br /&gt;&lt;br /&gt; memset (&amp;memoryStatus, sizeof (MEMORYSTATUS), 0);&lt;br /&gt; memoryStatus.dwLength = sizeof (MEMORYSTATUS);&lt;br /&gt;&lt;br /&gt; GlobalMemoryStatus (&amp;memoryStatus);&lt;br /&gt;&lt;br /&gt; lMemTotal = memoryStatus.dwTotalPhys / 1024;&lt;br /&gt; lAvailMemTotal = memoryStatus.dwAvailPhys / 1024;&lt;br /&gt; lVirtualTotal = memoryStatus.dwTotalVirtual / 1024;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;다음으로 CPU의 종류를 알아내는 코드는 다음과 같습니다. &lt;br /&gt;&lt;br /&gt;//===============================================================&lt;br /&gt;// GetProcessorInfo : 프로세서에 대한 정보를 읽어온다.&lt;br /&gt;// lpCPUSpeed      : CPU의 속도. 기록된 시스템에서만 읽어온다.&lt;br /&gt;// lpProcessorType : 프로세서의 종류&lt;br /&gt;// lpNumProcessors : 프로세서의 개수. NT의 경우에만 의미가 있다.&lt;br /&gt;//===============================================================&lt;br /&gt;void GetProcessorInfo(LPSTR lpCPUSpeed, LPSTR lpProcessorType, LPSTR lpNumProcessors)&lt;br /&gt;{&lt;br /&gt; SYSTEM_INFO sysInfo;&lt;br /&gt; LONG result;&lt;br /&gt; HKEY hKey;&lt;br /&gt; DWORD data;&lt;br /&gt; DWORD dataSize;&lt;br /&gt;&lt;br /&gt; lpCPUSpeed[0] = 0;&lt;br /&gt; // ---------------------------------------------&lt;br /&gt; // 프로세서의 속도를 얻어낸다.&lt;br /&gt; // ---------------------------------------------&lt;br /&gt; result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,&lt;br /&gt;  "Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &amp;hKey);&lt;br /&gt; if (result == ERROR_SUCCESS) &lt;br /&gt; {&lt;br /&gt;  result = ::RegQueryValueEx (hKey, "~MHz", NULL, NULL,(LPBYTE)&amp;data, &amp;dataSize);&lt;br /&gt;  wsprintf(lpCPUSpeed, "%d MHz", data);&lt;br /&gt; }&lt;br /&gt; RegCloseKey (hKey);&lt;br /&gt;&lt;br /&gt; // ------------------------------------------&lt;br /&gt; // 하드웨어 정보를 얻어낸다.&lt;br /&gt; // ------------------------------------------&lt;br /&gt; GetSystemInfo (&amp;sysInfo);&lt;br /&gt;&lt;br /&gt; // 프로세서 타입부터 검사한다.&lt;br /&gt; if (sysInfo.dwProcessorType  == PROCESSOR_INTEL_386)&lt;br /&gt;  strcpy(lpProcessorType,  "Intel 386");&lt;br /&gt; else if (sysInfo.dwProcessorType  == PROCESSOR_INTEL_486)&lt;br /&gt;  strcpy(lpProcessorType,  "Intel 486");&lt;br /&gt; else if (sysInfo.dwProcessorType  == PROCESSOR_INTEL_PENTIUM)&lt;br /&gt; {&lt;br /&gt;  if (sysInfo.wProcessorLevel == 6) &lt;br /&gt;   strcpy(lpProcessorType, "Intel Pentium (II/Pro)");&lt;br /&gt;  else&lt;br /&gt;   strcpy(lpProcessorType,  "Intel Pentium");&lt;br /&gt; }&lt;br /&gt; else &lt;br /&gt;  strcpy(lpProcessorType, "알 수 없는 시스템");&lt;br /&gt;&lt;br /&gt; // 프로세서의 갯수를 검사한다.&lt;br /&gt; wsprintf(lpNumProcessors, "%d", sysInfo.dwNumberOfProcessors);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;다음으로 현재 사용 중인 운영체제의 종류를 알아내는 코드는 다음과 같습니다. &lt;br /&gt;&lt;br /&gt;//===============================================================&lt;br /&gt;// GetOSVersion : OS의 버전을 얻어온다.&lt;br /&gt;// --------------------------------------------------------------&lt;br /&gt;// lpstInfo&lt;br /&gt;// lpstBuildNumber&lt;br /&gt;// lpstServicePack&lt;br /&gt;//===============================================================&lt;br /&gt;void GetOSVersion (LPSTR lpstInfo, LPSTR lpstBuildNumber, LPSTR lpstServicePack)&lt;br /&gt;{&lt;br /&gt; int stat = 0;&lt;br /&gt; TCHAR data [64];&lt;br /&gt; DWORD dataSize;&lt;br /&gt; DWORD win95Info;&lt;br /&gt; OSVERSIONINFO versionInfo;&lt;br /&gt; HKEY hKey;&lt;br /&gt; LONG result;&lt;br /&gt;&lt;br /&gt; lpstServicePack[0] = 0;&lt;br /&gt; versionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);&lt;br /&gt;&lt;br /&gt; // 버전 정보를 얻어낸다.&lt;br /&gt; if (!::GetVersionEx (&amp;versionInfo)) &lt;br /&gt; {&lt;br /&gt;  strcpy(lpstInfo, "운영체제 정보를 얻을 수 없습니다.");&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // NT이면 서버인지 웍스테이션인지 검사한다. 이는 레지스트리를 보고 검사한다.&lt;br /&gt; if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) &lt;br /&gt; {&lt;br /&gt;  strcpy(lpstInfo, "Windows NT");&lt;br /&gt;  dataSize = sizeof (data);  &lt;br /&gt;  result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,&lt;br /&gt;   "System\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &amp;hKey);&lt;br /&gt;  if (result != ERROR_SUCCESS) &lt;br /&gt;   return;&lt;br /&gt;&lt;br /&gt;  result = ::RegQueryValueEx (hKey, "ProductType", NULL, NULL, (LPBYTE) data, &amp;dataSize);&lt;br /&gt;  RegCloseKey (hKey);&lt;br /&gt;&lt;br /&gt;  if (result != ERROR_SUCCESS) &lt;br /&gt;   return;&lt;br /&gt;&lt;br /&gt;  if (lstrcmpi (data, "WinNT") == 0) &lt;br /&gt;   strcpy(lpstInfo, "Windows NT Workstation");&lt;br /&gt;  else if (lstrcmpi (data, "ServerNT") == 0) &lt;br /&gt;   strcpy(lpstInfo, "Windows NT Server");&lt;br /&gt;  else &lt;br /&gt;   strcpy(lpstInfo, "Windows NT Server - Domain Controller");&lt;br /&gt;&lt;br /&gt;  // NT 버전을 알아낸다.&lt;br /&gt;  if (versionInfo.dwMajorVersion == 3 || versionInfo.dwMinorVersion == 51) &lt;br /&gt;   strcat(lpstInfo, " 3.51");&lt;br /&gt;  else if (versionInfo.dwMajorVersion == 5) // 윈도우 2000의 경우&lt;br /&gt;   strcat(lpstInfo, " 5.0");&lt;br /&gt;  else &lt;br /&gt;   strcat(lpstInfo, " 4.0");&lt;br /&gt;&lt;br /&gt;  // Build 번호를 알아낸다.&lt;br /&gt;  wsprintf(lpstBuildNumber, "%d", versionInfo.dwBuildNumber);&lt;br /&gt; }&lt;br /&gt; else if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &lt;br /&gt; {&lt;br /&gt;  strcpy(lpstInfo, "Windows 95");&lt;br /&gt;  if ((versionInfo.dwMajorVersion &gt; 4) || ((versionInfo.dwMajorVersion == 4)&lt;br /&gt;   &amp;&amp; (versionInfo.dwMinorVersion &gt; 0))) &lt;br /&gt;  {&lt;br /&gt;   strcpy(lpstInfo, "Windows 98");&lt;br /&gt;  }&lt;br /&gt;  // 윈도우 95는 Build 번호가 하위 워드에 들어간다.&lt;br /&gt;  win95Info = (DWORD)(LOBYTE(LOWORD(versionInfo.dwBuildNumber)));&lt;br /&gt;  wsprintf(lpstBuildNumber, "%d", win95Info);&lt;br /&gt; }&lt;br /&gt; else &lt;br /&gt;  wsprintf(lpstInfo, "Windows 3.1");&lt;br /&gt;&lt;br /&gt; // 서비스 팩 정보를 얻어낸다.&lt;br /&gt; strcpy(lpstServicePack, versionInfo.szCSDVersion);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;12. IE의 설치 여부와 버전 확인&lt;br /&gt;현재 시스템에 IE가 설치되었는지 여부와 그 버전을 알려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;사실 동작시켜보지 않고서는 IE가 제대로 설치되어있는지 알아내는 방법은 없지만 레지스트리를 통해 IE가 설치되었는지 여부와 버전을 확인할 수 있습니다. 그 함수는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;//===========================================================================&lt;br /&gt;// GetIEVersion : IE의 버전을 얻는다. 정보를 찾을 수 없으면 FALSE를 리턴한다.&lt;br /&gt;//===========================================================================&lt;br /&gt;BOOL GetIEVersion(LPSTR lpVer)&lt;br /&gt;{ &lt;br /&gt; LONG result;&lt;br /&gt; HKEY hKey;&lt;br /&gt; DWORD dwType; &lt;br /&gt; char data[65];&lt;br /&gt; DWORD dataSize = 64;&lt;br /&gt;&lt;br /&gt; // --------------------&lt;br /&gt; // IE의 버전을 얻는다.&lt;br /&gt; // --------------------&lt;br /&gt; result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Internet Explorer", 0, KEY_QUERY_VALUE, &amp;hKey);&lt;br /&gt; if (result == ERROR_SUCCESS) &lt;br /&gt; {&lt;br /&gt;  result = ::RegQueryValueEx (hKey, "Version", NULL, &amp;dwType, (unsigned char *)data, &amp;dataSize);&lt;br /&gt;  strcpy(lpVer, data);&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt;  return FALSE;&lt;br /&gt;&lt;br /&gt; RegCloseKey (hKey);&lt;br /&gt; return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;13. IE의 보안 설정 보기&lt;br /&gt;IE에 보면 네 단계의 보안 영역이 있습니다. 그 영역별로 설정되어있는 보안 설정값을 읽으려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;IE에는 다음과 같은 네 가지 보안 영역이 존재합니다. &lt;br /&gt;&lt;br /&gt;인터넷 영역 &lt;br /&gt;로컬 인터넷 영역 &lt;br /&gt;신뢰할 수 있는 사이트 영역 &lt;br /&gt;제한된 사이트 영역 &lt;br /&gt;IE는 보안 영역 설정과 관련하여 Internet Security Manager와 Internet Zone Manager라는 인터페이스가 존재합니다. 이를 이용해 보안 영역의 보안을 설정하고 특정 IP나 도메인 이름을 등록할 수 있습니다. 자세한 사항은 레퍼런스를 찾아보기 바랍니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include "objbase.h"&lt;br /&gt;#include "urlmon.h"&lt;br /&gt;&lt;br /&gt;char szTemp1[256];&lt;br /&gt;char szTemp2[256];&lt;br /&gt;HRESULT hr;&lt;br /&gt;IInternetSecurityManager *pSecurityMgr;&lt;br /&gt;IInternetZoneManager *pZoneMgr;&lt;br /&gt;DWORD dwEnum, dwZoneCount;&lt;br /&gt;// --- 변수 선언부&lt;br /&gt;DWORD dwZone;&lt;br /&gt;ZONEATTRIBUTES zoneAttr;&lt;br /&gt;int nLevel = 2;&lt;br /&gt;&lt;br /&gt;// COM 라이브러리를 초기화한다.&lt;br /&gt;CoInitialize(NULL);&lt;br /&gt;dwEnum = 0;&lt;br /&gt;pSecurityMgr = NULL;&lt;br /&gt;pZoneMgr = NULL;&lt;br /&gt;&lt;br /&gt;// Internet Security 인터페이스 초기화&lt;br /&gt;hr = CoCreateInstance(CLSID_InternetSecurityManager, NULL, CLSCTX_ALL, //INPROC_SERVER,&lt;br /&gt;  IID_IInternetSecurityManager, (void**)&amp;pSecurityMgr);&lt;br /&gt;if (hr != S_OK)&lt;br /&gt;{&lt;br /&gt; return;&lt;br /&gt;}&lt;br /&gt;hr = CoCreateInstance(CLSID_InternetZoneManager, NULL, CLSCTX_ALL, //INPROC_SERVER,&lt;br /&gt;  IID_IInternetZoneManager, (void**)&amp;pZoneMgr); &lt;br /&gt;if (hr != S_OK)&lt;br /&gt;{&lt;br /&gt; return;&lt;br /&gt;}&lt;br /&gt;dwEnum = 0;&lt;br /&gt;&lt;br /&gt;// 보안 영역 열거자(Zone Enumerator)를 초기화한다.&lt;br /&gt;pZoneMgr-&gt;CreateZoneEnumerator(&amp;dwEnum, &amp;dwZoneCount, 0);&lt;br /&gt;for(DWORD i = 1;i &lt; dwZoneCount;i++)&lt;br /&gt;{&lt;br /&gt; pZoneMgr-&gt;GetZoneAt(dwEnum, i, &amp;dwZone);&lt;br /&gt; pZoneMgr-&gt;GetZoneAttributes(dwZone, &amp;zoneAttr);&lt;br /&gt;&lt;br /&gt; // zoneAttr.szDisplayName에 보안 영역의 이름이 들어오는데 유니코드이다. 이를 변환한다.&lt;br /&gt; WideCharToMultiByte(CP_ACP, 0, zoneAttr.szDisplayName, -1, szTemp1, 255, NULL, NULL); &lt;br /&gt; // zoneAttr.dwTemplateCurrentLevel에는 보안 영역의 보안값 설정이 들어온다.&lt;br /&gt; wsprintf(szTemp2, "%x", zoneAttr.dwTemplateCurrentLevel);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// 보안 영역 열거자(Zone Enumerator)를 제거한다.&lt;br /&gt;if (dwEnum != 0)&lt;br /&gt; pZoneMgr-&gt;DestroyZoneEnumerator(dwEnum);&lt;br /&gt;&lt;br /&gt;pSecurityMgr-&gt;Release();&lt;br /&gt;pZoneMgr-&gt;Release();&lt;br /&gt;// COM 라이브러리를 메모리에서 내린다.&lt;br /&gt;CoUninitialize();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;14. ActiveX 컨트롤의 등록 방법&lt;br /&gt;Regsvr32 같은 유틸리티를 이용하지 않고 프로그램 내에서 컨트롤을 레지스트리에 등록하려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;모든 AcitveX 컨트롤은 자신을 레지스트리에 등록하기위한 목적으로 DllRegisterServer라는 함수를 갖고 있습니다. ActiveX 컨트롤을 메모리로 로드한 다음에 이 함수를 불러주면 원하는 일을 수행할 수 있습니다. 반대로 ActiveX 컨트롤을 레지스트리에서 제거하기 위한 용도로 DllUnRegisterServer라는 함 수도 존재합니다.&lt;br /&gt;&lt;br /&gt;// ==============================================================&lt;br /&gt;// RegisterOCX     지정된 ActiveX 컨트롤을 레지스트리에 등록한다.&lt;br /&gt;// --------------------------------------------------------------&lt;br /&gt;// LPSTR pszString 등록하고자 하는 ActiveX 컨트롤의 절대 경로명&lt;br /&gt;// ==============================================================&lt;br /&gt;BOOL WINAPI RegisterOCX(LPSTR pszString)&lt;br /&gt;{&lt;br /&gt; int iReturn = 0;&lt;br /&gt; HRESULT (STDAPICALLTYPE * lpDllEntryPoint)();&lt;br /&gt; HINSTANCE hLib;&lt;br /&gt;&lt;br /&gt; // OLE 라이브러리를 초기화한다.    &lt;br /&gt; if (FAILED(OleInitialize(NULL)))&lt;br /&gt; {&lt;br /&gt;  MessageBox(GetFocus(), "OLE 초기화 실패", "에러", MB_OK);&lt;br /&gt;  return FALSE;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // 지정된 activeX 컨트롤을 메모리로 로드한다.&lt;br /&gt; hLib = LoadLibrary(pszString);&lt;br /&gt; if (hLib &lt;= NULL)&lt;br /&gt; {&lt;br /&gt;  MessageBox(GetFocus(), "파일을 로드하는데 실패했습니다.", "에러", MB_OK);&lt;br /&gt;  OleUninitialize();&lt;br /&gt;  return FALSE;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // "DllRegisterServer" 함수의 위치를 찾는다.&lt;br /&gt; lpDllEntryPoint = (long (__stdcall *)(void))GetProcAddress(hLib, "DllRegisterServer");&lt;br /&gt;&lt;br /&gt; // 이 함수를 호출합니다.&lt;br /&gt; if (lpDllEntryPoint)&lt;br /&gt; {&lt;br /&gt;  if (FAILED((*lpDllEntryPoint)()))&lt;br /&gt;  {&lt;br /&gt;   DWORD dwRet;&lt;br /&gt;   char szTemp[128];&lt;br /&gt;&lt;br /&gt;   dwRet = GetLastError();&lt;br /&gt;   wsprintf(szTemp, "에러 번호 : %lx", dwRet);&lt;br /&gt;   MessageBox(GetFocus(), szTemp, "DllRegisterServer 에러", MB_OK);&lt;br /&gt;   FreeLibrary(hLib);&lt;br /&gt;   OleUninitialize();&lt;br /&gt;   return FALSE;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  MessageBox(GetFocus(), "DllRegisterServer를 찾을 수 없습니다.", "에러", MB_OK);&lt;br /&gt;  FreeLibrary(hLib);&lt;br /&gt;  OleUninitialize();&lt;br /&gt;  return FALSE;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; FreeLibrary(hLib);&lt;br /&gt; OleUninitialize();&lt;br /&gt; return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;15. 데이터 파일의 실행&lt;br /&gt;탐색기에서 실행 파일이 아닌 데이터 파일을 더블클릭하면 그 데이터 파일과 연결된 실행 파일이 실행되면서 그 파일을 물고 올라갑니다. 이를 구현하는 방법을 알려주세요.&lt;br /&gt;&lt;br /&gt;ShellExecuteEx라는 API를 사용하면 됩니다. 다음 함수는 인자로 데이터 파일 혹은 실행 파일의 경로를 받아서 실행해줍니다. 데이터 파일의 경우에는 연결된 실행 파일을 찾아서 그걸 실행해줍니다. &lt;br /&gt;&lt;br /&gt;BOOL Execute(LPSTR lpPath)&lt;br /&gt;{&lt;br /&gt; char FilePath[255];&lt;br /&gt; SHELLEXECUTEINFO  ExecInfo;&lt;br /&gt;&lt;br /&gt; // lpPath를 나누어 본다.&lt;br /&gt; char drive[_MAX_DRIVE];&lt;br /&gt; char dir[_MAX_DIR];&lt;br /&gt; char fname[_MAX_FNAME];&lt;br /&gt; char ext[_MAX_EXT];&lt;br /&gt;&lt;br /&gt; _splitpath(lpPath, drive, dir, fname, ext);&lt;br /&gt; // 디렉토리 경로를 얻는다.&lt;br /&gt; strcpy(FilePath, drive);&lt;br /&gt; strcat(FilePath, dir);&lt;br /&gt;&lt;br /&gt; // 파일 이름을 얻는다.&lt;br /&gt; strcat(fname, ".");&lt;br /&gt; strcat(fname, ext);&lt;br /&gt;&lt;br /&gt; SHELLEXECUTEINFO  ExecInfo;&lt;br /&gt; ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); &lt;br /&gt; ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; &lt;br /&gt; ExecInfo.hwnd = hWnd; &lt;br /&gt; ExecInfo.lpVerb = "open"; &lt;br /&gt; ExecInfo.lpFile = fname; &lt;br /&gt; ExecInfo.lpParameters = NULL; &lt;br /&gt; ExecInfo.lpDirectory = FilePath; &lt;br /&gt; ExecInfo.nShow = SW_SHOW; &lt;br /&gt; ExecInfo.hInstApp = g_hInstance; // g_hInstance는 프로그램의 인스턴스 핸들&lt;br /&gt;&lt;br /&gt; return ShellExecuteEx(&amp;ExecInfo);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;16. 파일의 존재 여부 테스트 &lt;br /&gt;어떤 파일이 실제로 존재하는 것인지 간단히 테스트해보는 방법은 무엇인가요 ?&lt;br /&gt;&lt;br /&gt;CreateFile API를 사용하면 됩니다. 파일을 열때 플래그 중의 하나로 OPEN_EXISTING이라는 것이 있는데 이를 사용하면 됩니다. 다음 코드를 예로 보시기 바랍니다.&lt;br /&gt;&lt;br /&gt;hFile = CreateFile("C:\\TEMP\\test.txt", GENERIC_READ, 0, NULL,  &lt;br /&gt;  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);&lt;br /&gt;if (hFile != INVALID_HANDLE_VALUE)&lt;br /&gt;{&lt;br /&gt; // 파일이 존재하는 경우&lt;br /&gt; CloseHandle(hFile);&lt;br /&gt;}&lt;br /&gt;17. API를 이용한 파일 I/O&lt;br /&gt;API를 이용한 파일 입출력에 대한 예제 코드가 없습니까 ?&lt;br /&gt;&lt;br /&gt;프로그래밍을 하다보면 간혹 파일 I/O를 API를 이용해 수행해야 할 경우가 있습니다. 이 때 다음의 예제 코드를 복사해다가 사용하면 편리할 것입니다. MFC의 CFile을 이용한 파일 I/O에 대해 알고 싶으시면 요기를 클릭하세요.&lt;br /&gt;&lt;br /&gt;- 파일 쓰기의 경우 &lt;br /&gt;&lt;br /&gt;HANDLE fp;&lt;br /&gt;DWORD NumberOfBytesWritten;&lt;br /&gt;char lpBuffer[1024];&lt;br /&gt;&lt;br /&gt;// FileName이 지정한 파일의 이름이 있으면 그걸 열고 없으면 그 이름으로 하나 생성한다.&lt;br /&gt;if ((fp=CreateFile((LPCTSTR)FileName, GENERIC_WRITE | GENERIC_READ, 0, NULL, &lt;br /&gt;     OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)&lt;br /&gt;{&lt;br /&gt; // 파일 열기 에러 발생&lt;br /&gt;}  &lt;br /&gt;// 필요한 만큼 WriteFile의 호출을 반복한다. 파일 포인터의 이동시에는 SetFilePointer API를 이용한다.&lt;br /&gt;WriteFile(fp, lpBuffer, 1024, &amp;NumberOfBytesWritten, NULL);&lt;br /&gt;if (NumberOfBytesWritten != 1024)&lt;br /&gt;{&lt;br /&gt; // 파일 쓰기 에러 발생 &lt;br /&gt; CloseHandle(fp);  &lt;br /&gt;}&lt;br /&gt;// 작업이 다 끝났으면 파일을 닫는다.&lt;br /&gt;CloseHandle(fp); &lt;br /&gt;&lt;br /&gt;- 파일 읽기의 경우 &lt;br /&gt;&lt;br /&gt;HANDLE fp;&lt;br /&gt;DWORD NumberOfBytesRead;&lt;br /&gt;char lpBuffer[1024];&lt;br /&gt;&lt;br /&gt;if ((fp=CreateFile((LPCTSTR)FileName, GENERIC_READ, &lt;br /&gt; FILE_SHARE_READ, NULL, OPEN_EXISTING, &lt;br /&gt; FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)&lt;br /&gt;{&lt;br /&gt; // 파일 열기 에러 발생&lt;br /&gt;}  &lt;br /&gt;// 필요한 만큼 ReadFile의 호출을 반복한다.&lt;br /&gt;ReadFile(fp, lpBuffer, 1024, &amp;NumberOfBytesRead, NULL);&lt;br /&gt;if (NumberOfBytesRead != 1024)&lt;br /&gt;{&lt;br /&gt; // 파일 읽기 에러 발생 &lt;br /&gt; CloseHandle(fp);  &lt;br /&gt;}&lt;br /&gt;// 작업이 다 끝났으면 파일을 닫는다.&lt;br /&gt;CloseHandle(fp);&lt;br /&gt;&lt;br /&gt;파일 포인터의 이동시에는 SetFilePointer라는 API를 사용하고 파일의 크기를 알고 싶을 때는 GetFileSize라는 API를 사용한다.&lt;br /&gt;&lt;br /&gt;18. GetParent API의 리턴값&lt;br /&gt;다이얼로그 박스에서 GetParent API를 호출했을 때 리턴되는 값이 이상합니다.&lt;br /&gt;&lt;br /&gt;GetParent API의 리턴값은 보통의 윈도우에서는 윈도우 생성시 지정한 부모/자식 윈도우 간의 관계에 따라 달라집니다. 하지만 다이얼로그 박스의 경우에는 다릅니다. 다이얼로그 박스는 GetParent를 호출하면 무조건 그 것이 속한 응용프로그램의 메인 윈도우 핸들이 리턴됩니다. &lt;br /&gt;&lt;br /&gt;19. 특정 프로그램을 실행하고 종료를 기다리기&lt;br /&gt;특정 프로그램을 실행한 다음에 그 프로그램이 종료될 때 다른 일을 하고 싶습니다. 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;다음은 CreateProcess를 이용해서 특정 프로그램의 실행이 끝나기를 기다리는 코드입니다.&lt;br /&gt;&lt;br /&gt;// buffer에 실행하고자하는 파일이름이 들어온다.&lt;br /&gt;void DoCreate(HWND hWnd, LPSTR buffer)&lt;br /&gt;{&lt;br /&gt; STARTUPINFO            sui;&lt;br /&gt; PROCESS_INFORMATION    pi;&lt;br /&gt; DWORD                  ret;&lt;br /&gt;&lt;br /&gt; memset(&amp;sui, 0x00, sizeof(STARTUPINFO));&lt;br /&gt; sui.cb = sizeof(STARTUPINFO);&lt;br /&gt;   &lt;br /&gt; ret = CreateProcess(buffer, NULL, NULL, NULL, FALSE, &lt;br /&gt;  0, NULL, NULL,&amp;sui, &amp;pi);&lt;br /&gt; if (ret == TRUE) // 제대로 실행되었으면&lt;br /&gt; {&lt;br /&gt;  hProcess = pi.hProcess;&lt;br /&gt;  // 실행이 끝나기를 대기한다.&lt;br /&gt;  WaitForSingleObject(hProcess, 0xffffffff);&lt;br /&gt;  CloseHandle(hProcess);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;20. 파일 열기 다이얼로그 띄우기&lt;br /&gt;API를 이용해 파일 오픈 다이얼로그를 띄우고 싶습니다.&lt;br /&gt;&lt;br /&gt;API를 이용해 파일 오픈 다이얼로그를 띄우는 방법은 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;#define MAXCHARS   255&lt;br /&gt;OPENFILENAME       ofn;&lt;br /&gt;char               buffer[MAXCHARS];&lt;br /&gt;&lt;br /&gt;memset(&amp;ofn, 0x00, sizeof(OPENFILENAME));&lt;br /&gt;ofn.lStructSize = sizeof(OPENFILENAME);&lt;br /&gt;ofn.hwndOwner = hWnd;&lt;br /&gt;ofn.lpstrFilter = "모든 파일\000*.*\000\000";&lt;br /&gt;ofn.lpstrInitialDir = m_szTemp;&lt;br /&gt;ofn.nFilterIndex = 1;&lt;br /&gt;ofn.lpstrFile = buffer;&lt;br /&gt;ofn.nMaxFile = MAXCHARS;&lt;br /&gt;ofn.lpstrTitle = "파일 선택하기";&lt;br /&gt;&lt;br /&gt;if (GetOpenFileName(&amp;ofn))  // 사용자가 파일을 제대로 선택한 경우&lt;br /&gt;{&lt;br /&gt; // ....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;21. 긴 파일 이름과 짧은 파일 이름간의 변환 방법&lt;br /&gt;주어진 긴 파일 이름에 해당하는 짧은 파일 이름을 알려면 어떻게 해야하나요 ?&lt;br /&gt;&lt;br /&gt;긴 파일 이름에서 짧은 파일 이름으로의 변환 : GetShortPathName API 사용 &lt;br /&gt;짧은 파일 이름에서 긴 파일 이름으로의 변환 : GetFullPathName API 사용 &lt;br /&gt;&lt;br /&gt;22. 시스템 이미지 리스트 얻어내기&lt;br /&gt;탐색기 등에서 사용되는 시스템 이미지 리스트를 사용할 수 있는 방법이 있는지 알고 싶습니다.&lt;br /&gt;&lt;br /&gt;물론 있습니다. SHGetFileInfo라는 API를 이용하면 됩니다. 이를 이용하면 16X16이나 32X32 크기의 이미지 리스트를 얻어낼 수 있습니다.&lt;br /&gt;&lt;br /&gt;SHFILEINFO sfi;&lt;br /&gt;HIMAGELIST sysSmallList, sysLargeList;&lt;br /&gt;&lt;br /&gt;sysSmallList = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &amp;sfi,   sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);&lt;br /&gt;sysLargeList = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &amp;sfi,   sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_ICON);&lt;br /&gt;&lt;br /&gt;23. 리스트뷰 컨트롤에서 스타일 동적 변경하기&lt;br /&gt;리스트뷰 컨트롤에서 리스트(LVS_ICON) 스타일을 사용 중인데 이를 실행 중에 리포트(LVS_REPORT) 스타일로 변경하고 싶습니다. 어떻게 해야할까요 ?&lt;br /&gt;&lt;br /&gt;윈도우의 스타일은 윈도우 엑스트라 바이트라는 영역에 저장됩니다. 이 곳의 데이터를 읽고 쓰는데 GetWindowLong, SetWindowLong 같은 API를 사용하는데 다음 코드를 예로 보시기 바랍니다.&lt;br /&gt;&lt;br /&gt;리스트 스타일에서 리포트 스타일로 &lt;br /&gt;&lt;br /&gt;LONG lStyle = GetWindowLong(hListWnd, GWL_STYLE);&lt;br /&gt;SetWindowLong(hListWnd, GWL_STYLE, (lStyle &amp; ~LVS_LIST) | LVS_REPORT);&lt;br /&gt;리포트 스타일에서 리스트 스타일로 &lt;br /&gt;&lt;br /&gt;LONG lStyle = GetWindowLong(hListWnd, GWL_STYLE);&lt;br /&gt;SetWindowLong(hListWnd, GWL_STYLE, (lStyle &amp; ~LVS_REPORT) | LVS_LIST);&lt;br /&gt;24. 윈도우와 다이얼로그에서 클래스 포인터의 사용&lt;br /&gt;제가 만든 C++ 클래스내에서 윈도우를 생성합니다. 생성한 윈도우의 윈도우 프로시저는 그 클래스의 정적 멤버 함수로 선언되어 있습니다. 정적 함수의 경우에는 데이터 멤버를 접근하지 못하기 때문에 접근하게 하려고 윈도우를 생성한 그 클래스의 객체에 대한 포인터를 전역 변수로 유지하여 사용하고 있습니다. 별로 깨끗한 방법도 아닌 것 같고 또 동시에 여러 개의 객체가 동작할 경우에는 에러가 날 수밖에 없는데 해결 방법이 없을까요 ?&lt;br /&gt;&lt;br /&gt;이는 다이얼로그의 경우에도 마찬가지입니다. 윈도우 생성시 사용하는 CreateWindow나 CreateWindowEx 같은 함수를 보면 마지막 인자로 윈도우 생성 데이터라는 것을 지정하게 되어있습니다. 다이얼로그 생성시에는 DialogBox라는 API말고 DialogBoxParam이라는 API가 있어서 마지막 인자로 초기화 데이터를 넘겨줄 수 있도록 되어있는데 이것과 윈도우 엑스트라 바이트를 같이 사용하면 정적함수로 선언된 윈도우 프로시저나 다이얼로그박스 프로시저내에서 객체에 대한 포인터를 사용할 수 있습니다. 예를 들어 살펴보겠습니다. &lt;br /&gt;&lt;br /&gt;윈도우의 경우 &lt;br /&gt;다음과 같이 CExplorerBar라는 클래스내에서 윈도우를 하나 생성합니다. CreateWindowEx 함수나 CreateWindow 함수의 마지막 인자로 this 포인터를 지정합니다.&lt;br /&gt;&lt;br /&gt;BOOL CExplorerBar::RegisterAndCreateWindow(void)&lt;br /&gt;{&lt;br /&gt; ....&lt;br /&gt; CreateWindowEx( 0,  EB_CLASS_NAME, NULL,&lt;br /&gt;                    WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER,&lt;br /&gt;                    rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,&lt;br /&gt;                    m_hwndParent, NULL, g_hInst, (LPVOID)this);&lt;br /&gt;     &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;위에서 생성한 윈도우의 윈도우 프로시저는 WndProc이고 CExplorerBar 클래스의 정적 멤버 함수로 존재한다고 가정하겠습니다.&lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK CExplorerBar::WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt; CExplorerBar  *pThis = (CExplorerBar*)GetWindowLong(hWnd, GWL_USERDATA);&lt;br /&gt;&lt;br /&gt; switch (uMessage)&lt;br /&gt; {&lt;br /&gt;  case WM_NCCREATE:&lt;br /&gt;  {&lt;br /&gt;   LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;&lt;br /&gt;   pThis = (CExplorerBar*)(lpcs-&gt;lpCreateParams);&lt;br /&gt;   SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis);&lt;br /&gt;  }&lt;br /&gt;  break;&lt;br /&gt;  case WM_CREATE :&lt;br /&gt;   return pThis-&gt;OnCreate();&lt;br /&gt;&lt;br /&gt;WM_NCCREATE 메시지에서 lParam 인자로 넘어오는 CExplorerBar 객체에 대한 포인터를 받아서 윈도우 엑스트라 바이트로 저장하고 있습니다. 윈도우 엑스트라 바이트는 윈도우 마다 할당되는 고유의 영역으로 사용자 정의 영역으로 GWL_USERDATA가 정의되어 있습니다. 여기에다 CExplorerBar 객체에 대한 포인터를 저장해두고 윈도우 프로시저에 진입할 때마다 이 값을 pThis라는 변수에 대입해 놓고 사용합니다. 참고로 WM_NCCREATE는 WM_CREATE 메시지보다 먼저 발생하는 메시지입니다. &lt;br /&gt;&lt;br /&gt;다이얼로그의 경우 &lt;br /&gt;예를 들어 CKTree라는 클래스내의 한 멤버 함수에서 다이얼로그 박스를 띄운다고 가정하겠습니다.&lt;br /&gt;&lt;br /&gt;BOOL CKTree::SelectFolder(short sTypes, long dwFolderID, short  bCreationEnabled)&lt;br /&gt;{&lt;br /&gt; // ......&lt;br /&gt; if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_FOLDER_SELECT), hWnd, (DLGPROC)SelectFolderDlg, (LPARAM)this))&lt;br /&gt;DialogBoxParam 함수는 DialogBox 함수보다 인자가 하나 더 있는데 그것이 바로 다이얼로그 프로시저의 WM_INITDIALOG 메시지의 lParam 인자로 넘어갑니다. 여기에 CKTree 객체에 대한 포인터를 넘깁니다. 그리고나서 다이얼로그 박스 프로시저의 WM_INITDIALOG 메시지에서 이를 받아서 &lt;br /&gt;&lt;br /&gt;LRESULT CALLBACK SelectFolderDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)&lt;br /&gt;{&lt;br /&gt; switch (message) &lt;br /&gt; { &lt;br /&gt;        case WM_INITDIALOG:&lt;br /&gt;  {&lt;br /&gt;   // lParam으로 넘어온 값을 KPointer라는 윈도우 프로퍼티에 저장한다.&lt;br /&gt;   SetProp(hDlg, "KPointer", (HANDLE)lParam);&lt;br /&gt;   .......&lt;br /&gt;  case  WM_NOTIFY :&lt;br /&gt;  {&lt;br /&gt;   // CKTree 객체에 대한 포인터가 필요하면 KPointer 윈도우 프로퍼티 값을 읽어들인다.&lt;br /&gt;   CKTree *pKTree = (CKMartTree *)GetProp(hDlg, "KPointer");&lt;br /&gt;   if (pKTree-&gt;m_bWait)&lt;br /&gt;   {&lt;br /&gt;    .....&lt;br /&gt;&lt;br /&gt;여기서는 앞서 윈도우와는 달리 윈도우 프로퍼티라는 것을 이용해서 넘어온 포인터 정보를 저장하고 필요할 때 읽어옵니다. 여기서 앞서의 윈도우 엑스트라 바이트를 사용해도 무방합니다.&lt;br /&gt;&lt;br /&gt;25. 특정 프린터로 출력하기&lt;br /&gt;제 PC에는 두 대의 프린터가 붙어있습니다. 다이얼로그를 띄우지 않고 상황에 따라 다른 프린터로 출력하고 싶은데 동적으로 HDC를 생성하는 방법을 모르겠습니다.&lt;br /&gt;&lt;br /&gt;CreateDC를 이용하면 됩니다. 시스템 디렉토리의 WIN.INI를 보면 [Devices]라는 섹션이 있는데 이 아래로 이 시스템에 설치되어 있는 모든 프린터 드라이버의 목록이 나옵니다. 예를 들어 다음과 같이 나옵니다.&lt;br /&gt;&lt;br /&gt;[Devices]&lt;br /&gt;HUNFAX=HUNFAX,FaxModem&lt;br /&gt;삼성 SLB-6216H PCL5=SSMPCL5,\\영업팀\볼륨프린터&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt;프린터별로 DeviceName=DriverName,OutputName와 같은 구조로 구성되어 있습니다. 이 값들을 CreateDC의 인자로 사용하면 됩니다. 예를 들어 위에서 두 번째 프린터의 DC를 생성하려면 다음과 같이 CreateDC를 호출합니다.&lt;br /&gt;&lt;br /&gt;// hDC = CreateDC(DriverName, DeviceName, OutputName, NULL);&lt;br /&gt;hDC = CreateDC ("SSMPCL5", "삼성 SLB-6216H PCL5", "\\\\영업팀\\볼륨프린터", NULL) ;&lt;br /&gt;CreateDC의 마지막 인자로는 프린터의 설정값을 변경할 수 있습니다. 예를 들어 가로로 찍는다든지 2장을 찍는다든지 하는 설정을 변경하는데 사용됩니다. NULL을 주면 디폴트 값을 사용합니다. 다른 설정을 사용하고 싶다면 다음과 같이 합니다. CreateDC 호출 앞에서 DocumentProperties라는 함수를 호출하여 프린터의 기본 설정을 읽어온 다음에 이를 변경합니다. 다음 예는 출력 방향을 가로로 변경하는 예제입니다.&lt;br /&gt;&lt;br /&gt;// 프린터의 디폴트 설정을 읽어온다.&lt;br /&gt;LPDEVMODE lpoutDevMode;&lt;br /&gt;HANDLE hPrinter;&lt;br /&gt;HDC hPrnDC;&lt;br /&gt;&lt;br /&gt;// 프린터의 핸들을 얻는다.&lt;br /&gt;if (OpenPrinter( lpDeviceName, &amp;hPrinter,  NULL))&lt;br /&gt;{&lt;br /&gt; // OpenPrinter로 얻은 프린터의 초기 설정을 DocumentProperties API로 얻어온다.&lt;br /&gt; // 먼저 마지막 인자를 0으로 해서 DocumentProperties를 호출하여 필요한 버퍼의 크기를 알아옵니다.&lt;br /&gt; long lSize = DocumentProperties(GetFocus(), hPrinter, lpPrinterName, NULL, NULL, 0);&lt;br /&gt; lpoutDevMode = (LPDEVMODE)malloc(lSize);&lt;br /&gt; long lRet = DocumentProperties(GetFocus(), hPrinter, lpPrinterName, lpoutDevMode, NULL, DM_OUT_BUFFER);&lt;br /&gt; if (lRet == IDOK)&lt;br /&gt; {&lt;br /&gt;  // 프린터의 인쇄 방향 설정을 변경한다.&lt;br /&gt;  // 여기서 원하는 변환을 수행한다.&lt;br /&gt;  lpoutDevMode-&gt;dmOrientation = DMORIENT_LANDSCAPE;&lt;br /&gt; }&lt;br /&gt; hPrnDC = CreateDC (lpDriverName, lpDeviceName, lpOutputName, lpoutDevMode) ;&lt;br /&gt; free(lpoutDevMode);&lt;br /&gt; return hPrnDC;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;26. 메뉴 관련 함수&lt;br /&gt;메뉴 항목을 하나 추가하려고 합니다. InsertMenuItem API를 사용하는데 윈도우 3.1에서와 사용법이 다른 것 같습니다.&lt;br /&gt;&lt;br /&gt;사용법이 달라졌습니다. &lt;br /&gt;&lt;br /&gt;MENUITEMINFO mii;&lt;br /&gt;&lt;br /&gt;memset(&amp;mii, 0x00, sizeof(MENUITEMINFO));&lt;br /&gt;mii.cbSize = sizeof(MENUITEMINFO);&lt;br /&gt;mii.fMask = MIIM_TYPE;&lt;br /&gt;mii.fType = MFT_SEPARATOR;&lt;br /&gt;InsertMenuItem(hSubMenu, GetMenuItemCount(hSubMenu), TRUE,  &amp;mii);&lt;br /&gt;      &lt;br /&gt;mii.cbSize = sizeof(MENUITEMINFO);&lt;br /&gt;mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;&lt;br /&gt;mii.fType = MFT_STRING;&lt;br /&gt;mii.fState = MFS_DEFAULT | MFS_UNHILITE;&lt;br /&gt;mii.wID = ID_WORKPLACE_REMOVE;&lt;br /&gt;mii.dwTypeData = "바구니에서 제거";&lt;br /&gt;InsertMenuItem(hSubMenu, GetMenuItemCount(hSubMenu), TRUE,  &amp;mii);&lt;br /&gt;&lt;br /&gt;27. 코드 실행 중에 다른 윈도우 메시지 처리하기 &lt;br /&gt;하나의 함수 내에서 시간이 오래 걸리는 작업을 하고 있습니다. 이 때 작업 취소를 위한 별도의 다이얼로그를 하나 띄워 두었는데 이 쪽의 버튼이 눌리지 않습니다. 어떻게 해야할까요 ? &lt;br /&gt;&lt;br /&gt;시간이 오래 걸리는 작업을 별도의 스레드로 만들어 처리하던지 아니면 시간이 오래 걸리는 작업을 수행하는 함수 안에서 다음 코드를 가끔 호출해주면 됩니다. 만일 루프를 돌고 있다면 루프내에서 한번씩 호출해주면 됩니다.&lt;br /&gt;&lt;br /&gt;MSG       msg;&lt;br /&gt;&lt;br /&gt;while (PeekMessage(&amp;msg, NULL, NULL, NULL, TRUE))&lt;br /&gt;{&lt;br /&gt; TranslateMessage(&amp;msg);&lt;br /&gt; DispatchMessage(&amp;msg);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;VB에서라면 DoEvents라는 메소드를 호출해주면 됩니다.&lt;br /&gt;&lt;br /&gt;28. 메인 윈도우에서 캡션을 제거하고 싶습니다. 어떻게 해야 합니까?&lt;br /&gt;윈도우를 생성할 때 WS_CAPTION이란 스타일을 지정하지 않아도 항상 윈도우의 캡션이 보입니다. 이를 제거하려면 어떻게 해야 하나요 ?&lt;br /&gt;&lt;br /&gt;캡션을 제거하려는 윈도우의 WM_NCCREATE 메시지를 처리해야 합니다. 이 메시지는 WM_CREATE 메시지보다 앞서 발생하는 메시지입니다. NC는 Non-Client를 나타냅니다. GetWindowLong과 SetWindowLong API를 이용해서 WS_CAPTION 스타일을 제거합니다. 이 두 API는 앞서 리스트뷰 컨트롤에서 스타일 동적 변경하기에서 이미 사용해본 바 있습니다.&lt;br /&gt;&lt;br /&gt; case WM_NCCREATE :&lt;br /&gt; {&lt;br /&gt;  long lStyle;&lt;br /&gt;   &lt;br /&gt;  lStyle = GetWindowLong(hWnd, GWL_STYLE);&lt;br /&gt;  lStyle = (lStyle &amp; (~WS_CAPTION)); &lt;br /&gt;  SetWindowLong (hWnd, GWL_STYLE, lStyle);&lt;br /&gt;  return TRUE;&lt;br /&gt; }&lt;br /&gt;29. 사각형 형태 이외의 모양을 갖는 윈도우를 띄우고 싶습니다.&lt;br /&gt;윈도우는 기본 모양이 사각형인데 다른 형태의 모양을 갖는 윈도우를 띄우려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;원하는 모양을 Region이란 것으로 만들어야 합니다. 만든 다음에 이것을 원하는 시점에 SetWindowRgn라는 API를 이용해 윈도우에 설정해주면 됩니다. 예를 들어 타원 모양의 윈도우를 띄우고 싶다면 다음과 같이 해주면 됩니다.&lt;br /&gt;&lt;br /&gt;HRGN g_hRgn;&lt;br /&gt;&lt;br /&gt;g_hRgn = CreateEllipticRgn(0, 0, 700, 600);&lt;br /&gt;SetWindowRgn(hWnd, g_hRgn, FALSE);  &lt;br /&gt;&lt;br /&gt;이렇게 했을 경우 윈도우의 위치 이동이 문제가 됩니다. 보통 캡션을 잡고 이동시켜야 하는데 캡션이 없으니까 문제가 됩니다. 이에 관한 것은 31. 윈도우의 이동 처리하기를 참고하기 바랍니다. &lt;br /&gt;&lt;br /&gt;30. 시스템에 설치되어 있는 모든 프린터 드라이버 알아내기&lt;br /&gt;현재 시스템에 설치되어 있는 모든 프린터 드라이버의 종류를 알아내고 싶습니다.&lt;br /&gt;&lt;br /&gt;EnumPrinters라는 API를 사용하면 됩니다. 다음 코드는 현재 시스템에 설치되어 있는 모든 프린터 드라이버(로컬과 네트웍 프린터 포함)의 이름을 메시지박스로 보여주는 예제입니다.&lt;br /&gt;&lt;br /&gt;BOOL bSuccess;&lt;br /&gt;DWORD cbRequired, cbBuffer, nEntries;&lt;br /&gt;PRINTER_INFO_1 *lpBuffer = NULL;&lt;br /&gt;&lt;br /&gt;// 버퍼의 크기를 알아낸다. cbRequired로 들어온다.&lt;br /&gt;EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 1, (unsigned char *)lpBuffer, 0, &amp;cbRequired, &amp;nEntries);&lt;br /&gt;cbBuffer = cbRequired;&lt;br /&gt;// 버퍼를 다시 버퍼를 잡는다.&lt;br /&gt;lpBuffer = (PRINTER_INFO_1 *)malloc(cbBuffer);&lt;br /&gt;// 프린터의 종류를 알아낸다.&lt;br /&gt;bSuccess = EnumPrinters(PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL, NULL, 1, (unsigned char *)lpBuffer, cbRequired, &amp;cbRequired, &amp;nEntries);&lt;br /&gt;if (bSuccess == FALSE)&lt;br /&gt;{&lt;br /&gt; free(lpBuffer);&lt;br /&gt; // 다른 이유로 에러가 난 경우&lt;br /&gt; return;&lt;br /&gt;}&lt;br /&gt;// 알아낸 프린터를 하나씩 enumerate한다.&lt;br /&gt;for (int i = 0;i &lt; nEntries; i++)&lt;br /&gt;{&lt;br /&gt; ::MessageBox(NULL, lpBuffer[i].pName, "프린터 이름", MB_OK);&lt;br /&gt;   }&lt;br /&gt;free(lpBuffer);&lt;br /&gt;&lt;br /&gt;31. 윈도우의 이동 처리하기&lt;br /&gt;보통 윈도우는 캡션 영역을 잡고 위치 이동을 수행하게 되는데 윈도우의 특정 영역을 잡고 이동할 수 있게 하려면 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;WM_NCHITTEST라는 메시지를 잘(?) 처리하면 어느 영역이든 윈도우 이동을 처리할 수 있습니다. 마우스로 윈도우 위를 이동하면 WM_NCHITTEST, WM_SETCURSOR, WM_MOUSEMOVE 같은 메시지들이 발생합니다. WM_NCHITTEST는 현재 마우스가 윈도우의 어느 영역위에 있는지 알아내기 위해 사용됩니다. 이 메시지의 처리부에서 HTCAPTION이란 값을 리턴해주면 윈도우 운영체제는 지금 마우스 포인터가 윈도우의 캡션 부분에 와있다고 생각해서 여기서 드래그 작업이 시작될 경우에 윈도우의 위치를 이동시켜 버립니다. 다음 코드는 WM_NCHITTEST 메시지를 처리하여 현재 마우스 좌표가 정해진 영역에 있으면 HTCAPTION을 돌려주는 예제입니다.&lt;br /&gt;&lt;br /&gt;case WM_NCHITTEST:&lt;br /&gt;{&lt;br /&gt; // 현재 마우스 위치를 바탕으로 pt 변수를 채운다.&lt;br /&gt; POINT pt(LOWORD(lParam), HIWORD(lParam));&lt;br /&gt;&lt;br /&gt; // 마우스 좌표를 윈도우의 좌측 상단 기준의 좌표로 변경한다.&lt;br /&gt; ScreenToClient(hWnd, &amp;pt);&lt;br /&gt; // 지정된 사각형 안에 포함되는 점인지 검사한다. &lt;br /&gt; // g_TitleRect는 RECT 타입의 변수로 지정된 사각형의 좌표가 들어있다.&lt;br /&gt; if (PtInRect(&amp;g_TitleRect, pt))&lt;br /&gt;  return HTCAPTION;   &lt;br /&gt; break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;32. 바탕 화면 위의 모든 윈도우를 최소화하거나 모든 최소화 실행 취소&lt;br /&gt;바탕 화면 위의 모든 윈도우를 최소화하거나 모두 최소화 실행 취소를 프로그램으로 구현하는 방법을 알고 싶습니다.&lt;br /&gt;&lt;br /&gt;태스크바의 빈 공간을 오른쪽 마우스 버튼으로 클릭해보면 팝업 메뉴가 뜨는데 거기에 보면 "모든 창을 최소화(M)"와 "모두 최소화 실행 취소(U)" 명령이 존재하는데 그것을 대신 선택해주는 형식으로 프로그램을 작성해주면 됩니다.&lt;br /&gt;&lt;br /&gt;다음은 "모든 창을 최소화"해주는 루틴입니다. keybd_event API를 이용해서 사용자가 키입력한 것처럼 흉내내줍니다.&lt;br /&gt;&lt;br /&gt;void IconizeAllWindow()&lt;br /&gt;{ &lt;br /&gt; keybd_event(0x5b, 0, 0, 0);&lt;br /&gt; keybd_event(77, 0, 0, 0);    // 'M' key&lt;br /&gt; keybd_event(0x5b, 0, 2, 0);&lt;br /&gt;}&lt;br /&gt;다음은 "모두 최소화 실행 취소" 루틴입니다.&lt;br /&gt;&lt;br /&gt;void RestoreWindowState()&lt;br /&gt;{&lt;br /&gt; keybd_event(0x5b, 0, 0, 0);&lt;br /&gt; keybd_event(84, 0, 0, 0);    // 'U' key&lt;br /&gt; keybd_event(0x5b, 0, 2, 0);&lt;br /&gt;}&lt;br /&gt;33. VxD 드라이버 호출하기&lt;br /&gt;Vxd 드라이버를 동적으로 로드해서 호출하고 싶습니다. 어떻게 해야합니까 ?&lt;br /&gt;&lt;br /&gt;먼저 해당하는 VxD 드라이버의 이름과 위치와 호출하려는 작업의 작업 코드명을 알아야 합니다. 드라이버의 로드는 CreateFile API를 이용합니다. VxD 드라이버의 호출은 DeviceIoControl API를 이용합니다. 자세한 설명은 DeviceIoControl API의 레퍼런스를 참고하기 바랍니다.&lt;br /&gt;&lt;br /&gt;DWORD byteReturned;&lt;br /&gt;&lt;br /&gt;// 먼저 VxD 드라이버를 오픈한다.&lt;br /&gt;hDevice = CreateFile("\\\\.\\NMOUSE.VXD", 0, 0, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);&lt;br /&gt;if (DeviceIoControl(hDevice, W32_SETHWND, &amp;hWnd, 4, NULL, 0, &amp;byteReturned, NULL))&lt;br /&gt;{&lt;br /&gt; // Success !!!&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Vxd 드라이버는 kernel 모드(이를 윈도우에서는 Ring 0라고 부릅니다)에서 동작하기 때문에 모든 하드웨어와 메모리를 바로 접근할 수 있습니다. VxD 드라이버를 작성하려면 DDK를 이용하거나 Numega의 DriverStudio나 KRFTech사의 WinDriver를 이용해야 합니다.&lt;br /&gt;&lt;br /&gt;34. Thread 실행시 에러&lt;br /&gt;CreateThread를 이용해 스레드를 만들어 생성하고 있습니다. 루틴에 이상은 없는 것 같은데 스레드가 많이 생성되어 시간이 좀 지나면 에러가 발생합니다. 이유가 무엇일까요 ?&lt;br /&gt;&lt;br /&gt;정말로 스레드 코드에 별 이상이 없다면 CreateThread API 대신에 beginthread나 beginthreadex를 사용해보기 바랍니다. 자세한 사항은 마이크로소프트의 Knowledge base를 참고하시기 바랍니다.&lt;br /&gt;&lt;br /&gt;35. 윈도우 운영체제 종료하기&lt;br /&gt;프로그램에서 특정 상황이 되면 윈도우 운영체제를 종료하고 싶습니다. &lt;br /&gt;&lt;br /&gt;ExitWindowsEx API를 사용하면 됩니다. 이 함수의 원형은 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;BOOL ExitWindowsEx(UINT uFlags, DWORD dwReserved);&lt;br /&gt;uFlags로 종료방법을 지정할 수 있습니다. 다음과 같은 값이 가능합니다.&lt;br /&gt;&lt;br /&gt;EWX_LOGOFF 현재 사용자를 로그오프한다. &lt;br /&gt;EWX_POWEROFF 시스템을 종료하고 파워오프한다. 파워오프는 이를 지원하는 하드웨어에서만 가능하다. &lt;br /&gt;EWX_REBOOT 시스템을 종료하고 시스템을 재시동한다. &lt;br /&gt;EWX_SHUTDOWN 시스템을 종료한다. &lt;br /&gt;EWX_FORCE WM_QUERYSESSION이나 WM_ENDQUERYSESSION을 보내지 않고 실행중인 모든 프로세스를 종료한다. 위의 네 가지 플래그들과 함께 사용할 수 있다. &lt;br /&gt;&lt;br /&gt;36. 디폴트 웹 브라우저 알아내기&lt;br /&gt;디폴트로 지정된 웹 브라우저를 실행하는 방법을 알고 싶습니다.&lt;br /&gt;&lt;br /&gt;디폴트로 지정된 웹 브라우저는 레지스트리에 자신을 등록합니다. .htm (혹은 .html) 파일의 편집기로 링크도 되지만 http, ftp, gopher 등의 프로토콜 연결 프로그램으로 등록됩니다. 제 생각에 가장 좋은 것은 http 프로토콜의 연결 프로그램을 찾아보는 것으로 생각됩니다. 다음 레지스트리 항목에 보면 연결된 웹 브라우저의 절대 경로를 알 수 있습니다.&lt;br /&gt;&lt;br /&gt;   HKEY_CLASSES_ROOT\http\shell\open\command&lt;br /&gt;&lt;br /&gt;이 항목의 값을 읽는 방법은 3. 레지스트리 읽기/쓰기를 참고하고 프로그램의 실행에 관한 부분은 19. 특정 프로그램을 실행하고 종료를 기다리기를 참고하거나 ShellExecute API 혹은 WinExec API를 사용하면 됩니다. 이 기능을 수행하는 함수는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;void LaunchDefaultWebBrowser(HWND hWnd)&lt;br /&gt;{&lt;br /&gt;   // HKEY_CLASSES_ROOT\http\shell\open\command&lt;br /&gt;DWORD dwType, cbData;&lt;br /&gt;HKEY hSubKey; &lt;br /&gt;long lRet;&lt;br /&gt;LPSTR pszString, pszSrcPath;&lt;br /&gt;&lt;br /&gt;// 키를 오픈한다.&lt;br /&gt;if ((lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, "http\\shell\\open\\command",&lt;br /&gt;  0, KEY_READ | KEY_QUERY_VALUE , &amp;hSubKey)) == ERROR_SUCCESS)&lt;br /&gt;{&lt;br /&gt; cbData = 255; // 문자열 값을 읽어올 데이터의 크기를 준다.&lt;br /&gt;       pszString = (LPSTR)malloc(255);&lt;br /&gt;       pszSrcPath = pszString;&lt;br /&gt; if ((lRet = RegQueryValueEx(hSubKey, "",&lt;br /&gt;  NULL, &amp;dwType, (unsigned char *)pszString, &amp;cbData)) == ERROR_SUCCESS)&lt;br /&gt; {&lt;br /&gt;  // pszString에 디폴트 웹 브라우저의 경로가 들어온다.&lt;br /&gt;           // pszString에서 "를 제거한다.&lt;br /&gt;           RemoveChar(pszString, '"');&lt;br /&gt;           WinExec(pszString, SW_SHOWNORMAL);            &lt;br /&gt; }&lt;br /&gt;       free(pszString);&lt;br /&gt; RegCloseKey(hSubKey);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void RemoveChar(LPSTR lpSrc, char chRemove)&lt;br /&gt;{&lt;br /&gt;LPTSTR pstrSource = lpSrc;&lt;br /&gt;LPTSTR pstrDest = lpSrc;&lt;br /&gt;LPTSTR pstrEnd = lpSrc + strlen(lpSrc);&lt;br /&gt;&lt;br /&gt;while (pstrSource &lt; pstrEnd)&lt;br /&gt;{&lt;br /&gt; if (*pstrSource != chRemove)&lt;br /&gt; {&lt;br /&gt;  *pstrDest = *pstrSource;&lt;br /&gt;  pstrDest = _tcsinc(pstrDest);&lt;br /&gt; }&lt;br /&gt; pstrSource = _tcsinc(pstrSource);&lt;br /&gt;}&lt;br /&gt;*pstrDest = '\0';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;37. 윈도우의 최대/최소 크기 설정&lt;br /&gt;윈도우의 캡션을 없앴을 경우 윈도우를 최대화했을 때 아래의 Task Bar가 가려져 버리는 현상이 생기는데.. 캡션이 있으면 Task Bar 위로만 최대화되는데 말입니다. 어떻게 해결할 수 있는 방법이 없나 궁금하네요.. &lt;br /&gt;&lt;br /&gt;말씀하신 문제를 해결하려면 WM_GETMINMAXINFO 메시지를 처리해야 합니다. 이는 윈도우의 최대 크기 등을 설정하기 위해 사용되는 메시지입니다. 다음과 같이 처리합니다.&lt;br /&gt;&lt;br /&gt;case WM_GETMINMAXINFO :&lt;br /&gt;{&lt;br /&gt;   LPMINMAXINFO lpmmi;&lt;br /&gt;   RECT rc;&lt;br /&gt;&lt;br /&gt;   SystemParametersInfo(SPI_GETWORKAREA, 0, &amp;rc,0);&lt;br /&gt;   lpmmi = (LPMINMAXINFO)lParam; &lt;br /&gt;   lpmmi-&gt;ptMaxSize.x = rc.right; &lt;br /&gt;   lpmmi-&gt;ptMaxSize.y = rc.bottom; &lt;br /&gt;   lpmmi-&gt;ptMaxPosition.x = 0; &lt;br /&gt;   lpmmi-&gt;ptMaxPosition.y = 0; &lt;br /&gt;   lpmmi-&gt;ptMinTrackSize.x = GetSystemMetrics(SM_CXMINTRACK); &lt;br /&gt;   lpmmi-&gt;ptMinTrackSize.y = GetSystemMetrics(SM_CYMINTRACK); &lt;br /&gt;   lpmmi-&gt;ptMaxTrackSize.x = GetSystemMetrics(SM_CXMAXTRACK); &lt;br /&gt;   lpmmi-&gt;ptMaxTrackSize.y = GetSystemMetrics(SM_CYMAXTRACK); &lt;br /&gt;   break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;38. Thread에서 Automation 메소드 호출시 에러 발생&lt;br /&gt;Thread를 생성하고 Automation 메소드를 호출했는데 에러가 발생합니다.&lt;br /&gt;&lt;br /&gt;App 클래스의 InitInstance 함수에서 AfxOleInit를 호출하는 부분을 CoInitializeEx(NULL, COINIT_MULTITHREADED)를 호출하는 것으로 변경하기 바랍니다. 그리고 App 클래스에 ExitInstance 함수를 추가하고 거기서 CoUninitialize를 호출하도록 하면 됩니다. MFC의 AfxOleInit는 기본적으로 STA(Single Threading Apartment) 모델을 사용합니다. Thread에서 자신이 생성하지 않는 COM 객체를 접근할 때는 MTA(Multiple Threading Apartment) 모델을 사용해야 합니다.&lt;br /&gt;&lt;br /&gt;39. 최상위 윈도우의 종료 방법&lt;br /&gt;현재 최상위 윈도우를 찾아서 종료하는 코드를 만들고 싶습니다.&lt;br /&gt;&lt;br /&gt;일단 현재 사용자가 작업 중인 최상위 윈도우의 핸들은 GetForegroundWindow API로 얻어냅니다. 그런데 그 윈도우가 자식 윈도우일 수 있기 때문에 GetParent API를 반복적으로 사용해서 최상위 탑 레벨 윈도우의 핸들을 알아냅니다. 종료하는 방법은 먼저 DestroyWindow를 호출해서 시도해보고 실패하면 시스템 메뉴의 "닫기" 명령을 이용해 처리합니다. 사실 이 것도 실패할 수 있는데 무조건 종료시키고 싶다면 아래 코드에서 주석 처리해 놓은 GetWindowThreadProcessId/Terminate API 부분을 사용하면 됩니다.&lt;br /&gt;&lt;br /&gt;   HWND hTopWnd = GetForegroundWindow();&lt;br /&gt;   if (hTopWnd == NULL)&lt;br /&gt;   {&lt;br /&gt;       return;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   while(GetParent(hTopWnd))&lt;br /&gt;   {&lt;br /&gt;       hTopWnd = GetParent(hTopWnd);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (DestroyWindow(hTopWnd) == FALSE)&lt;br /&gt;   {&lt;br /&gt;       SendMessage(hTopWnd, WM_SYSCOMMAND, SC_CLOSE, NULL);&lt;br /&gt;       //GetWindowThreadProcessId(hTopWnd, &amp;dwProcessId);&lt;br /&gt;       //TerminateProcess(dwProcessId);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;40. 인터넷 익스플로러의 위치 경로 알아내기&lt;br /&gt;인터넷 익스플로러가 설치된 절대 경로를 알고 싶습니다.&lt;br /&gt;&lt;br /&gt;레지스트리의 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\IExplore.exe 의 기본 값으로 인터넷 익스플로러의 설치 경로가 들어옵니다. 다음 함수를 호출하면 설치 경로를 얻어 줍니다. 인자로 넘어가는 lpPath는 적어도 256바이트 이상의 크기를 갖는 문자 배열이어야 합니다.&lt;br /&gt;&lt;br /&gt;BOOL GetIEPath(LPTSTR lpPath) &lt;br /&gt;{&lt;br /&gt;   long lRet;&lt;br /&gt;   HKEY hKey;&lt;br /&gt;&lt;br /&gt;   lRet = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\IExplore.exe", &amp;hKey);&lt;br /&gt;   if (lRet == ERROR_SUCCESS)&lt;br /&gt;   {&lt;br /&gt;       long cbData = 255;&lt;br /&gt;&lt;br /&gt;       RegQueryValue(hKey, "", lpPath, &amp;cbData);&lt;br /&gt;       RegCloseKey(hKey);&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;       return FALSE;&lt;br /&gt;   return TRUE;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3195451512451252859?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3195451512451252859/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3195451512451252859' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3195451512451252859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3195451512451252859'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/11/api.html' title='API'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-7206368363325324385</id><published>2007-11-04T21:38:00.001-08:00</published><updated>2007-11-04T21:38:40.424-08:00</updated><title type='text'>가사검색</title><content type='html'>void CSearchLyricDlg::OnBnClickedSearch(void)&lt;br /&gt;{&lt;br /&gt; //AfxMessageBox("??");&lt;br /&gt; UpdateData(TRUE);&lt;br /&gt; m_nMarkIdx = -1;&lt;br /&gt; &lt;br /&gt; CString strTmp;&lt;br /&gt; m_edSearchWord-&gt;GetWindowText(strTmp);&lt;br /&gt;&lt;br /&gt; if(strTmp == "")&lt;br /&gt; {&lt;br /&gt;  /*CString strMsg;&lt;br /&gt;  strMsg.LoadString(IDS_MSG_10);&lt;br /&gt;  AfxMessageBox(strMsg);*/&lt;br /&gt;  AfxMessageBox(_T("请输入搜索的歌名和歌手名"));//IDS_MSG_10&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; strTmp = ParseSearchWord(strTmp);&lt;br /&gt;&lt;br /&gt; GenericHTTPClient    httpRequest;&lt;br /&gt; LPCTSTR szHTML;&lt;br /&gt; CString strURL;&lt;br /&gt; _UTF8 utf8;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; strURL.Format(_T("%s/findlyrics/syncsong_searchlist_n.asp?strCode=%s&amp;strSearchWord=%s"), SYNC_SERVER, m_strNCode, utf8.UTF8Encoding(strTmp));&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt; //AfxMessageBox(strURL);&lt;br /&gt;&lt;br /&gt; if(httpRequest.Request((LPCTSTR)strURL))&lt;br /&gt; {&lt;br /&gt;  szHTML = httpRequest.QueryHTTPResponse();&lt;br /&gt;&lt;br /&gt;  /*CString str11;&lt;br /&gt;  str11.Format(("%s"),szHTML);&lt;br /&gt;&lt;br /&gt;  AfxMessageBox(str11);*/&lt;br /&gt;&lt;br /&gt;  strTmp.Format(_T("%s"), szHTML);&lt;br /&gt;  if(strTmp.Find(_T("&lt;*||*&gt;")) &lt; 0)&lt;br /&gt;  {&lt;br /&gt;   AfxMessageBox("找不到歌词");//IDS_MSG_11&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  LPVOID     lpMsgBuffer;&lt;br /&gt;  DWORD dwRet=FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | &lt;br /&gt;     FORMAT_MESSAGE_FROM_SYSTEM,&lt;br /&gt;     NULL,&lt;br /&gt;     httpRequest.GetLastError(),&lt;br /&gt;     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),&lt;br /&gt;     reinterpret_cast&lt;LPTSTR&gt;(&amp;lpMsgBuffer),&lt;br /&gt;     0,&lt;br /&gt;     NULL);                         &lt;br /&gt;&lt;br /&gt;  MessageBox( reinterpret_cast&lt;LPTSTR&gt;(lpMsgBuffer), _T("ERROR"), MB_OK);&lt;br /&gt;  LocalFree(lpMsgBuffer);&lt;br /&gt; } &lt;br /&gt; httpRequest.Close();&lt;br /&gt;&lt;br /&gt; CString str;&lt;br /&gt; str = utf8.UTF2CHAR(szHTML);&lt;br /&gt;&lt;br /&gt; if(str.Find(_T("&lt;*||*&gt;&lt;ex&gt;Lyric is not exist")) &gt; -1)&lt;br /&gt; {&lt;br /&gt;  CString strMsg;&lt;br /&gt;  strMsg.LoadString(IDS_MSG_11);&lt;br /&gt;  AfxMessageBox(strMsg);&lt;br /&gt;  //AfxMessageBox(_T("??? ??? ????."));//IDS_MSG_11&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; //m_pMSSearchList-&gt;DeleteAllItems();&lt;br /&gt; m_pMSSearchList-&gt;ClearList();&lt;br /&gt;&lt;br /&gt; int nLoop = 0;&lt;br /&gt; strTmp = "";&lt;br /&gt;&lt;br /&gt; CString strTitle;&lt;br /&gt; CString strArtist;&lt;br /&gt; CString strPlayTime;&lt;br /&gt; CString strWmiURL;&lt;br /&gt; CString strLyric;&lt;br /&gt; CString strSeq;&lt;br /&gt;&lt;br /&gt; for(int j=0; str.Find(_T("&lt;br&gt;")) &gt; 0; )&lt;br /&gt; {&lt;br /&gt;  j = str.Find(_T("&lt;br&gt;"));&lt;br /&gt;&lt;br /&gt;  if(j &lt; 0)&lt;br /&gt;   break;&lt;br /&gt;&lt;br /&gt;  int i=str.Find(_T("&lt;*||*&gt;"));&lt;br /&gt;  if(i&lt;0)return;&lt;br /&gt;  strTitle = str.Mid(0,i);&lt;br /&gt;  str=str.Right(str.GetLength()-i-6);&lt;br /&gt;&lt;br /&gt;  i=str.Find(_T("&lt;*||*&gt;"));&lt;br /&gt;  if(i&lt;0)return;&lt;br /&gt;  strArtist = str.Mid(0,i);&lt;br /&gt;  str=str.Right(str.GetLength()-i-6);&lt;br /&gt;  &lt;br /&gt;  i=str.Find(_T("&lt;*||*&gt;"));&lt;br /&gt;  if(i&lt;0)return;&lt;br /&gt;  strPlayTime = str.Mid(0,i);&lt;br /&gt;  str=str.Right(str.GetLength()-i-6);&lt;br /&gt;&lt;br /&gt;  i=str.Find(_T("&lt;*||*&gt;"));&lt;br /&gt;  if(i&lt;0)return;&lt;br /&gt;  strWmiURL = str.Mid(0,i);&lt;br /&gt;  str=str.Right(str.GetLength()-i-6);&lt;br /&gt;  &lt;br /&gt;  i=str.Find(_T("&lt;*||*&gt;&lt;br&gt;"));&lt;br /&gt;  if(i&lt;0)return;&lt;br /&gt;  strSeq = str.Mid(0,i);&lt;br /&gt;  str=str.Right(str.GetLength()-i-10);&lt;br /&gt;&lt;br /&gt;  strTmp.Format(_T("%d"), nLoop);&lt;br /&gt;&lt;br /&gt;  m_pMSSearchList-&gt;AddSearchList(strTmp, strTitle, strArtist, strPlayTime, strWmiURL, m_strFileName, strSeq);&lt;br /&gt;&lt;br /&gt;  nLoop++;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; UpdateData(FALSE);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-7206368363325324385?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/7206368363325324385/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=7206368363325324385' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7206368363325324385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7206368363325324385'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/11/blog-post_04.html' title='가사검색'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3987106133145842127</id><published>2007-11-04T21:16:00.001-08:00</published><updated>2007-11-04T21:16:49.909-08:00</updated><title type='text'>파일 검색</title><content type='html'>void CPlayListDlg::OnPlayListSubMenuSearchLyrics()&lt;br /&gt;{&lt;br /&gt; CSearchLyricDlg dlg;&lt;br /&gt; if(this-&gt;m_pMSPlayList-&gt;GetSelectedCount() &gt; 0)&lt;br /&gt; {&lt;br /&gt;  POSITION pos = this-&gt;m_pMSPlayList-&gt;GetFirstSelectedItemPosition();&lt;br /&gt;&lt;br /&gt;  CString strPath = _T("");&lt;br /&gt;  CString strTime = _T("");&lt;br /&gt;  CString strSearchWord = _T("");&lt;br /&gt;&lt;br /&gt;  int nItem;&lt;br /&gt;  if(pos)&lt;br /&gt;  {&lt;br /&gt;   nItem = this-&gt;m_pMSPlayList-&gt;GetNextSelectedItem(pos);&lt;br /&gt;   PLAYLIST_DATA* pPLAYLIST_DATA;&lt;br /&gt;   pPLAYLIST_DATA = (PLAYLIST_DATA*)this-&gt;m_pMSPlayList-&gt;GetItemData(nItem);&lt;br /&gt;&lt;br /&gt;   strPath = pPLAYLIST_DATA-&gt;FullPath;&lt;br /&gt;   //int pos = strPath.ReverseFind('\\');&lt;br /&gt;   //strPath = strPath.Mid(pos+1, strPath.GetLength() - pos);&lt;br /&gt;&lt;br /&gt;   CString strExt = strPath.Right(4);&lt;br /&gt;   strExt.MakeLower();&lt;br /&gt;&lt;br /&gt;   if( !(strExt == _T(".mp3") || strExt == _T(".ogg") || strExt == _T(".wma")) )&lt;br /&gt;    return;&lt;br /&gt;&lt;br /&gt;   //if(pPLAYLIST_DATA-&gt;bPlay)&lt;br /&gt;   //{&lt;br /&gt;   // CSyncSongDlg* pDlg = (CSyncSongDlg*)AfxGetMainWnd();&lt;br /&gt;   // pDlg-&gt;OnBnClickedStop();&lt;br /&gt;   //}&lt;br /&gt;&lt;br /&gt;   strTime = pPLAYLIST_DATA-&gt;PlayTime;&lt;br /&gt;   &lt;br /&gt;   //2006.08.11 edit by sun ????? ?? ?? ???? ???? ??&lt;br /&gt;   CString strTitle = pPLAYLIST_DATA-&gt;Title;&lt;br /&gt;   CString strArtist = pPLAYLIST_DATA-&gt;Artist;&lt;br /&gt;   strTitle.TrimLeft();&lt;br /&gt;   strTitle.TrimRight();&lt;br /&gt;   strArtist.TrimLeft();&lt;br /&gt;   strArtist.TrimRight();&lt;br /&gt;&lt;br /&gt;   if( strTitle == "" &amp;&amp; strArtist == "")&lt;br /&gt;   {&lt;br /&gt;    CString strTmp = GetFileNameFromPath(strPath);&lt;br /&gt;    int epos = strTmp.ReverseFind('.');&lt;br /&gt;    strSearchWord = strTmp.Mid(0, epos);&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;    strSearchWord = pPLAYLIST_DATA-&gt;Title + _T(" ") + pPLAYLIST_DATA-&gt;Artist;&lt;br /&gt;   }&lt;br /&gt;   //end of edit&lt;br /&gt;&lt;br /&gt;   dlg.m_strFileName = strPath;&lt;br /&gt;   dlg.m_strPlayTime = strTime;&lt;br /&gt;   dlg.m_strSearchWord = strSearchWord;&lt;br /&gt;&lt;br /&gt;   CSyncSongDlg* pDlg = (CSyncSongDlg*)AfxGetMainWnd();&lt;br /&gt;&lt;br /&gt;   //::SendMessage(pDlg-&gt;m_hWnd, WM_DISABLEDIAGLOG, (WPARAM)m_hWnd, 0);&lt;br /&gt;   if(IDOK == dlg.DoModal())&lt;br /&gt;   {&lt;br /&gt;    pPLAYLIST_DATA-&gt;URL = dlg.m_strWMIFile;&lt;br /&gt;    m_pMSPlayList-&gt;ListRefresh(nItem);&lt;br /&gt;   }&lt;br /&gt;   //::SendMessage(pDlg-&gt;m_hWnd, WM_ENABLEDIAGLOG, (WPARAM)m_hWnd, 0);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3987106133145842127?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3987106133145842127/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3987106133145842127' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3987106133145842127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3987106133145842127'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/11/blog-post.html' title='파일 검색'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-4386921752641722569</id><published>2007-11-04T21:11:00.000-08:00</published><updated>2007-11-04T21:12:15.271-08:00</updated><title type='text'>SPL저장</title><content type='html'>BOOL CMSCSTDList::SaveLibFile(CString strLibFile)&lt;br /&gt;{&lt;br /&gt; CStdioFile file;&lt;br /&gt;&lt;br /&gt; UINT oFlags = CFile::modeCreate | CFile::modeWrite;&lt;br /&gt;&lt;br /&gt; if(!file.Open(strLibFile, oFlags))&lt;br /&gt; {&lt;br /&gt;  CString strMsg;&lt;br /&gt;  strMsg.LoadString(IDS_MSG_07);&lt;br /&gt;  AfxMessageBox(strMsg);&lt;br /&gt;  //AfxMessageBox(_T("???? ??- ???????"));//IDS_MSG_07&lt;br /&gt;  return FALSE;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; CString strLine, strData;&lt;br /&gt;&lt;br /&gt; for(int i=0; i &lt; GetItemCount(); i++)&lt;br /&gt; {&lt;br /&gt;  PLAYLIST_DATA* pPLAYLIST_DATA;&lt;br /&gt;  pPLAYLIST_DATA = (PLAYLIST_DATA*)GetItemData(i);&lt;br /&gt;&lt;br /&gt;  strLine = pPLAYLIST_DATA-&gt;FullPath;&lt;br /&gt;  strLine += "\n";&lt;br /&gt;&lt;br /&gt;  strData += strLine;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; file.Write(strData, strData.GetLength());&lt;br /&gt;&lt;br /&gt; file.Close();&lt;br /&gt;&lt;br /&gt; return TRUE;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-4386921752641722569?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/4386921752641722569/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=4386921752641722569' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/4386921752641722569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/4386921752641722569'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/11/spl.html' title='SPL저장'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3321651912609169253</id><published>2007-10-31T00:33:00.001-07:00</published><updated>2007-10-31T00:33:29.178-07:00</updated><title type='text'>用VC设计托盘图标程序</title><content type='html'>　在Windows操作系统中，任务栏的右边(托盘)会常驻几个图标，如输入法切换图标、音量控制图标等，此外我们还经常遇到具有托盘图标的软件，如金山词霸、实时监测功能的杀毒软件等。这些软件在后台运行，通常不占用太多的屏幕资源，只在通知栏上放一个小小的标志，必要时我们可以通过用鼠标点击图标对其进行选单操作或激活其主窗口。有时我们自己编写的程序也希望有类似的效果，本文将详细地介绍用VC设计托盘图标程序的方法。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　一、 NOTIFYICONDATA结构&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　NOTIFYICONDATA结构包含了系统用来处理托盘图标的信息，它包括选择的图标、回调消息、提示消息和图标对应的窗口等内容。其定义为：&lt;br /&gt;&lt;br /&gt;　　typedef struct—NOTIFYICONDATA {&lt;br /&gt;&lt;br /&gt;　　DWORD cbSize;&lt;br /&gt;&lt;br /&gt;　　//以字节为单位的这个结构的大小&lt;br /&gt;&lt;br /&gt;　　HWND hWnd;&lt;br /&gt;&lt;br /&gt;　　//接收托盘图标通知消息的窗口句柄&lt;br /&gt;&lt;br /&gt;　　UINT uID;&lt;br /&gt;&lt;br /&gt;　　//应用程序定义的该图标的ID号&lt;br /&gt;&lt;br /&gt;　　UINT uFlags;&lt;br /&gt;&lt;br /&gt;　　//设置该图标的属性&lt;br /&gt;&lt;br /&gt;　　UINT uCallbackMessage;&lt;br /&gt;&lt;br /&gt;　　//应用程序定义的消息ID号，此消息传递给hWnd&lt;br /&gt;&lt;br /&gt;　　HICON hIcon; //图标的句柄&lt;br /&gt;&lt;br /&gt;　　char szTip[64]; //鼠标停留在图标上显示的提示信息&lt;br /&gt;&lt;br /&gt;　　} NOTIFYICONDATA, PNOTIFYICONDATA;&lt;br /&gt;&lt;br /&gt;　　该结构中，成员uFlags可以是下列的组合或其中之一：&lt;br /&gt;&lt;br /&gt;　　NIF_ICON：设置成员hIcon有效&lt;br /&gt;&lt;br /&gt;　　NIF_MESSAGE：设置成员uCallbackMessage有效&lt;br /&gt;&lt;br /&gt;　　NIF_TIP：设置成员szTip有效&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　二、 Shell_NotifyIcon函数&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　全局函数Shell_NotifyIcon()用于在托盘上增加、删除或修改图标。其原型为：&lt;br /&gt;&lt;br /&gt;　　WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA pnid);&lt;br /&gt;&lt;br /&gt;　　Pnid是上面的NOTIFYICONDATA结构的指针。&lt;br /&gt;&lt;br /&gt;　　dwMessage是被传递的消息，可以是以下消息之一：&lt;br /&gt;&lt;br /&gt;　　NIM_ADD：增加图标&lt;br /&gt;&lt;br /&gt;　　NIM_DELETE：删除图标&lt;br /&gt;&lt;br /&gt;　　NIM_MODIFY：修改图标&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　三、 托盘图标程序设计示例&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　首先我们用AppWizard创建一个不基于文档和视图结构的应用程序Tray。我们并不想在应用程序启动时显示主窗口，所以需要删除应用程序类CTrayApp中成员函数InitInstance()的以下两句代码：&lt;br /&gt;&lt;br /&gt;　　pFrame-〉ActivateFrame();&lt;br /&gt;&lt;br /&gt;　　pFrame-〉ShowWindow(SW_SHOW);&lt;br /&gt;&lt;br /&gt;　　在CMainFrame类中加入NOTIFYICONDATA结构的保护成员变量m_tnid，并在其OnCreate函数中return语句前加入生成托盘图标的代码：&lt;br /&gt;&lt;br /&gt;　　m_tnid.cbSize=sizeof(NOTIFYICONDATA);&lt;br /&gt;&lt;br /&gt;　　m_tnid.hWnd=this-〉m_hWnd;&lt;br /&gt;&lt;br /&gt;　　m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;&lt;br /&gt;&lt;br /&gt;　　m_tnid.uCallbackMessage=MYWM_NOTIFYICON;&lt;br /&gt;&lt;br /&gt;　　//用户定义的回调消息&lt;br /&gt;&lt;br /&gt;　　CString szToolTip;&lt;br /&gt;&lt;br /&gt;　　szToolTip=_T("托盘图标实例");&lt;br /&gt;&lt;br /&gt;　　_tcscpy(m_tnid.szTip, szToolTip);&lt;br /&gt;&lt;br /&gt;　　m_tnid.uID=IDR_MAINFRAME;&lt;br /&gt;&lt;br /&gt;　　HICON hIcon;&lt;br /&gt;&lt;br /&gt;　　hIcon=AfxGetApp()-〉LoadIcon(IDR_MAINFRAME);&lt;br /&gt;&lt;br /&gt;　　m_tnid.hIcon=hIcon;&lt;br /&gt;&lt;br /&gt;　　::Shell_NotifyIcon(NIM_ADD,&amp;&amp;m_tnid);&lt;br /&gt;&lt;br /&gt;　　if(hIcon)::DestroyIcon(hIcon);&lt;br /&gt;&lt;br /&gt;　　返回消息的ID应在主框架类的头函数中定义：&lt;br /&gt;&lt;br /&gt;　　#define MYWM_NOTIFYICON WM_USER+1&lt;br /&gt;&lt;br /&gt;　　为了处理图标返回消息，如鼠标左键双击、鼠标右键单击消息，我们重载WindowProc()函数。此外，我们还希望在主框架窗口最小化时图标不在任务栏的空白区出现，在此函数中同时作相应处理。&lt;br /&gt;&lt;br /&gt;　　LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)&lt;br /&gt;&lt;br /&gt;　　{&lt;br /&gt;&lt;br /&gt;　　switch(message){&lt;br /&gt;&lt;br /&gt;　　case MYWM_NOTIFYICON:&lt;br /&gt;&lt;br /&gt;　　//如果是用户定义的消息&lt;br /&gt;&lt;br /&gt;　　if(lParam==WM_LBUTTONDBLCLK){&lt;br /&gt;&lt;br /&gt;　　//鼠标双击时主窗口出现&lt;br /&gt;&lt;br /&gt;　　AfxGetApp()-〉m_pMainWnd-〉ShowWindow(SW_SHOW);&lt;br /&gt;&lt;br /&gt;　　}&lt;br /&gt;&lt;br /&gt;　　else if(lParam==WM_RBUTTONDOWN){ //鼠标右键单击弹出选单&lt;br /&gt;&lt;br /&gt;　　CMenu menu;&lt;br /&gt;&lt;br /&gt;　　menu.LoadMenu(IDR_RIGHT_MENU); //载入事先定义的选单&lt;br /&gt;&lt;br /&gt;　　CMenupMenu=menu.GetSubMenu(0);&lt;br /&gt;&lt;br /&gt;　　CPoint pos;&lt;br /&gt;&lt;br /&gt;　　GetCursorPos(&amp;&amp;pos);&lt;br /&gt;&lt;br /&gt;　　pMenu-〉TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());&lt;br /&gt;&lt;br /&gt;　　}&lt;br /&gt;&lt;br /&gt;　　break;&lt;br /&gt;&lt;br /&gt;　　case WM_SYSCOMMAND:&lt;br /&gt;&lt;br /&gt;　　//如果是系统消息&lt;br /&gt;&lt;br /&gt;　　if(wParam= =SC_MINIMIZE){&lt;br /&gt;&lt;br /&gt;　　//接收到最小化消息时主窗口隐藏&lt;br /&gt;&lt;br /&gt;　　AfxGetApp()-〉m_pMainWnd-〉ShowWindow(SW_HIDE);&lt;br /&gt;&lt;br /&gt;　　return 0;&lt;br /&gt;&lt;br /&gt;　　}&lt;br /&gt;&lt;br /&gt;　　break;&lt;br /&gt;&lt;br /&gt;　　}&lt;br /&gt;&lt;br /&gt;　　return CFrameWnd::WindowProc(message, wParam, lParam);&lt;br /&gt;&lt;br /&gt;　　}&lt;br /&gt;&lt;br /&gt;　　为使应用程序退出时图标消失，映射WM_DESTROY消息，在OnDestroy()函数中加入：&lt;br /&gt;&lt;br /&gt;　　::Shell_NotifyIcon(NIM_DELETE,&amp;&amp;m_tnid);&lt;br /&gt;&lt;br /&gt;　　至此，托盘图标程序的常规功能我们均已实现。我们还可以通过Shell_NotifyIcon()函数的调用实现不同状态下图标的改变。&lt;br /&gt;&lt;br /&gt;　　本程序在VC++ 6.0、Windows 98/2000 Professional下调试通过。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3321651912609169253?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3321651912609169253/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3321651912609169253' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3321651912609169253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3321651912609169253'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/vc_31.html' title='用VC设计托盘图标程序'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-8159027359797960563</id><published>2007-10-30T02:03:00.000-07:00</published><updated>2007-10-30T02:08:25.498-07:00</updated><title type='text'>노니터 중심위치를 찾음</title><content type='html'>CPoint pt;&lt;br /&gt;pt.x = GetSystemMetrics(SM_CXSCREEN)/2       // 모니터 폭의 1/2&lt;br /&gt;pt.y = GetSystemMetrics(SM_CYSCREEN)/2       // 모니터 높이의 1/2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-8159027359797960563?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/8159027359797960563/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=8159027359797960563' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/8159027359797960563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/8159027359797960563'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_30.html' title='노니터 중심위치를 찾음'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3103246073978084558</id><published>2007-10-29T23:25:00.000-07:00</published><updated>2007-10-29T23:26:56.483-07:00</updated><title type='text'>OnDrag사용하여 파일복사</title><content type='html'>BOOL CLeftview::OnDrop(COleDataBbject * pDataObject,DROPEFFECT dropEffect,CPoint point)&lt;br /&gt;{&lt;br /&gt; CString   StrFolderName;&lt;br /&gt; HTREEITEM  hTargetFolder;&lt;br /&gt; CTreeCtrl&amp;  treeCtrl = GetTreeCtrl();&lt;br /&gt; CExplorerTestDoc* pDoc = GetDocument();&lt;br /&gt; hTargetFolder = treeCtrl.GetDropHilightItem();&lt;br /&gt; StrFolderName = GetFullPathName(hTargetFolder);&lt;br /&gt; if(dropEffect == DROPEFFECT_COPY)&lt;br /&gt; {&lt;br /&gt;  HGLOBAL  globalMem;&lt;br /&gt;  CSharedFile sharedFile;&lt;br /&gt;  globalMem = Sethandle(globalMem,FALSE);&lt;br /&gt;  CArchive ar(&amp;sharedFile, CArchive::load);&lt;br /&gt;  GetDocument()-&gt;SerializeCopyFiles(ar);&lt;br /&gt;  ar.Close();&lt;br /&gt;  CopyFilesToFolder(strFolderName);&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; treeCtrl.SelectDropTarget(0);&lt;br /&gt; treeCtrl.SelectItem(treeCtrl.GetSelectedItem())//포커스 환원&lt;br /&gt; return   TRUE;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//OnDrop()함수는 드래그&amp;드롭에 의해 실제 파일들을 복사해 주는 역할을 한다.따라서 처음 부분에는 현재 드롭된 아이템의 경로&lt;br /&gt;//이름을 알아낸 다음 onDragOver()에서 리턴한 값이 DROPEFFECT_COPY일 때만 선택된 파일들을 해당 아이템에 복사하게 된다.&lt;br /&gt;&lt;br /&gt;void  CLeftView::CopyFilesToFolder(CString strFolderName)&lt;br /&gt;{&lt;br /&gt; CObList *  pFileList;&lt;br /&gt; LIST_VIEW *  pListView;&lt;br /&gt; CString strMessage strmessage,strTargetFile,strFileName;&lt;br /&gt; CWaitCursor  waitCursor;//파일 복사중에 모래시계 커서로 바꾼다.&lt;br /&gt; pFileList = GetDocument()-&gt;GetCopyFileList();&lt;br /&gt; for(POSITION pos = pFileList-&gt;GetHeadPosition();pos!=NULL)&lt;br /&gt; {&lt;br /&gt;  pListView =(LIST_VIEW*)pFileList-&gt;GetNext(pos);&lt;br /&gt;  strFileName = pListView-&gt;strName;&lt;br /&gt;  strTargetFile = strFolderName + strFileName;&lt;br /&gt;  if(::CopyFile(pListView-&gt;strPath,strTargetFile,TRUE)==FALSE)&lt;br /&gt;  {&lt;br /&gt;   DWORD      dwError =::GetLastError();&lt;br /&gt;   strmessage.Format("이 볼더에 이미 %s 파일이 잇습니다.\n파일을 바꾸시겠습니까?",strFileName);&lt;br /&gt;   if(MessageBox(strmessage,"파일 바꾸기 확인"),MB_ICONQUESTION|MB_YESNO)==IDYES)&lt;br /&gt;   {&lt;br /&gt;    dwError = ::GetLastError();&lt;br /&gt;    strMessage.Format("'%s'파일 복사 실패",strFileName);&lt;br /&gt;    MessageBox(strmessage,"파일 복사",MB_ICONSTOP);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//이 함수는 지렬화를 통해 알아낸 파일 리스트를 이용하여 Win32 API인 ::CopyFile()를 호출해서 파일들을 실제로 복사하는 역할을 수행한다,다음은 좌측의 리스트 뷰에서 두 개의 파일을 선택하여 트리 뷰로 드래그&amp;드롭을 하는 모습이다,만약 동일한 파일이 있는 경우 기존 파일의 변경 여부를 묻는 다이얼 로그가 출격된다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3103246073978084558?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3103246073978084558/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3103246073978084558' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3103246073978084558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3103246073978084558'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/ondrag.html' title='OnDrag사용하여 파일복사'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-6799612156201701523</id><published>2007-10-29T21:49:00.000-07:00</published><updated>2007-10-29T21:54:16.596-07:00</updated><title type='text'>주의 점</title><content type='html'>*pListView = *(LIST_VIEW*)listCtrl.GetItemData(nItem)&lt;br /&gt;&lt;br /&gt;pListView = (LIST_VIEW*)listCtrl.GetItemData(nItem);&lt;br /&gt;&lt;br /&gt;새로운 파일 리스트를 나중에서 삭제할 때:&lt;br /&gt;2의 경우 원래 가지고 있었던 파일 리스트의 메모리 포인터를 사용하는것이므로 원래의 파일 리스트도 메모리에서 삭제 된다.&lt;br /&gt;&lt;br /&gt;원래의 파일 리스트는 항상 메모리에 있어야 함으로 1번과 같이 메모리 포인터가 아닌 메모리에 저장되어 있는 파일의 정보를 새로 복사하여ㅕ 나중에 이 리스트를 삭제하더라도 원래의 리스트는 손상되지 않는다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-6799612156201701523?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/6799612156201701523/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=6799612156201701523' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6799612156201701523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6799612156201701523'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_6220.html' title='주의 점'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3258225353423864018</id><published>2007-10-29T18:05:00.000-07:00</published><updated>2007-10-29T18:06:46.829-07:00</updated><title type='text'>ConvertWCtoMB</title><content type='html'>HRESULT CSyncSongDlg::ConvertWCtoMB(LPWSTR *ppwszInString, LPSTR *ptszOutString)&lt;br /&gt;{&lt;br /&gt; if( ppwszInString == NULL || ptszOutString == NULL )&lt;br /&gt; {&lt;br /&gt;  return E_INVALIDARG;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; HRESULT hr   = S_OK;&lt;br /&gt; int  nSizeCount = 0;&lt;br /&gt;&lt;br /&gt; *ptszOutString = NULL;&lt;br /&gt;&lt;br /&gt; do&lt;br /&gt; {&lt;br /&gt;  nSizeCount = WideCharToMultiByte(CP_ACP, 0, *ppwszInString, -1, NULL, 0, NULL, NULL);&lt;br /&gt;  if( 0 == nSizeCount )&lt;br /&gt;  {&lt;br /&gt;   hr = HRESULT_FROM_WIN32( GetLastError() );&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  *ptszOutString = new char[nSizeCount]; //memory leak...how??&lt;br /&gt;  if( NULL == ptszOutString)&lt;br /&gt;  {&lt;br /&gt;   hr = HRESULT_FROM_WIN32( GetLastError() );&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if( 0 == WideCharToMultiByte(CP_ACP, 0, *ppwszInString, -1, *ptszOutString, nSizeCount, NULL, NULL) )&lt;br /&gt;  {&lt;br /&gt;   hr = HRESULT_FROM_WIN32( GetLastError() );&lt;br /&gt;   break;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; while(FALSE);&lt;br /&gt;&lt;br /&gt; if( FAILED( hr ) )&lt;br /&gt; {&lt;br /&gt;  SAFE_ARRAYDELETE( ptszOutString );&lt;br /&gt;  return hr;&lt;br /&gt; } &lt;br /&gt;&lt;br /&gt; return hr;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3258225353423864018?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3258225353423864018/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3258225353423864018' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3258225353423864018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3258225353423864018'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/convertwctomb.html' title='ConvertWCtoMB'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-710673064804116115</id><published>2007-10-29T01:26:00.000-07:00</published><updated>2007-10-29T01:32:56.708-07:00</updated><title type='text'>리스트 컨트롤의 레포트 형식에서 사용하는 헤더 컨트롤의 컬럼을 추가</title><content type='html'>BOOL CMyListCtrl::ADDColumn(int nItem,LPCSTR strItem,int nSubItem,int nMask,int nFmt)&lt;br /&gt;{&lt;br /&gt; LV_COLUMN lvc;&lt;br /&gt; lvc.mask =nMask;&lt;br /&gt; lvc.fmt=nFmt;//헤더 컨트롤에 출력될 문자열 포맷 설정&lt;br /&gt; lvc.pszText=(LPSTR)strItem;//출력될 문자열]&lt;br /&gt; lvc.cx=GetStringWidth(lvc.pszText)+15;//컬럴 폭 설정&lt;br /&gt; if(nMask &amp; LVCF_SUBITEM)&lt;br /&gt; {&lt;br /&gt;  if(nSubItem!=-1)&lt;br /&gt;   lvc.iSubItem = nSubItem;//서브 아이템 설정&lt;br /&gt;  else&lt;br /&gt;   lvc.iSubItem = nItem;//아이템 설정&lt;br /&gt; }&lt;br /&gt; return insertColumn(nItem,&amp;lvc);//컬럼 추가&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-710673064804116115?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/710673064804116115/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=710673064804116115' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/710673064804116115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/710673064804116115'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_3249.html' title='리스트 컨트롤의 레포트 형식에서 사용하는 헤더 컨트롤의 컬럼을 추가'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-1982323911286408262</id><published>2007-10-29T01:21:00.000-07:00</published><updated>2007-10-29T01:26:01.664-07:00</updated><title type='text'>아이템 크기에 맞게 헤더 컨트롤의 크기를 자동으로 조절</title><content type='html'>void CMyListCtrl::AutoSize()&lt;br /&gt;{&lt;br /&gt;   CHeaderCtrl *pHD=(CHeaderCtrl*)GetDlgItem(0);&lt;br /&gt;   pHD-&gt;ModifyStyle(0,HDS_HOTTRACK);//헤더 컨틀롤에 핫트래킹 설정&lt;br /&gt;  int nCount = pHD-&gt;GetItemCount();//컬럼 개수 얻음&lt;br /&gt;  for(int i = 0;i&lt;nCount; i++)&lt;br /&gt;  SetColumnWidth(i,LVSCW_AUTOSIZE);//컬럼의 폭 설정&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-1982323911286408262?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/1982323911286408262/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=1982323911286408262' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/1982323911286408262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/1982323911286408262'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_29.html' title='아이템 크기에 맞게 헤더 컨트롤의 크기를 자동으로 조절'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-7888968848400547191</id><published>2007-10-29T01:02:00.000-07:00</published><updated>2007-10-29T01:18:25.876-07:00</updated><title type='text'>자신이 직접만든 CMyListCtrl클래스</title><content type='html'>헤더 파잉레 멤버함수를 추가&lt;br /&gt;BOOL AddItem(int nItem,int nSunItem,LPCSTR strItem,int nImageIndex=-1)//리스트 컨트롤에 아이테 추가&lt;br /&gt;&lt;br /&gt;BOOL AddColumn(int nItem,LPCSTR strItem,int nSubItem=-1,int nMask = LVCF_TEXTLVCF_FMTLVCF_WIDTHLVCF_SUBITEM,int nfmt=LVCFMT_LEFT);헤더 컨트롤의 컬럼 설정&lt;br /&gt;&lt;br /&gt;BOOL CMyListCtrl::AddItem(int nItem,int nSubItem,LPCSTR strItem,int nImageIndex)&lt;br /&gt;{&lt;br /&gt;  LV_ITEM lvitlvit.mask =LVIF_TEXT//아이템에서 텍스트를 사용하기 위한 플래그&lt;br /&gt;  lvit.iItem =nItem//아이템의 인덱스lvit.iSubItem = nSubItem;//서브 아이템의 인덱스&lt;br /&gt;  lvit.pszText =(LPSTR)stritem;//아이템에 설정할 문자열&lt;br /&gt;if(nImageIndex!=-1)//이미지를 사용하는 경우&lt;br /&gt;{ lvit.mask=LVIF_IMAGE//이미지를 사용하기 위한 플래그 설정&lt;br /&gt; lvit.iImage=nImageIndex;//리스트 컨트롤에서 사용할 이미지 인덱스}&lt;br /&gt;if(nSbuItem==0)return InsertItem(&amp;amp;lvit);//아이템 삽입&lt;br /&gt;return SetItem(&amp;amp;lvit);//서브 아이템 설정}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-7888968848400547191?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/7888968848400547191/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=7888968848400547191' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7888968848400547191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7888968848400547191'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/cmylistctrl.html' title='자신이 직접만든 CMyListCtrl클래스'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-7517306066243709385</id><published>2007-10-26T00:54:00.000-07:00</published><updated>2007-10-26T00:55:45.230-07:00</updated><title type='text'>判断某个URL是否有效</title><content type='html'>&lt;p&gt;bool CUtil::IsReachableURL(CString sURL)&lt;br /&gt;{ CInternetSession Session;&lt;br /&gt;CHttpFile * pFile;&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt;      pFile = (CHttpFile *) Session.OpenURL(sURL);&lt;br /&gt;} &lt;/p&gt;&lt;p&gt;catch  (CException * e)&lt;/p&gt;&lt;p&gt; {  e-&gt;Delete();  pFile = NULL; } return (pFile != NULL);}&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-7517306066243709385?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/7517306066243709385/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=7517306066243709385' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7517306066243709385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7517306066243709385'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/url.html' title='判断某个URL是否有效'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-9213866939477288890</id><published>2007-10-26T00:52:00.000-07:00</published><updated>2007-10-26T00:53:02.441-07:00</updated><title type='text'>USB摄像头编程</title><content type='html'>注意包含头文件qedit.h，dshow.h&lt;br /&gt;几个函数如下，其中有一些全局变量，程序写的充忙，也就不整理了。参考了一些资料。&lt;br /&gt;BOOL initVideo(void)&lt;br /&gt;{&lt;br /&gt;AM_MEDIA_TYPE   amt;&lt;br /&gt;CoInitialize(NULL);                                     // COM的初期化&lt;br /&gt;        // ---- 输入计算的准备 ----&lt;br /&gt;        // 搜索输入装置&lt;br /&gt;        IBaseFilter  *pbf = NULL;&lt;br /&gt;        IMoniker * pMoniker = NULL;&lt;br /&gt;    ULONG cFetched;&lt;br /&gt;    // 制作装置的各个部分&lt;br /&gt;    CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,&lt;br /&gt;                                          IID_ICreateDevEnum, (void ** ) &amp;amp;pDevEnum);&lt;br /&gt;    // 制作视频输入装置的各个部分&lt;br /&gt;    IEnumMoniker * pClassEnum = NULL;&lt;br /&gt;    pDevEnum -&gt; CreateClassEnumerator(&lt;br /&gt;                                        CLSID_VideoInputDeviceCategory, &amp;amp;pClassEnum, 0);&lt;br /&gt;    if (pClassEnum == NULL){&lt;br /&gt;                AfxMessageBox("No video device, program exit!");&lt;br /&gt;                pDevEnum -&gt; Release();&lt;br /&gt;                CoUninitialize();&lt;br /&gt;                //OnOK();&lt;br /&gt;        return FALSE ;&lt;br /&gt;    }&lt;br /&gt;    // 取得最初发现的视频输入装置object的接口&lt;br /&gt;    pClassEnum -&gt; Next(1, &amp;amp;pMoniker, &amp;amp;cFetched);&lt;br /&gt;        pMoniker-&gt;BindToObject( 0, 0, IID_IBaseFilter, (void**)&amp;amp;pbf );&lt;br /&gt;       &lt;br /&gt;        // ---- 过虑图像的准备 ----&lt;br /&gt;    // 制作过虑图像,取得接口&lt;br /&gt;    CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC,&lt;br /&gt;                                          IID_IGraphBuilder, (void **) &amp;amp;pGraph);&lt;br /&gt;    pGraph -&gt; QueryInterface( IID_IMediaControl, (LPVOID *) &amp;amp;pMC );&lt;br /&gt;        // 把输入图像追加到过虑图像&lt;br /&gt;    pGraph -&gt; AddFilter( pbf, L"Video Capture");&lt;br /&gt;        // 因为进行了追加所以解除参照的输入图像&lt;br /&gt;    pbf -&gt; Release();&lt;br /&gt;        // ---- 过虑图像的准备 ----&lt;br /&gt;    // 制作过虑图像,取得接口&lt;br /&gt;        CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,&lt;br /&gt;                      IID_IBaseFilter, (LPVOID *)&amp;amp;pF);&lt;br /&gt;        pF -&gt; QueryInterface( IID_ISampleGrabber, (void **)&amp;amp;pGrab );&lt;br /&gt;        // 把输入图像追加到过虑图像&lt;br /&gt;        ZeroMemory(&amp;amp;amt, sizeof(AM_MEDIA_TYPE));&lt;br /&gt;        amt.majortype  = MEDIATYPE_Video;&lt;br /&gt;        amt.subtype    = MEDIASUBTYPE_RGB24;&lt;br /&gt;        amt.formattype = FORMAT_VideoInfo;&lt;br /&gt;        pGrab -&gt; SetMediaType( &amp;amp;amt );&lt;br /&gt;        // 把grubber过虑追加到过虑图像&lt;br /&gt;        pGraph -&gt; AddFilter(pF, L"SamGra");&lt;br /&gt;        // ---- 输入图像的准备 ----&lt;br /&gt;        // 制作输入图像  &lt;br /&gt;        CoCreateInstance( CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,&lt;br /&gt;                                      IID_ICaptureGraphBuilder2, (void **) &amp;amp;pCapture );&lt;br /&gt;    // 把过虑图像编入到输入图像&lt;br /&gt;    pCapture -&gt; SetFiltergraph( pGraph );&lt;br /&gt;    // 输入图像的设定,设定grubber为rendering输出&lt;br /&gt;    pCapture -&gt; RenderStream (&amp;amp;PIN_CATEGORY_PREVIEW, &amp;amp;MEDIATYPE_Video,&lt;br /&gt;                                pbf, NULL, pF);&lt;br /&gt; &lt;br /&gt;        // ---- 表示窗口的准备 ----&lt;br /&gt;        // 位图信息的取得      &lt;br /&gt;        pGrab -&gt; GetConnectedMediaType( &amp;amp;amt );&lt;br /&gt;        // 获得视频头部的信息&lt;br /&gt;        VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)amt.pbFormat;&lt;br /&gt;        // 在视频的头部包含位图的信息&lt;br /&gt;        // 把位图的信息复制到BITMAPINFO的结构体中&lt;br /&gt;        BITMAPINFO BitmapInfo;&lt;br /&gt;        ZeroMemory( &amp;amp;BitmapInfo, sizeof(BitmapInfo) );&lt;br /&gt;        CopyMemory( &amp;amp;BitmapInfo.bmiHeader, &amp;amp;(pVideoHeader-&gt;bmiHeader),&lt;br /&gt;                                sizeof(BITMAPINFOHEADER));&lt;br /&gt;        img00.bih = BitmapInfo.bmiHeader;&lt;br /&gt;        long n = img00.bih.biSizeImage;&lt;br /&gt;       &lt;br /&gt;        char s[100];&lt;br /&gt;        sprintf(s, "Video Width: %ld  Video Height: %ld", img00.bih.biWidth, img00.bih.biHeight);&lt;br /&gt;        AfxMessageBox(s);&lt;br /&gt;       &lt;br /&gt;        img00.lpBmpData = (BYTE *)malloc( n );&lt;br /&gt;       &lt;br /&gt;        // ************* 追加 *****************&lt;br /&gt;        if (img00.lpBmpData == NULL) {&lt;br /&gt;                AfxMessageBox("Insufficient Memory!");&lt;br /&gt;        }&lt;br /&gt;       &lt;br /&gt;        img00.hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );&lt;br /&gt;        return true;&lt;br /&gt;}&lt;br /&gt;void initGraphic(void)&lt;br /&gt;{&lt;br /&gt;        // 把位图的信息复制到BITMAPINFO的结构体中&lt;br /&gt;        BITMAPINFO BitmapInfo;&lt;br /&gt;        ZeroMemory( &amp;amp;BitmapInfo, sizeof(BitmapInfo) );&lt;br /&gt;        CopyMemory( &amp;amp;BitmapInfo.bmiHeader, &amp;amp;img00.bih,&lt;br /&gt;                                sizeof(BITMAPINFOHEADER));&lt;br /&gt;        img01.bih = BitmapInfo.bmiHeader;&lt;br /&gt;        long n = img01.bih.biSizeImage;&lt;br /&gt;        img01.lpBmpData = (BYTE *)malloc( n );&lt;br /&gt;       &lt;br /&gt;        // **************** 追加 ******************&lt;br /&gt;        if (img01.lpBmpData == NULL) {&lt;br /&gt;                printf("Insufficient memory available (img01.lpBmpData)\n");&lt;br /&gt;        }&lt;br /&gt;        img01.hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );&lt;br /&gt;}&lt;br /&gt;void closeVideo(void)&lt;br /&gt;{&lt;br /&gt;    // 接口的解除&lt;br /&gt;    pMC -&gt; Release();          &lt;br /&gt;        pDevEnum -&gt; Release();&lt;br /&gt;    pGraph -&gt; Release();&lt;br /&gt;    pCapture -&gt; Release();&lt;br /&gt;       &lt;br /&gt;        CoUninitialize();&lt;br /&gt;        free( img00.lpBmpData );&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-9213866939477288890?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/9213866939477288890/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=9213866939477288890' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/9213866939477288890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/9213866939477288890'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/usb_26.html' title='USB摄像头编程'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-5896796864498184981</id><published>2007-10-26T00:34:00.003-07:00</published><updated>2007-10-26T00:34:57.784-07:00</updated><title type='text'>输入Gb字符，返回Big5字符</title><content type='html'>//---------------------------------------------------------------------------   &lt;br /&gt;    //函数输入Gb字符，返回Big5字符   &lt;br /&gt;    //---------------------------------------------------------------------------   &lt;br /&gt;    AnsiString __fastcall Gb2Big(AnsiString sGb)   &lt;br /&gt;    {   &lt;br /&gt;    char* pszGbt=NULL; //Gb编码的繁体字符   &lt;br /&gt;char* pszGbs=NULL; //Gb编码的简体字符   &lt;br /&gt;    wchar_t* wszUnicode=NULL; //Unicode编码的字符   &lt;br /&gt;    char* pszBig5=NULL; //Big5编码的字符   &lt;br /&gt;    AnsiString sBig5; //返回的字符串   &lt;br /&gt;    int iLen=0; //需要转换的字符数   &lt;br /&gt;      &lt;br /&gt;    pszGbs=sGb.c_str(); //读入需要转换的字符参数   &lt;br /&gt;      &lt;br /&gt;    //计算转换的字符数   &lt;br /&gt;    iLen=MultiByteToWideChar (936, 0, pszGbs, -1, NULL,0) ;   &lt;br /&gt;      &lt;br /&gt;    //给pszGbt分配内存   &lt;br /&gt;    pszGbt=new char[iLen*2+1];   &lt;br /&gt;    //转换Gb码简体到Gb码繁体，使用API函数LCMapString   &lt;br /&gt;    LCMapString(0x0804,LCMAP_TRADITIONAL_CHINESE, pszGbs, -1, pszGbt, iLen*2);   &lt;br /&gt;      &lt;br /&gt;    //给wszUnicode分配内存   &lt;br /&gt;    wszUnicode=new wchar_t[iLen+1];   &lt;br /&gt;    //转换Gb码到Unicode码，使用了API函数MultiByteToWideChar   &lt;br /&gt;    MultiByteToWideChar (936, 0, pszGbt, -1, wszUnicode,iLen);   &lt;br /&gt;      &lt;br /&gt;    //计算转换的字符数   &lt;br /&gt;    iLen=WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ;   &lt;br /&gt;    //给pszBig5分配内存   &lt;br /&gt;    pszBig5=new char[iLen+1];   &lt;br /&gt;    //转换Unicode码到Big5码，使用API函数WideCharToMultiByte   &lt;br /&gt;    WideCharToMultiByte (950, 0, (PWSTR) wszUnicode, -1, pszBig5,iLen, NULL, NULL) ;   &lt;br /&gt;      &lt;br /&gt;    //返回Big5码字符   &lt;br /&gt;    sBig5=pszBig5;   &lt;br /&gt;      &lt;br /&gt;    //释放内存   &lt;br /&gt;    delete [] wszUnicode;   &lt;br /&gt;    delete [] pszGbt;   &lt;br /&gt;    delete [] pszBig5;   &lt;br /&gt;      &lt;br /&gt;    return sBig5;   &lt;br /&gt;    }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-5896796864498184981?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/5896796864498184981/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=5896796864498184981' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5896796864498184981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5896796864498184981'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/gbbig5.html' title='输入Gb字符，返回Big5字符'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-4387271749708195753</id><published>2007-10-26T00:34:00.001-07:00</published><updated>2007-10-26T00:34:25.659-07:00</updated><title type='text'>输入Big5字符，返回Gb简体字符</title><content type='html'>//---------------------------------------------------------------------------  &lt;br /&gt;//函数输入Big5字符，返回Gb简体字符  &lt;br /&gt;//---------------------------------------------------------------------------  &lt;br /&gt;AnsiString __fastcall Big2Gb(AnsiString sBig)  &lt;br /&gt;{  &lt;br /&gt; char* pszBig5=NULL; //Big5编码的字符  &lt;br /&gt; wchar_t* wszUnicode=NULL; //Unicode编码的字符  &lt;br /&gt; char* pszGbt=NULL; //Gb编码的繁体字符  &lt;br /&gt; char* pszGbs=NULL; //Gb编码的简体字符  &lt;br /&gt; AnsiString sGb; //返回的字符串  &lt;br /&gt; int iLen=0; //需要转换的字符数  &lt;br /&gt; &lt;br /&gt; pszBig5=sBig.c_str(); //读入需要转换的字符参数  &lt;br /&gt; &lt;br /&gt; //计算转换的字符数  &lt;br /&gt; iLen=MultiByteToWideChar (950, 0, pszBig5, -1, NULL,0) ;  &lt;br /&gt; //给wszUnicode分配内存  &lt;br /&gt; wszUnicode=new wchar_t[iLen+1];  &lt;br /&gt; //转换Big5码到Unicode码，使用了API函数MultiByteToWideChar  &lt;br /&gt; MultiByteToWideChar (950, 0, pszBig5, -1, wszUnicode,iLen);  &lt;br /&gt; &lt;br /&gt; //计算转换的字符数  &lt;br /&gt; iLen=WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, NULL,0, NULL, NULL) ;  &lt;br /&gt; //给pszGbt分配内存  &lt;br /&gt; pszGbt=new char[iLen+1];  &lt;br /&gt; //给pszGbs分配内存  &lt;br /&gt; pszGbs=new char[iLen+1];  &lt;br /&gt; //转换Unicode码到Gb码繁体，使用API函数WideCharToMultiByte  &lt;br /&gt; WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ;  &lt;br /&gt; &lt;br /&gt; //转换Gb码繁体到Gb码简体，使用API函数LCMapString  &lt;br /&gt; LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen);  &lt;br /&gt; &lt;br /&gt; //返回Gb码简体字符  &lt;br /&gt; sGb=pszGbs;  &lt;br /&gt; &lt;br /&gt; //释放内存  &lt;br /&gt; delete [] wszUnicode;  &lt;br /&gt; delete [] pszGbt;  &lt;br /&gt; delete [] pszGbs;  &lt;br /&gt;   &lt;br /&gt; return sGb;  &lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-4387271749708195753?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/4387271749708195753/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=4387271749708195753' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/4387271749708195753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/4387271749708195753'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/big5gb.html' title='输入Big5字符，返回Gb简体字符'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-5929530487895467469</id><published>2007-10-25T22:36:00.000-07:00</published><updated>2007-10-25T22:37:23.115-07:00</updated><title type='text'>BASSFX 파라미터 설정</title><content type='html'>void CEqualizerDlg::UpdateFX(int b){ int v = m_nArrEQ[b] / 50;  CSyncSongDlg* pDlg = (CSyncSongDlg*)AfxGetMainWnd();&lt;br /&gt; if (b&lt;10)&gt;m_BASSAudio.BASS_FXGetParameters(fx[b],&amp;amp;paramEQ);  paramEQ.fGain=(float)10.0-v;  pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[b],&amp;amp;paramEQ); } else {  BASS_FXREVERB paramEQ;  pDlg-&gt;m_BASSAudio.BASS_FXGetParameters(fx[10],&amp;amp;paramEQ);  paramEQ.fReverbMix=(float)-0.012*v*v*v;  pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[10],&amp;amp;paramEQ); }} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void CEqualizerDlg::SetBassFXParam(/*HSTREAM hStream*/){ //m_hStream = hStream; BASS_FXPARAMEQ paramEQ;&lt;br /&gt; CSyncSongDlg* pDlg = (CSyncSongDlg*)AfxGetMainWnd();&lt;br /&gt; fx[0]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); //return effect's handle fx[1]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[2]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[3]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[4]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[5]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[6]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[7]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[8]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0); fx[9]=pDlg-&gt;m_BASSAudio.BASS_ChannelSetFX(pDlg-&gt;m_BASSAudio.m_hStream,BASS_FX_PARAMEQ,0);&lt;br /&gt; paramEQ.fGain = 0;  //-15 TO 15 paramEQ.fBandwidth=18; //1 TO 36&lt;br /&gt; paramEQ.fCenter=80;  //HERTZ 80 TO 16000 pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[0],&amp;amp;paramEQ);  paramEQ.fCenter=170; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[1],&amp;amp;paramEQ);  paramEQ.fCenter=310; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[2],&amp;amp;paramEQ);  paramEQ.fCenter=600; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[3],&amp;amp;paramEQ);&lt;br /&gt; paramEQ.fCenter=1000; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[4],&amp;amp;paramEQ);&lt;br /&gt; paramEQ.fCenter=3000; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[5],&amp;amp;paramEQ);&lt;br /&gt; paramEQ.fCenter=6000; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[6],&amp;amp;paramEQ);&lt;br /&gt; paramEQ.fCenter=8000; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[7],&amp;amp;paramEQ);&lt;br /&gt; paramEQ.fCenter=12000; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[8],&amp;amp;paramEQ);&lt;br /&gt; paramEQ.fCenter=14000; pDlg-&gt;m_BASSAudio.BASS_FXSetParameters(fx[9],&amp;amp;paramEQ);&lt;br /&gt; if(m_bUseEQ) //EQ를 사용할 경우에만 적용 {  UpdateFX(0);  UpdateFX(1);  UpdateFX(2);  UpdateFX(3);  UpdateFX(4);  UpdateFX(5);  UpdateFX(6);  UpdateFX(7);  UpdateFX(8);  UpdateFX(9); }}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-5929530487895467469?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/5929530487895467469/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=5929530487895467469' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5929530487895467469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5929530487895467469'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/bassfx.html' title='BASSFX 파라미터 설정'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-7069573635008033151</id><published>2007-10-24T02:01:00.000-07:00</published><updated>2007-10-24T02:02:03.135-07:00</updated><title type='text'>用VC实现竖写汉字的方法</title><content type='html'>中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢？笔者偶然发现了一种利用VC实现竖写汉字效果的方法，现在就把它介绍给大家。 　　&lt;br /&gt;Windows系统内置了许多名称以“@”开头的字集，这些字集有一个共同的特点，即其所包含的文字全都是平躺着的(字头朝左，字底朝右)。如果我们能将这些字逆时针旋转270度后再显示出来，就可以达到实现竖写汉字效果的目的了。 　　要使文字发生旋转，我们只需创建一个逻辑字体并设定该逻辑字体的显示角度，再设定其字体名称为一个以“@”开头的字集的名称即可。我们可以采用两种方式创建逻辑字体。 　　其一，用CFont类的成员函数CreateFont直接创建逻辑字体。CreateFont的参数定义如下： BOOL CreateFont(                  int nHeight,           //字体的高度                 int nWidth,            //字体的宽度                 int nEscapement,       //字体显示的角度                 int nOrientation,      //字体的角度                 int nWeight,           //字体的磅数                 BYTE bItalic,          //斜体字体                 BYTE bUnderline,       //带下划线的字体                 BYTE cStrikeOut,       //带删除线的字体                 BYTE nCharSet,         //所需的字符集                 BYTE nOutPrecision,    //输出的精度                 BYTE nClipPrecision,   //裁减的精度                  BYTE nQuality,         //逻辑字体与输出设备的实际                                        //字体之间的精度                 BYTE nPitchAndFamily,  //字体间距和字体集                 LPCTSTR lpszFacename   //字体名称               ); 　　其中nEscapement单位为0.1角度，方向为逆时针，所以为了使平躺的字立起来应设定其值为2700,lpszFacename则赋以“@”开头的字集的名称，如“@system”。 　　其二,利用LOGFONT结构，将该结构作为参数调用CFont类的成员函数CreateFontIndirect创建逻辑字体。LOGFONT结构通常被用来描述一种逻辑字体，结构内的各变量分别代表逻辑字体的各个属性，这些变量与函数CreateFont的参数相同。其结构如下： typedef struct tagLOGFONT { // lf 　　　　　　　　　　LONG lfHeight;         //字体的高度　　　　　　　　　　LONG lfWidth;          //字体的宽度　　　　　　　　　　LONG lfEscapement;     //字体显示的角度 　　　　　　　　　　LONG lfOrientation;    //字体的角度　　　　　　　　　　LONG lfWeight;         //字体的磅数　　　　　　　　　　BYTE lfItalic;         //斜体字体　　　　　　　　　　BYTE lfUnderline;      //带下划线的字体　　　　　　　　　　BYTE lfStrikeOut;      //带删除线的字体　　　　　　　　　　BYTE lfCharSet;        //所需的字符集　　　　　　　　　　BYTE lfOutPrecision;   //输出的精度　　　　　　　　　　BYTE lfClipPrecision;  //裁减的精度　　　　　　　　　　BYTE lfQuality;        //逻辑字体与输出设备的                                           //实际字体之间的精度　　　　　　　　　　BYTE lfPitchAndFamily; //字体间距和字体集　　　　　　　　　　TCHAR lfFaceName[LF_FACESIZE]; //字体名称} LOGFONT; 　　下面我们就以一个示例来说明竖写汉字的实现方法： 　　1.建立一个MFC AppWizard(exe)应用工程CHNfont。在MFC AppWizard向导的第一步中选择Single Document，再点击按键Finish-&gt;OK完成工程的建立。 　　2.在CMainFrame::OnCreate函数中添加如下代码，使窗体最大化。AfxGetMainWnd()-&gt;ShowWindow(SW_SHOWMAXIMIZED); 　　3.添加如下代码实现竖写功能。 void CChildView::OnPaint()        {CPaintDC dc(this);// device context for painting/////// 利用CFont::CreateFont(...)函数实现竖写汉字////////CFont myFont;     //创建字体对象//创建逻辑字体myFont.CreateFont(　　　　　　　　　　　　　　56,        //字体高度(旋转后的字体宽度)=56 　　　　　　　　　　　　　　20,        //字体宽度(旋转后的字体高度)=20　　　　　　　　　　　　　　2700,       //字体显示角度=270°　　　　　　　　　　　　　　0,                  //nOrientation=0　　　　　　　　　　　　　　10,                 //字体磅数=10　　　　　　　　　　　　　　FALSE,              //非斜体　　　　　　　　　　　　　　FALSE,              //无下划线　　　　　　　　　　　　　　FALSE,       //无删除线　　　　　　　　　　　　　　DEFAULT_CHARSET,    //使用缺省字符集　　　　　　　　　　　　　　OUT_DEFAULT_PRECIS, //缺省输出精度　　　　　　　　　　　　　　CLIP_DEFAULT_PRECIS,//缺省裁减精度 　　　　　　　　　　　　　　DEFAULT_QUALITY,    //nQuality=缺省值　　　　　　　　　　　　　　DEFAULT_PITCH,      //nPitchAndFamily=缺省值　　　　　　　　　　　　　　"@system");         //字体名=@systemCFont *pOldFont=dc.SelectObject(&amp;amp;myFont);//选入设备描述表CRect rtClient;GetClientRect(rtClient);   //获取客户区尺寸、位置信息//在客户区适当位置输出文字dc.TextOut(rtClient.Width()/2+30,rtClient.Height()/8,               "无边落木萧萧下");dc.SelectObject(pOldFont); //将myFont从设备环境中分离myFont.DeleteObject();     //删除myFont对象/////////// 利用LOGFONT结构实现竖写汉字//////////////LOGFONT lf;                     //定义字体结构lf.lfWeight=10;                 //字体磅数=10lf.lfHeight=56;      //字体高度(旋转后的字体宽度)=56 lf.lfWidth=20;                  //字体宽度(旋转后的字体高度)=20lf.lfUnderline=FALSE;           //无下划线lf.lfStrikeOut=FALSE;           //无删除线lf.lfItalic=FALSE;              //非斜体lf.lfEscapement=2700;           //字体显示角度=270°lf.lfCharSet=DEFAULT_CHARSET;   //使用缺省字符集        strcpy(lf.lfFaceName,"@system"); //字体名=@system    CFont myLogFont;                   //定义字体对象myLogFont.CreateFontIndirect(&amp;amp;lf); //创建逻辑字体pOldFont=dc.SelectObject(&amp;amp;myLogFont);//选入设备描述表//在客户区适当位置输出文字dc.TextOut(rtClient.Width()/2-30,rtClient.Height()/8,                 "不尽长江滚滚来");dc.SelectObject(pOldFont); //将myFont从设备环境中分离myLogFont.DeleteObject();  //删除myLogFont对象       } 4.编译连接，运行。 以上实例在Windows98下，以VC++6.0编译通过。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-7069573635008033151?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/7069573635008033151/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=7069573635008033151' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7069573635008033151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7069573635008033151'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/vc_24.html' title='用VC实现竖写汉字的方法'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-5660583769481325288</id><published>2007-10-22T01:22:00.001-07:00</published><updated>2007-10-22T01:22:52.895-07:00</updated><title type='text'>Mdf파일</title><content type='html'>经常更新和优化的数据库可以以更快的速度运行。然而，将数据库直接从一个比较小的磁盘转移到另一个比较大的磁盘，这样的想法是不可能实现的。&lt;br /&gt;在转移数据库之前，你必须将数据库断开所有的操作。使用sp_detach_db存储程序可以将数据库从SQL Server 2000分离开来，从而达到数据库的离线操作。同样可以运行另一个存储程序sp_attach_db将数据库重新连接。&lt;br /&gt;Sp_detach_db是一个功能强大的存储程序，它只能由系统管理人员运行。除了具备“分离”功能之外，这一程序在分离数据库之前也自动运行所有表的UPDATE STATISTICS。&lt;br /&gt;以下的范例分离了MyDatabase数据库：&lt;br /&gt;EXEC sp_detach_db 'MyDatabase'&lt;br /&gt;现在可以转移我们的数据库到一个新的磁盘并重新连接它们。连接数据库操作可能比较复杂，除了提供数据库名称，你可以选择SQL Server数据库文件的位置。&lt;br /&gt;在以下的范例中，我们可以从一个新位置D:AnyFolder:重新连接数据库。&lt;br /&gt;execsp_attach_db 'MyDatabase',@filename1='D:AnyFolderMyDatabase_Data.MDF',@filename2='D:AnyFolderMyDatabase_Log.LDF'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-5660583769481325288?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/5660583769481325288/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=5660583769481325288' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5660583769481325288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5660583769481325288'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/mdf.html' title='Mdf파일'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-7805901713766477952</id><published>2007-10-21T23:26:00.001-07:00</published><updated>2007-10-21T23:26:47.651-07:00</updated><title type='text'>기호 삭제</title><content type='html'>CString CAutoSyncDlg::_Remove_Symbol(CString strData){ int i = 0; int nLen = strData.GetLength(); if(nLen &lt;= 0) return strData;&lt;br /&gt; BYTE *strBuffer; strBuffer = (BYTE*)malloc(strData.GetLength());       memcpy(strBuffer, strData, nLen);&lt;br /&gt; strData.Replace(_T("-"), _T(" ")); strData.Replace(_T("_"), _T(" ")); for(i=0; i &lt; nLen; i++)  {&lt;br /&gt;  if((strBuffer[i] &gt;= 0xB0) &amp;amp;&amp;amp; (strBuffer[i] &lt;= 0xC8)  //__한글부분   &amp;amp;&amp;amp; (strBuffer[i+1] &gt;= 0xA1) &amp;amp;&amp;amp; (strBuffer[i+1] &lt;= 0xFE))  {    i++;   }else if((strBuffer[i]&gt;= 0xCA) &amp;amp;&amp;amp; (strBuffer[i] &lt;= 0xFD) //__한자 해당 부분   &amp;amp;&amp;amp; (strBuffer[i+1] &gt;= 0xA1) &amp;amp;&amp;amp; (strBuffer[i+1] &lt;= 0xFE))  {    i++;   }else if(((strBuffer[i]&gt;= 0x41) &amp;amp;&amp;amp; (strBuffer[i] &lt;= 0x5A)) //__ 영어 해당 부분      ((strBuffer[i] &gt;= 0x61) &amp;amp;&amp;amp; (strBuffer[i] &lt;= 0x7A)))  {&lt;br /&gt;  }else if((strBuffer[i]&gt;= '0') &amp;amp;&amp;amp; (strBuffer[i] &lt;= '9'))  { //__숫자 처리 부분   //   strData.SetAt(i, ' ');   //__숫자는 별도로 처리함..  }else if((strBuffer[i]&gt;= 0xA1) &amp;amp;&amp;amp; (strBuffer[i+1] &gt;= 0xA1))  { //__2byte특수문자 부분   strData.SetAt(i, ' ');   strData.SetAt(i+1, ' ');   i++;&lt;br /&gt;  }else  { //__1byte 특수문자   strData.SetAt(i, ' ');  }&lt;br /&gt; }&lt;br /&gt; strData.Replace(_T(" "), _T(" ")); strData.Replace(_T("'"),_T("")); //strData.Replace("""",""); strData.Replace(_T("\""),_T("")); //edit by sun strData.Replace(_T("&amp;amp;"),_T(""));&lt;br /&gt; free(strBuffer);&lt;br /&gt; return strData;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-7805901713766477952?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/7805901713766477952/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=7805901713766477952' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7805901713766477952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/7805901713766477952'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_8062.html' title='기호 삭제'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-6652657708251884841</id><published>2007-10-21T23:24:00.000-07:00</published><updated>2007-10-21T23:25:09.285-07:00</updated><title type='text'>괄호 삭제</title><content type='html'>CString CAutoSyncDlg::_Remove_Parenthesis(CString strData){&lt;br /&gt; CString strDummy = _T("");&lt;br /&gt; int nTStart, nTEnd; bool bExit = false;&lt;br /&gt; while(!bExit) { //__() 소괄호 제거  nTStart = strData.Find(_T("("), 0);  nTEnd = strData.Find(_T(")"), 0);&lt;br /&gt;  if(nTStart == -1  nTEnd == -1)  {   bExit = true;  }  else  {   if(nTEnd &lt; nTStart)   {    bExit = true;   }   else   {    strDummy = strData.Mid(nTStart, (nTEnd+1)-nTStart);    strData.Replace(strDummy, _T(""));   }  } }&lt;br /&gt; bExit = false; while(!bExit) {//__[] 대괄호 제거  nTStart = strData.Find(_T("["), 0);  nTEnd = strData.Find(_T("]"), 0);&lt;br /&gt;  if(nTStart == -1  nTEnd == -1)  {   bExit = true;  }  else  {   if(nTEnd &lt; nTStart)   {    bExit = true;   }   else   {    strDummy = strData.Mid(nTStart, (nTEnd+1)-nTStart);    strData.Replace(strDummy, _T(""));   }  } }&lt;br /&gt; bExit = false; while(!bExit) {//__{} 중괄호 제거  nTStart = strData.Find(_T("{"), 0);  nTEnd = strData.Find(_T("}"), 0);&lt;br /&gt;  if(nTStart == -1  nTEnd == -1)  {   bExit = true;  }  else  {   if(nTEnd &lt; nTStart)   {    bExit = true;   }   else   {    strDummy = strData.Mid(nTStart, (nTEnd+1)-nTStart);    strData.Replace(strDummy, _T(""));   }  } }&lt;br /&gt;&lt;br /&gt; return strData;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-6652657708251884841?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/6652657708251884841/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=6652657708251884841' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6652657708251884841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6652657708251884841'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_9504.html' title='괄호 삭제'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3374411761151146123</id><published>2007-10-21T22:04:00.000-07:00</published><updated>2007-10-21T22:05:46.920-07:00</updated><title type='text'>바이러스 검색 다운로드</title><content type='html'>&lt;a href="http://www.lanniao.org/soft/nod32/"&gt;http://www.lanniao.org/soft/nod32/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;下载3和5&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3374411761151146123?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3374411761151146123/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3374411761151146123' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3374411761151146123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3374411761151146123'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_7080.html' title='바이러스 검색 다운로드'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-5141410947700928058</id><published>2007-10-21T21:30:00.001-07:00</published><updated>2007-10-21T21:30:46.181-07:00</updated><title type='text'>폴드</title><content type='html'>BOOL BrowseFolder(HWND hWnd, char *szFolder){ LPMALLOC ShellMalloc; LPITEMIDLIST idBrowse; BROWSEINFO BrowseInfo; char szDisplayName[MAX_PATH];&lt;br /&gt; if (SHGetMalloc(&amp;amp;ShellMalloc) != NOERROR) {  return FALSE; }&lt;br /&gt; BrowseInfo.hwndOwner = hWnd; BrowseInfo.pidlRoot = NULL; BrowseInfo.pszDisplayName = szDisplayName; BrowseInfo.lpszTitle = "请选择背景图片" ; BrowseInfo.ulFlags = BIF_DONTGOBELOWDOMAIN; BrowseInfo.lpfn = NULL; BrowseInfo.lParam = 0;&lt;br /&gt; idBrowse = SHBrowseForFolder(&amp;amp;BrowseInfo);&lt;br /&gt; if (idBrowse == NULL) {  return FALSE; } SHGetPathFromIDList(idBrowse, szFolder); ShellMalloc-&gt;Free(idBrowse); ShellMalloc-&gt;Release(); return TRUE;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-5141410947700928058?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/5141410947700928058/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=5141410947700928058' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5141410947700928058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/5141410947700928058'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_676.html' title='폴드'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-4936255038574420175</id><published>2007-10-21T19:53:00.000-07:00</published><updated>2007-10-21T19:54:27.365-07:00</updated><title type='text'>USB꼽힌 상태와 뺀상태</title><content type='html'>if((nEventType == 32772)  (nEventType == 32768))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-4936255038574420175?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/4936255038574420175/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=4936255038574420175' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/4936255038574420175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/4936255038574420175'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/usb.html' title='USB꼽힌 상태와 뺀상태'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-8991884257031020070</id><published>2007-10-21T19:30:00.000-07:00</published><updated>2007-10-21T19:31:14.178-07:00</updated><title type='text'>파일 저장</title><content type='html'>void CSearchDlg::SaveNPLWhenClose() &lt;br /&gt;{&lt;br /&gt; int nItmeCnt = 0; nItmeCnt = m_PuchaseGrid.GetItemCount(); if(nItmeCnt &lt; 1)  return;&lt;br /&gt; CString strRegstr;&lt;br /&gt; strRegstr = theGloval.m_strPuchaseDir + _T("&lt;a href="file://PuchaseList.npl/"&gt;\\PuchaseList.npl&lt;/a&gt;");&lt;br /&gt; FILE *fp; fp = _tfopen((LPCTSTR)strRegstr, _T("w+b"));&lt;br /&gt; if(fp == NULL) return;&lt;br /&gt; if(nItmeCnt &lt; 1){  fclose(fp); }else{  CString strArtistName, strTitle,strExpired;// strDummyTime;&lt;br /&gt;  CString strPath , strAccessTime;&lt;br /&gt;  LVITEM lvi;  memset(&amp;amp;lvi, 0, sizeof(LVITEM));  lvi.iItem =0;  lvi.mask = LVIF_PARAM;&lt;br /&gt;  XLISTCTRLDATA* pXLISTCTRLDATA;&lt;br /&gt;  for(int i = 0;i &lt; nItmeCnt; i++){&lt;br /&gt;   strTitle         = m_PuchaseGrid.GetItemText(i, 2);   strArtistName    = m_PuchaseGrid.GetItemText(i, 3);   strExpired   = m_PuchaseGrid.GetItemText(i, 4);&lt;br /&gt;   memset(&amp;amp;lvi, 0, sizeof(LVITEM));   lvi.iItem =i;   lvi.mask = LVIF_PARAM;   VERIFY(::SendMessage(m_PuchaseGrid.m_hWnd, LVM_GETITEM, 0, (LPARAM)&amp;amp;lvi));   pXLISTCTRLDATA = (XLISTCTRLDATA*) lvi.lParam;&lt;br /&gt;   strPath = pXLISTCTRLDATA-&gt;strPath;   strAccessTime = pXLISTCTRLDATA-&gt;strAccessDate;&lt;br /&gt;&lt;br /&gt;   strTitle.Replace(_T("\n"), _T(""));   strArtistName.Replace(_T("\n"), _T(""));&lt;br /&gt;   _ftprintf(fp, _T("%s%s%s%s%s\n"),     strPath, strTitle, strArtistName,strExpired,strAccessTime);&lt;br /&gt;  }  fclose(fp); }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-8991884257031020070?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/8991884257031020070/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=8991884257031020070' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/8991884257031020070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/8991884257031020070'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_9833.html' title='파일 저장'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-435648901294914908</id><published>2007-10-21T19:25:00.000-07:00</published><updated>2007-10-21T19:26:02.633-07:00</updated><title type='text'>폴드찾기</title><content type='html'>void CSearchDlg::FolderSearch(CString DirectoyName){ // DWORD MAXFILE = 8192;  // TCHAR* pc = new TCHAR[MAXFILE]; DirectoyName += _T("\\*.*");&lt;br /&gt; CFileFind  finder; DirectoyName.MakeUpper(); BOOL bWorking = finder.FindFile(DirectoyName);&lt;br /&gt; while (bWorking) {  bWorking = finder.FindNextFile();  // skip . and .. files; otherwise, we'd  // recur infinitely!  if (finder.IsDots())                  {   continue;  }  // if it's a directory, recursively search it&lt;br /&gt;  if (finder.IsDirectory())        //????(??)??....  {      FolderSearch(DirectoyName);  //  ? ????? ?? ?? ??? ????? ??? ?? ?? &lt;br /&gt;  }  else                                //?????...  {    CString strFilePath = finder.GetFilePath();   CString strFileName = finder.GetFileName();   int n = strFileName.ReverseFind('.');&lt;br /&gt;   // CString strExt =  strFileName;   CString strExt = strFileName.Right(4) ;   // strFileName = strFileName.Left(n);   strExt.MakeUpper();      if(strExt == ".MP3"  )    FileAdd(strFileName,strFilePath);        }&lt;br /&gt; } finder.Close();  PubSetItemCount_Text();}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-435648901294914908?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/435648901294914908/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=435648901294914908' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/435648901294914908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/435648901294914908'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_3229.html' title='폴드찾기'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3126269774369272676</id><published>2007-10-21T18:42:00.001-07:00</published><updated>2007-10-21T18:42:33.020-07:00</updated><title type='text'>vc에서 웹페지 가져오는 방법</title><content type='html'>void CSearchDlg::ConnectWeb(CString strURL, CString strPostData){ CString head = _T("Content-Type: application/x-www-form-urlencoded\r\n");&lt;br /&gt; CComVariant vtPostData;&lt;br /&gt; COleVariant vaHead(head);&lt;br /&gt; TCHAR* postData = NULL; postData = new TCHAR[ strPostData.GetLength()+1 ]; _tcscpy( postData, strPostData.GetBuffer() );&lt;br /&gt; int len = _tcslen(postData);&lt;br /&gt; SAFEARRAY *pSafeArray = SafeArrayCreateVector(VT_UI1,0,len);&lt;br /&gt; if(!pSafeArray) return ;&lt;br /&gt; char *value = NULL;&lt;br /&gt; if(SafeArrayAccessData(pSafeArray,(void **)&amp;amp;value) != S_OK) return ;&lt;br /&gt; for(int i=0; i&lt; len;i++)&lt;br /&gt; {&lt;br /&gt;  value[i] = (char)postData[i];&lt;br /&gt; }&lt;br /&gt; if(SafeArrayUnaccessData(pSafeArray) != S_OK) return ;&lt;br /&gt; V_VT(&amp;amp;vtPostData) = VT_ARRAY  VT_UI1;&lt;br /&gt; V_ARRAY(&amp;amp;vtPostData) = pSafeArray;&lt;br /&gt; m_explorer.Navigate(strURL,NULL,NULL,&amp;amp;vtPostData,vaHead);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3126269774369272676?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3126269774369272676/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3126269774369272676' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3126269774369272676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3126269774369272676'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/vc.html' title='vc에서 웹페지 가져오는 방법'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-6296968851749169209</id><published>2007-10-21T18:00:00.000-07:00</published><updated>2007-10-21T18:04:29.592-07:00</updated><title type='text'>언어 설정</title><content type='html'>Setlanginfo(void)&lt;br /&gt;LANGID langID =GetSystemDefaultLangID();&lt;br /&gt;m_nLang=LANG_KOREA;&lt;br /&gt;1.LangID ==0x0412  LangId==oxo812//한국어&lt;br /&gt;2.LangID==0xo804//중국어 간체&lt;br /&gt;3.LangID==ox0404,ox0804,ox0c04,ox1004//중국어 번체&lt;br /&gt;4.LangID==0x0411/일본어&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-6296968851749169209?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/6296968851749169209/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=6296968851749169209' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6296968851749169209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6296968851749169209'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post_21.html' title='언어 설정'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-8365343825420926011</id><published>2007-10-21T17:54:00.000-07:00</published><updated>2007-10-21T17:57:35.382-07:00</updated><title type='text'>AfxGetApp함수</title><content type='html'>&lt;p&gt;AfxGetApp():어프리케이션 클래스의 개체포인트&lt;/p&gt;&lt;p&gt;AfxGetMainWnd()메인프레임이 클래스의 객체 포인트&lt;/p&gt;&lt;p&gt;AfxGetInstanceHandle():응용프로그램의 인스턴트&lt;/p&gt;&lt;p&gt;AfxGetAppName()응용 프로그램의 이름을 리턴&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-8365343825420926011?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/8365343825420926011/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=8365343825420926011' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/8365343825420926011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/8365343825420926011'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/afxgetapp.html' title='AfxGetApp함수'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-3123939500085539872</id><published>2007-10-19T01:18:00.000-07:00</published><updated>2007-10-19T01:19:18.146-07:00</updated><title type='text'>AfxExtractSubString分割字符串的函数</title><content type='html'>AfxExtractSubString(CString&amp;amp; rString, LPCTSTR lpszFullString,int iSubString, TCHAR chSep = '\n')&lt;br /&gt;CString&amp;amp; rString  －－－　得到的字符串&lt;br /&gt;LPCTSTR lpszFullString　－－－　原来要分割的字符串&lt;br /&gt;int iSubString　－－　需要分割的第几段？&lt;br /&gt;TCHAR chSep = '\n'　－－　按照什么字符来分割？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-3123939500085539872?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/3123939500085539872/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=3123939500085539872' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3123939500085539872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/3123939500085539872'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/afxextractsubstring.html' title='AfxExtractSubString分割字符串的函数'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7886148019381873383.post-6350525918298721025</id><published>2007-10-19T00:54:00.001-07:00</published><updated>2007-10-19T00:54:13.420-07:00</updated><title type='text'>ㅇㅇ</title><content type='html'>ㅇㅇㅇㅇ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7886148019381873383-6350525918298721025?l=syncsong.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syncsong.blogspot.com/feeds/6350525918298721025/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7886148019381873383&amp;postID=6350525918298721025' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6350525918298721025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7886148019381873383/posts/default/6350525918298721025'/><link rel='alternate' type='text/html' href='http://syncsong.blogspot.com/2007/10/blog-post.html' title='ㅇㅇ'/><author><name>용</name><uri>http://www.blogger.com/profile/09065187118769691226</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
