2010년 11월 16일 화요일

TSVNCache CPU 점유 해결

SVN을 사용하게 되면 TSVNCache 프로세스가 실행되면서 CPU 점유를 40% 이상 사용하게 되여 PC를 사용하기 힘든 상황이 된다.

 

이때 CPU 사용량을 줄이기 위해 TortoiseSVN Settings을 변경하면 된다.

 

: TortoiseSVN 1.6.11

 

1. Settings 선택

 

2. DLG 실행

 

 

2. Icon Overlays 선택

 아래에

Exclude paths :

Include paths :

부분에 포함 하지 않아야 하는 항목 또는 포함되어야 하는 항목 입력

 ex)

 C:\* - C드라이브 전부

 C:\Windows\* - C드라이브 아래 Windows 아래 전부

 

3. 적용 및 확인을 선택하면

프로세스 사용량이 줄어든 것을 볼수 있다..

 

- 끝 -

 

2010년 8월 25일 수요일

VNC 접속 설정

 

외부에서 VNC 접속을 설정

 

파일 복사

CFile file, wrFile;
 CFileException ex;

 /// 원본 파일을 찾을수 없다.
 if(!file.Open(strLocation, CFile::modeRead | CFile::shareDenyWrite, &ex) )
 {
  AfxMessageBox(_T("파일을 열수 없습니다. ") );
  return FALSE;
 }
 else
 {
  CFileStatus fileStatus;
  CFile::GetStatus(strcpyLocation, fileStatus);
  /// 새로 생성할 파일의 생성 또는 write 할수 없다.
  if(!wrFile.Open(strcpyLocation, CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive, &ex))
  {
   TCHAR szError[1024];
   ex.GetErrorMessage(szError, 1024);
   file.Close();
   return FALSE;
  }
  else
  {
   /// 파일에 읽고 쓴다.
   BYTE buffer[4096];
   DWORD dwRead;
   do{
    memset(buffer, ' ', 4096);
    dwRead = file.Read(buffer, 4096);
    wrFile.Write(buffer, dwRead);
   }
   while(dwRead > 0);
  }
 }

2010년 6월 25일 금요일

Control 배경 삭제

Control 의 배경을 투명하게 보이기 위해서는 BkMode의 TRANSPARENT를 사용하여야 한다.

 

사용 하는 방법

 

OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
          HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

          CWnd *pWndTemp;
          pWndTemp = GetDlgItem(IDC_STATIC_ID);

          if(pWnd == pWndTemp)
          {
                 /// 배경 투명으로 변경
                 pDC->SetBkMode(TRANSPARENT);
                return hbr = (HBRUSH)GetStockObject( NULL_BRUSH );
          }

          return hbr;
}

 

초기 생성할때 실행되며 원하는 Control의 CWnd를 얻어 사용

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

프로그램에서 Process 실행하기(exe)

프로그램 실행

CreateProcess(NULL, (LPSTR)"프로세스 경로명"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

여러 ToolBar 를 하나의 ControlBar에 붙이기

Frame 에서 DockControlBar(CControlBar* pBar, CControlBar* pBarBase /* = NULL */) 를 상속받아 사용

 

void CControllerFrame::DockControlBar(CControlBar* pBar, CControlBar* pBarBase /* = NULL */)
{
 if (pBarBase != NULL)
 {
  CRect rcBase;
  DWORD dwStyleBase;
  UINT nDockBarID;

  RecalcLayout();

  pBarBase->GetWindowRect(rcBase);
  rcBase.OffsetRect(1,1);

  dwStyleBase = pBarBase->GetBarStyle();
  if  (dwStyleBase & CBRS_ALIGN_TOP)  nDockBarID = AFX_IDW_DOCKBAR_TOP;
  else if (dwStyleBase & CBRS_ALIGN_BOTTOM) nDockBarID = AFX_IDW_DOCKBAR_BOTTOM;
  else if (dwStyleBase & CBRS_ALIGN_LEFT)  nDockBarID = AFX_IDW_DOCKBAR_LEFT;
  else if (dwStyleBase & CBRS_ALIGN_RIGHT) nDockBarID = AFX_IDW_DOCKBAR_RIGHT;
  else          nDockBarID = 0;

  /// MDI 일때

  CMDIChildWnd::DockControlBar(pBar, nDockBarID, &rcBase);

  /// SDI일때

 /// CFrameWnd::DockControlBar(pBar, nDockBarID, &rcBase);
 }
 else

 {

 /// MID 일때
  CMDIChildWnd::DockControlBar(pBar);

 /// SDI 일때

  CFrameWnd::DockControlBar(pBar);

 }

}

 

Frame 에서 Toolbar를 생성하는 부분에 초기 생성되는 Bar를 넣고 그 위에 추가로 생성되는 Bar를 입력

 

OnCreate(LPCREATESTRUCT lpCreateStruct)

{

  .....

 /// pBarBase 가 NULL 이기 때문에 상위 Class 인 DockControlBar 호출
 DockControlBar(&m_wndToolBar);

 /// 재정의한 함수 적용후 호출

 DockControlBar( &m_wndEventToolBar, &m_wndToolBar);

.....

}


출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

창 움직이기

 

OnNcHitTest를 재사용 하면 된다


UINT CMemoMinDlg::OnNcHitTest(CPoint point)
{
 return HTCAPTION;
}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

PtInRect

선택한 Point가 원하는 Rect 내부에 있는지 여부 확인

 

일정 공간에 마우스 또는 일정한 Point 가 위치 했는지 여부를 확인할때 사용한다.

 

 

if(rect.PtInRect(ptpoint) )
 {
  TRACE("hit Position \n");
 }

 

CRect 의 함수로 rect 내부에 ptpont(CPoint) 좌표가 위치 했는지 여부를 알려준다.

 

단 Rect Hight 와 Width 가 1보다 커야 한다.

 

return : BOOL 형식으로 내부에 위치하면 TRUE를 반환한다.


 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

메뉴 띄우기

메뉴는 CMenu 띄우기

 

Resource 를 이용

Resource로 제작한 메뉴ResourceID (IDR_MENUMAIN)

 

 CMenu muTemp, *pOpenMenu;
 muTemp.LoadMenu(IDR_MENUMAIN);
 pOpenMenu = muTemp.GetSubMenu(0); // Resource 메뉴 번호
 pOpenMenu->TrackPopupMenu(TPM_LEFTALIGN, ptPoint.x, ptPoint.y, AfxGetMainWnd());

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

작업표시줄에 프로그램 않보이기

작업표시줄에 프로그램을 않보이게 실행이 필요한 경우

 

EX Style를 변경하면된다.

 

  ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

Tray Icon 만들기

VC++ 에서는 Tray ICon 만들기가 정말 쉽다.

 

여기 저기 많은 자료를 찾아봤는데

 

http://erik-ymkim.blogspot.com/2008/01/how-to-use-tray-icon-with-vc.html 여기에 정리되어 있는

 

자료가 제일 간단하게 정리되어 있습니다. ^^

 

^^ 쉽게 보면

 

Header 에

NOTIFYICONDATA m_NotiIcon; 선언

 

초기 생성에 아래 내용 입력 (Create 또는 OnInitDialog())

 m_NotiIcon.cbSize = sizeof(m_NotiIcon);
 m_NotiIcon.hWnd = this->m_hWnd;
 m_NotiIcon.uID = IDI_TRAY_ICON;
 m_NotiIcon.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
 m_NotiIcon.uCallbackMessage = WM_MY_TRAYICON;
 m_NotiIcon.hIcon = AfxGetApp()->LoadIcon(IDI_TRAY_ICON);
 strcpy(m_NotiIcon.szTip, "MemoMin");
 Shell_NotifyIcon(NIM_ADD, &m_NotiIcon);

각각의 전달되는 메시지에 맞게 Event 처리

TrayIConMsg(WPARAM wParam, LPARAM lParam)

switch(lParam)
 {
 case WM_RBUTTONDOWN:
  {
   break;
  }
 case WM_LBUTTONDBLCLK:
  {
   break;
  }
 }

 

Event는 PreTranslateMessage(MSG* pMsg) 에서 받으면 되니까

PreTranslateMessage(MSG* pMsg)

{

if(pMsg->hwnd == m_NotiIcon.hWnd)
 {
  TrayIConMsg(pMsg->lParam, pMsg->message); // 메시지 받아 바로 전달 ^^

 }

}

 

이렇게 처리하면 쉽게 가능하다 ^^

 

프로그램 종료시에는

Shell_NotifyIcon(NIM_DELETE, &m_NotiIcon);

Icon을 삭제해주는 쎈스 ~~

 

만약에 여러개의 TrayICon을 주기적으로 변경해주기 위해서는

현재 보여지고 있는 TrayICon을 삭제하교 새로운 TrayICon을 띄워주면 된다.

 

삭제하고 새로보여줄때

Shell_NotifyIcon( NIM_MODIFY, &m_NotiIcon);

위에 것을 잘 활용하면 움직이는 것처럼 보여줄수 있다. ^^


출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CWind 상속 받기 (주의점)

CWind를 상속 받을 때는 주의 점

 

CWind를 상속받을 때 Class Name RegisterClass 함수로 등록하여 사용

 

CreateEx(0, AfxRegisterWndClass(0, LoadCursor(IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH)), "NewClassName",WS_POPUP|WS_SYSMENU|WS_VISIBLE|WS_CAPTION, CRect(0,0,200,200), this, NULL);

 

삭제시에는

this->delete 로 삭제 하게됨으로

생성한 Class 나 또는 PostNcDestroy(); 함수를 이용하여 삭제

 

 

http://msdn.microsoft.com/en-us/library/1xb05f0h(VS.80).aspx

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CFile을 이용한 File 제어

MFC에서 제공하는

 

CFile 라이브러리를 이용해서 파일을 제어해봤다.

 

사실 API 를 이용하는 것보다 쉬울줄 알았는데 쓰기에는 쉬워도 제작하기는 불편하다. ㅋㅋ

 

-- Class를 이용한 접근

CMultiFileControl.h

 

-- API 를 이용한 접근

MultiFileControl.h

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

ADO를 이용한 DB 접속

 

가장 많이 쓰는 DB 접속 라이브러리

 

당연히 MFC를 이용하여 제작 했구..

 

쓰기 편하도록 작업했는데 ㅋㅋㅋ 글쎄 ^0^

 

#import "C:/program files/common files/system/ado/msado15.dll" rename("EOF", "EndOfFile")

Dll 을 이용했기 때문에 위 경로에 있어야하는 것은 당연한 일 ~~

 

데이터는 RecPtr 을 이용하여 리턴하는데 쓰는 법은 여기저기서 찾아보심 빠를 듯하네여 ^0^

 

시간되면 RecPtr 사용법 설명도 올릴께요 ^0^

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

선택한 폴더 아래 모든 파일 찾기

갑자기 개발 파일 목록화를 진행한단다.

 

내용이 너무 많아 하나하나 정리하기 힘들어

 

선택한 폴더 아래의 모든 파일을 찾아 파일로 저장하는 프로그램을 제작해 보았다.

 

선택한 폴더의 하위 폴더까지 검색하여 목록을 파일로 구분자는 TAB을 이용하여 저장하였다.

 

 

 

Open 버튼을 선택하면

 

파일 경로를 선택하는 찾이 뜬다

 

창은  SHBrowseForFolder 사용


/************************************************************************/
/* 시작 폴더 Open                                                                              */
/************************************************************************/
void CFileAllLoadDlg::OnBnClickedButtonopen()
{
 /// 저장된 폴더 수량 초기화
 m_nFoldCount = 0;
 /// 파일 이름 count 초기화 (Message 리스트 수량)
 m_nIndexList = 0;
 ITEMIDLIST *pildBrowse;
 char pszPathname[MAX_PATH];
 BROWSEINFO bInfo;
 memset( &bInfo, 0, sizeof(bInfo));
 bInfo.hwndOwner = GetSafeHwnd();
 bInfo.pidlRoot = NULL;
 bInfo.pszDisplayName = (LPSTR)(LPCWSTR)pszPathname;
 bInfo.lpszTitle = _T("디렉토리를 선택하세요");
 bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
 pildBrowse = ::SHBrowseForFolder(&bInfo);

 if(pildBrowse != NULL)
 {
  /// Open 한 폴더 열기
  SHGetPathFromIDList(pildBrowse, (LPTSTR)pszPathname);
  (LPCTSTR)pszPathname;

  CString strPathName = (LPCTSTR)pszPathname; //dlgFile.GetPathName();
  /// 폴더 Open 실패
  if(strPathName == "")
   return;

  /// 폴더 이름 저장
  m_LISTDIR.push_back(strPathName);
  GetFileNameData();
  /// Open 프로그래스 위치
  m_ctrPrograssOpen.SetPos(1);
 }
}

 

http://tong.nate.com/gabester/24397313 내용 참조

 

CFileFind 를 이용하여 폴더의 내용 검색

 

하위 폴더는 따로 List 에 입력하여 관리

 


/************************************************************************/
/*  파일 이름 찾기                                                               */
/************************************************************************/
void CFileAllLoadDlg::GetFileNameData()
{
 LISTDIR::iterator iter;

 iter = m_LISTDIR.begin();
 CString strPath = (*iter);
 /// 파일 객체 생성
 m_pFileFind = new CFileFind;
 CString strFolderTemp = strPath+_T("\\*.* ");

 m_ctrDirPas.SetWindowText(strFolderTemp);
 m_ctrDirPas.UpdateWindow();
 /// 파일 읽기
 BOOL bWorking = m_pFileFind->FindFile(strFolderTemp);
 if(bWorking == TRUE)
 {
  m_nTime = SetTimer(1, 300, 0);
 }
}

 

파일은 바로 저장 및 메시지로 표시

 

Timer 를 이용하여 파일 내용 검색

   BOOL bWorking = m_pFileFind->FindNextFile();
   int nCount = (int)m_LISTDIR.size();
   /// 선택한 다름파일 이없는 경우 삭제
   if(bWorking == FALSE)
   {
    m_nFoldCount = m_nFoldCount+1;
    int nState =(100*m_nFoldCount)/nCount;
    m_ctrPrograssOpen.SetPos(nState-1);

    KillTimer(m_nTime);
    m_pFileFind->Close();
    delete m_pFileFind;
    m_pFileFind = NULL;
    m_LISTDIR.pop_front();
    CheckFolder();

    break;
   }
   
   /// 점인경우
   if(m_pFileFind->IsDots())
    break;

   CString strStateFolder = m_pFileFind->GetFilePath();
   /// 내부 폴더인경우
   if(m_pFileFind->IsDirectory())
   {
    CString strFolder = m_pFileFind->GetFilePath();
    /// 폴더 저장
    m_LISTDIR.push_back(strFolder);
   }
   else
   {
    CString strFileNameTemp = m_pFileFind->GetFileName();
    int nfindFile = strFileNameTemp.ReverseFind('.');
    int nTotalFile = strFileNameTemp.GetLength();
    CString strLoadFile = strFileNameTemp.Left(nfindFile);
    CString strFileT = strFileNameTemp.Right(nTotalFile-nfindFile);

    m_nIndexList = m_nIndexList+1;
    CString strFolder = m_pFileFind->GetFilePath();
    int nFind = strFolder.ReverseFind('\\');
    strFolder = strFolder.Left(nFind);
    CString strIndex;
    strIndex.Format("%d", m_nIndexList);

    strFolder = strIndex+"  "+strFolder+" "+strLoadFile+" "+strFileT;
    m_pCMultiFileControl->WriteFileData("FileLoad.ini", (LPTSTR)(LPCTSTR)strFolder, m_nIndexList, WRITE_INSERTLINE);
    TRACE(_T("%s\n"), strFileNameTemp);

    if(m_ctrListMessage.GetCount() > 50 )
     m_ctrListMessage.DeleteString(0);

    m_ctrListMessage.AddString(strFolder);
    //   m_ctrListMessage.SetSel(m_ctrListMessage.GetCount()-1, TRUE);
    m_ctrListMessage.UpdateWindow();
   }

 

저장된 List 이용 하위 폴더 확인


/************************************************************************/
/* 하위폴더 여부 확인                                                             */
/************************************************************************/
void CFileAllLoadDlg::CheckFolder()
{
 int nCont = (int)m_LISTDIR.size();
 if( nCont > 0)
 {
  /// 하위폴더가 있을시
  GetFileNameData();
 }
 else
  m_ctrPrograssOpen.SetPos(100);
}

 

첨부 내용은 디버거 버전의 Install 프로그램 ^^

 

소스코드는 요청해주시면 바로 올리겠습니다.



출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

Visual Studio 에서 Warning LNK4070 오류

 

Output File Name를 바꾸면  Warning이 발생한다.

 

처리방법은 def파일을 변경해주면된다.

 

Output File Name와 동일하게 projectName을 변경해준다.

 

; projectName.def : Declares the module parameters for the DLL.

LIBRARY      "projectName"

EXPORTS
    ; Explicit exports can go here

출처 :

 

http://blog.naver.com/lantis00?Redirect=Log&logNo=70022613729

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CFont 사용

파라미터가 너무 많아 잘잊어 버리는 거. ^0^

 

// The code fragment shows how to create a font object,
// select the font object into a DC (device context) for text
// drawing, and finally delete the font object.

// Initializes a CFont object with the specified characteristics.
CFont font;
VERIFY(font.CreateFont(
   12,                        // nHeight
   0,                         // nWidth
   0,                         // nEscapement
   0,                         // nOrientation
   FW_NORMAL,                 // nWeight
   FALSE,                     // bItalic
   FALSE,                     // bUnderline
   0,                         // cStrikeOut
   ANSI_CHARSET,              // nCharSet
   OUT_DEFAULT_PRECIS,        // nOutPrecision
   CLIP_DEFAULT_PRECIS,       // nClipPrecision
   DEFAULT_QUALITY,           // nQuality
   DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
   _T("Arial")));                 // lpszFacename

// Do something with the font just created...
CClientDC dc(this); 
CFont* def_font = dc.SelectObject(&font);
dc.TextOut(5, 5, _T("Hello"), 5);
dc.SelectObject(def_font);

// Done with the font.  Delete the font object.
font.DeleteObject();

 

# 출처 : MSDN

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

ADO를 이용한 MDB 파일 읽기

중요 소스만 ..........

 

/// 선언

#import "C:/program files/common files/system/ado/msado15.dll" rename("EOF", "EndOfFile")

typedef ADODB::_RecordsetPtr  RecPtr;
typedef ADODB::_ConnectionPtr CnnPtr;
typedef ADODB::_CommandPtr ComPtr;

 

/// 생성

m_pconnection.CreateInstance(__uuidof(ADODB::Connection) );

 

/// DB Open

m_pconnection->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source= aaa.mdb;", "", "", -1)

 

/// cursor 위치

m_pconnection->CursorLocation = ADODB::adUseClient;

/// Query 입력 실행

CString strQuery;

RecPtr recPtr = NULL;

recPtr = m_pconnection->Execute(strQuery, NULL, ADODB::adOptionUnspecified); // 쿼리 실행

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

CScrollView 생성

 

/// Scroll 이 생성될 크기

/// View 가 생성되면 서 일정한 Rect를 가지게 되는게

/// 그 Rect 보다 큰 값을 넣으면 Scroll 이 생성된다.

 

 CSize sizeTotal;
 sizeTotal.cx = 768;
 sizeTotal.cy = 1024;
 SetScrollSizes(MM_TEXT, sizeTotal);

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

2010년 4월 22일 목요일

CListctrl 라인간격(높이) 조절

가상의 이미지를 등록하여 높이를 크게 한다.

 

  CImageList gapImage;

    gapImage.Create(1,16,ILC_COLORDDB,1,0); //2번째 파라미터로 높이조절.....

    m_ctlMyList.SetImageList(&gapImage,LVSIL_SMALL);

 

    CRect rect;

 

    m_ctlMyList.GetClientRect(&rect);

    m_ctlMyList.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);    

 

    m_ctlMyList.InsertColumn(0, _T("AAAA"),LVCFMT_CENTER,80);

    m_ctlMyList.InsertColumn(1, _T("BBBB"),LVCFMT_LEFT,100);

    m_ctlMyList.InsertColumn(2, _T("CCCC"),LVCFMT_LEFT,80);

    m_ctlMyList.InsertColumn(3, _T("DDDD"),LVCFMT_LEFT,80);

 

 

    m_ctlMyList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

 

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=59&MAEULNO=23&no=16712&ref=16712

2010년 3월 26일 금요일

std::string 변경

 

#include <sstream>

 

int => std::string;

int nValue = 22;

std::ostringstream stom;

stom<<nValue;
std::string strTemp = stom.str();

 

CString => std::string;

CString strValue = _T("aaa");

CT2CA pszca(strValue)

std::string strStringTemp(pszca);

 

std::string => CString;

std::string strData;

CString strTemp = CString(strData.c_str());

2010년 2월 25일 목요일

MacAddress 가져오기

int GetMacAddress(char *macaddress)

{

    ASTAT Adapter;

 

    NCB Ncb;

    UCHAR uRetCode;     

    LANA_ENUM   lenum;

    int      i;

 

    memset( &Ncb, 0, sizeof(Ncb) );

    Ncb.ncb_command = NCBENUM;

    Ncb.ncb_buffer = (UCHAR *)&lenum;

    Ncb.ncb_length = sizeof(lenum);

    uRetCode = Netbios( &Ncb );

    //loging( "The NCBENUM return code is: 0x%x \n", uRetCode );

 

    for(i=0; i < lenum.length ;i++)

    {

        memset( &Ncb, 0, sizeof(Ncb) );

        Ncb.ncb_command = NCBRESET;

        Ncb.ncb_lana_num = lenum.lana[i];

 

        uRetCode = Netbios( &Ncb );

        //loging( "The NCBRESET on LANA %d return code is: 0x%x \n",

          // lenum.lana[i], uRetCode );

 

        memset( &Ncb, 0, sizeof (Ncb) );

        Ncb.ncb_command = NCBASTAT;

        Ncb.ncb_lana_num = lenum.lana[i];

 

        unsigned char aa[16] = "*              ";

        memcpy(Ncb.ncb_callname , aa , 16);        

        Ncb.ncb_buffer = (unsigned char *) &Adapter;

        Ncb.ncb_length = sizeof(Adapter);

 

        uRetCode = Netbios( &Ncb );

        //loging( "The NCBASTAT on LANA %d return code is: 0x%x \n",

        //lenum.lana[i], uRetCode );

        if ( uRetCode == 0 )

        {

            sprintf(macaddress, "%02x%02x%02x%02x%02x%02x",

                                Adapter.adapt.adapter_address[0],

                                Adapter.adapt.adapter_address[1],

                                Adapter.adapt.adapter_address[2],

                                Adapter.adapt.adapter_address[3],

                                Adapter.adapt.adapter_address[4],

                                Adapter.adapt.adapter_address[5]);

             return 1;

         }

    }

    return 0;

}

[출처] vc++ macadress 얻어오기 데브피아 펌|작성자 하나

 

2010년 2월 17일 수요일

메모리 leaks

 

수많은 메모리 leaks

 

버전이 다른 DLL을 참조함으로 생기는 leaks 란다.

 

The most common case is mixing ANSI (MFC4xd.DLL) and UNICODE (MFC4xxUd.DLL) versions of MFC in the same process. This can also occur when mixing MFC42d.DLL and MFC40d.DLL.

 

그냥 무시하란다..

 

Memory leaks are reported when you use multiple MFC DLLs

 

   a CDynLinkLibrary object at $00410F70, 64 bytes long
   a CDynLinkLibrary object at $00410F70, 64 bytes long
   {38} client block at 0x00410D80, subtype 0, 64 bytes long.
   a CDynLinkLibrary object at $00410D80, 64 bytes long
   a CDynLinkLibrary object at $00410D80, 64 bytes long
   {36} client block at 0x00410C60, subtype 0, 64 bytes long.
   a CDynLinkLibrary object at $00410C60, 64 bytes long
   a CDynLinkLibrary object at $00410C60, 64 bytes long
   

 

다름을 이용해서 메모리를 잡으란다.

아래 Trace 다음에 나오는 것만 잡으면 된단다..

 

   int CTestDllApp::ExitInstance()
   {
      TRACE(_T("ExitInstance() for regular DLL: TESTDLL\n"));

      return CWinApp::ExitInstance();
   }

 

출처 : http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B167929

GDI+ 사용

Windows XP에서 지원하는 GDI+

Link : gdiplus.lib

 

사용하는 곳에 초기 선언

#include <gdiplus.h>

using namespace Gdiplus;

 

class GdiplusTest

{

   GdiplusTest;

   ~GdiplusTest;

private:

    ULONG_PTR m_gdiplusPTR;

}

 

GdiplusTest::GdiplusTest

{

   GdiplusStartupInput gdipluse;
   GdiplusStartup(&m_gdiplusPTR, &gdipluse, NULL);

}

GdiplusTest::~GdiplusTest

{

   GdiplusShutdown(m_gdiplusPTR);

}

 

void GdiplusTest::Draw()

{

   CDC *pDC;

   pDC = GetDC();

   RectF rectTemp;

 

   Graphics graphics(pDC);
   Pen pen(Color(255, 0, 0), 1);

   graphics.SetPageUnit(UnitPixel);
   graphics.DrawEllipse(&pen, rectTemp);

   ReleaseDC(pDC);

}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

레지스트리 등록

프로그램의 실행경로를 아는 방법에는
1. 프로그램이 실행되면서 자신의 경로를 레지스트에 등록한다.
2. GetModuleHandle함수를 사용한다.
3. 기타

여기서는 2번째 방법을 설명하고 있습니다.

필요할때 사용하세요

CString getAppPath()
{
HMODULE hModule;
hModule = ::GetModuleHandle(NULL); // handle of current module
ASSERT(hModule != 0);

CString strExeFileName;
VERIFY(::GetModuleFileName(hModule, strExeFileName.GetBuffer(_MAX_PATH),
_MAX_PATH));
strExeFileName.ReleaseBuffer();

char Drive[_MAX_DRIVE];
char Path[_MAX_PATH];
char Filename[_MAX_FNAME];
char Ext[_MAX_EXT];
_splitpath(strExeFileName, Drive, Path, Filename, Ext);

return CString(Drive)+CString(Path); // has trailing backslash
}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

stl map 사용

struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};

int main()
{
map months;
/// 또는 months.insert
months["january"] = 31;
months["february"] = 28;
months["march"] = 31;
months["april"] = 30;
months["may"] = 31;
months["june"] = 30;
months["july"] = 31;
months["august"] = 31;
months["september"] = 30;
months["october"] = 31;
months["november"] = 30;
months["december"] = 31;

cout << "june -> " << months["june"] << endl;
map::iterator cur = months.find("june");
map::iterator prev = cur;
map::iterator next = cur;
++next;
--prev;
cout << "Previous (in alphabetical order) is " << (*prev).first << endl;
cout << "Next (in alphabetical order) is " << (*next).first << endl;
}

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

화면좌표에 Windows 위치 설정

CRect Screen;
SystemParametersInfo(SPI_GETWORKAREA,0,&Screen,0);
Screen.NormalizeRect();
Scalex=Screen.Width();
Scaley=Screen.Height();

#2
CClientDC dc(AfxGetMainWnd());
int H, W;
H = GetDeviceCaps(dc, VERTRES);
W = GetDeviceCaps(dc, HORZRES);


#3
// WINDOWPLACEMENT structure
WINDOWPLACEMENT wp; // Get dialog window placement
AfxGetMainWnd()->GetWindowPlacement(&wp); // Increment bottom section of dialog
wp.rcNormalPosition.bottom += 100; // Set dialog's new window placement
AfxGetMainWnd()->SetWindowPlacement(&wp);


#4
CRgn crgn;
RECT r;
AfxGetMainWnd()->GetWindowRect(&r);
r.bottom = r.bottom*2; // souble the 'length' of the dialog
crgn.SetRectRgn(&r);
AfxGetMainWnd()->SetWindowRgn((HRGN)crgn, TRUE);

#5
RECT r;
AfxGetMainWnd()->GetWindowRect(&r);
r.bottom = r.bottom*2; // double the 'length' of the dialog
MoveWindow(&r);

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(VC++)통

프로세스 강제 종료

=========================================================================================

   본 팁&트릭은 EnjoyDEV.NET에서 나온 것이며 재배포시 이 문구는 포함시켜주시기 바랍니다.

=========================================================================================

 

Script를 사용하여 만들었습니다.

프로젝트->참조에서 Microsoft Scripting Runtime 을 추가하시면 됩니다.

이 참조파일(Scrrun.dll)은 시스템 파일이기 때문에 모든 OS에 존재하는 파일이니 따로 배포할 필요가

없습니다.

 

Public Sub KillProcess(PName As String)
'--------------------------------------------------------------------------------------------
'만든사람: 신종흔(chiuoo@enjoyev.net)
'만든날짜: 2007.03.22
'사용법: KillProcess([실행파일명])
'        --> 실행파일명은 작업관리자->프로세스탭에서 이미지 이름에 해당하는 이름과 동일
'--------------------------------------------------------------------------------------------
    Dim pgm As String
    Dim wmi As Object
    Dim processes, process
    Dim sQuery As String
   
    pgm = PName
    Set wmi = GetObject("winmgmts:")
    sQuery = "select * from win32_process where name='" & pgm & "'"
    Set processes = wmi.execquery(sQuery)
   
    For Each process In processes
        process.Terminate
    Next
   
    Set wmi = Nothing
End Sub

 

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=48&MAEULNO=19&no=3332

프로세스 강제 종료

OpenProcess 디버그권한 문제 발생

해결은 아래쪽 검토

 

bool ProcessKill(CString strProcessName)

{

    HANDLE         hProcessSnap = NULL;

    BOOL           bRet      = FALSE;

    PROCESSENTRY32 pe32      = {0};

 

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

 

    if (hProcessSnap == (HANDLE)-1)

        return false;

 

    pe32.dwSize = sizeof(PROCESSENTRY32);

   

    //프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다

    if (Process32First(hProcessSnap, &pe32))

    {

        BOOL          bCurrent = FALSE;

        MODULEENTRY32 me32       = {0};

 

        do

        {

           bCurrent = GetProcessModule(pe32.th32ProcessID,strProcessName);

 

           if(bCurrent)

           {

              HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

 

              if(hProcess)

              {

                 if(TerminateProcess(hProcess, 0))

                 {

                    unsigned long nCode; //프로세스 종료 상태

                    GetExitCodeProcess(hProcess, &nCode);

                 }

                 CloseHandle(hProcess);

              }

           }

        }

        while (Process32Next(hProcessSnap, &pe32)); //다음 프로세스의 정보를 구하여 있으면 루프를 돈다.

    }

 

    CloseHandle (hProcessSnap);

 

    return true;

}

 

bool GetProcessModule(DWORD dwPID,CString sProcessName)

{

    HANDLE        hModuleSnap = NULL;

    MODULEENTRY32 me32        = {0};

 

    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

    if (hModuleSnap == (HANDLE)-1)

        return (FALSE);

 

    me32.dwSize = sizeof(MODULEENTRY32);

   

    //해당 프로세스의 모듈리스트를 루프로 돌려서 프로세스이름과 동일하면

    //true를 리턴한다.

    if(Module32First(hModuleSnap, &me32))

    {

       do

       {

          if(me32.szModule == sProcessName)

          {

             CloseHandle (hModuleSnap);

             return true;

          }

       }

       while(Module32Next(hModuleSnap, &me32));

    }

 

    CloseHandle (hModuleSnap);

 

    return false;

}

 

여기에 디버그권한 에서는 실행되고 .exe를 바로 실행 했을 때는 프로세스를 못가져 오는 현상이 있다 ㅡ.ㅡ 프로세스 권한 문제라는데..

 

OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

이내용을 PROCESS_ALL_ACCESS=>MAXIMUM_ALLOWED 이걸로 변경해 사용하면 된다.

 

 

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7057

2010년 2월 12일 금요일

DCom connetor 사용 Dll 생성



SAP 에서 RFC 통신을 위해 DCom connetor를 사용하는데

 

그 사용법을 정리한다.

 

DCOMConnector 610 프로그램을 설치한다.

주의 : DCom connector은 SAP 640 이전버전에서 정상 작동한다.

 

프로그램을 설치하면 다음과 같은 메뉴가 생성된다.

 

 

메뉴 중 SAP DCOM Connector를 선택한다.

 

 

DCom을 생성하기 위해서는 실행된 프로그램의 왼쪽 트리에 있는 Object Bulider를 선택한다.

 

 



이제 DCom을 생성할 Function 이 있는 SAP 에 접속할 것이다.

실행된 프로그램의 오른쪽 화면을 보면 "Lonon... " 이라는 버튼이 보인다.

 

SAP 에 접속하는 Destination, Client, User, Password, Language를 입력하여 Log On 한다.


로그온에 성공하면



LogOn 버튼이 사라지고 Connected To : 내용에 접속된 서버 이름이 표시된다.

 

RFC 통신용 DCom을 생성해야 하기 때문에 아래 부분 라이도 버튼에 RFC Functions을 선택한다.

 



DCom 으로 작성할 Function 이름을 All 라이도 버튼을 선택하여 OK 버튼을 눌러 찾는다.

Function을 찾으면 아래와 같이 리스트에 찾은 Function 이름이 표시된다.





Add 버튼을 선택하여 왼쪽리스트 내용을 오른쪽리스트에 추가한다.

만약에 추가할 Function이 더 있으면 Select RFC Functions 버튼을 선택하여

 

위의 Function Dlg 창을 이용 선택 추가하면 된다.

 

처음 Function을 추가할때 ADD 버튼을 누르면 Dcom으로 생성할 Class 이름을 넣어야 한다.

 

Class 이름은 생성한 Dll 이름이 되기때문에 작성할때 유의하여 작성해야한다.

이제 나머지 빈공간에 이름을 넣으면 된다.

 


C++ Project : 생성할 프로젝트 이름

Target Dll : Project 이름을 넣으면 자동으로 입력

Namespace : Dll을 생성하면 Function의 위치가 저장되게 되는데 기본적으로 접속한 서버 이름으로 설정

MTS Package : DCom을 생성방법 선택 "SAP R/3 DCom Connector Object Builder" 선택

이제 마지막 단계로


 이제 "Buildd Component Dll" 버튼을 선택한다.

 

지정된 폴터에 Dll 이 생성되었음을 확인하고

 

생성된 DLL을 사용할 서버의 구성요소 서버스에 등록하면 끝..

 

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

실행창에서 윈격데스크탑 열기

실행창에서 원격데스크탑 열기

 

Console 모드로 열면 PC에서 직접 실행한 화면으로 작업이 가능

 

"IP" : 이곳에 연결하고자 하는 서버의 IP 입력

 

mstsc /v: "IP" /console

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

작업 관리자 열기

Ctrl+Alt+Del 키를 눌렀을 경우 실행 되는

 

작업 관리자 창을 열어주는 명령은 "Taskmgr.exe"

 

이다. System32 폴더에서 cmd를 실행하고 바로 실행하면 OK

출처 : Tong - 공원님의 ┣ ★ 알아두면 편리한 것통

sql Injection 처리

특정 문자를 검색하여 SQL에 치명적인 오류를 발생하는 문자일 경우

사용을 금지한다.

 

function checkSqlInjection(strData)

   dim CheckArray

   dim Checkdata

   CheckArray = Array("'or", "' or", "or'", "or '", "like'", "like '", "union ", " from ", "delete ", "insert ", "update ", "select ", "xp_cmdshell", "exec ", "master")

   checkSqlInjection="Y"

   for i=0 to ubound(CheckArray )

       Checkdata=0

       Checkdata=instr(strData, CheckArray(i))

       if CheckData>0 then

           checkSqlInjection = "N"

           exit function

       end if

   next

end function

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

web 에서 DB 입력 특수문자 처리

Web 에서 DB로 insert 할때 특수 문자 오류가 발생하는 경우가 많다.

 

그래서 기본적인 특수 문자는 변환하여 입력한다.

 

 Function ConvertChar(strValue)

   strValue = trim(strValue)

   strValue = Replace(strValue, "&", "&")

   strValue = Replace(strValue, "<", "<")

   strValue = Replace(strValue, ">", ">")

   strValue = Replace(strValue, "'", "'")

   strValue = Replace(strValue, """", """)

   strValue = Replace(strValue, "|", "|")

   strValue = Replace(strValue, vbCrLf, "<br>")

   ConvertChar = strValue

End Function

<!-- 변경 -->

 

Function DeConvertChar(strValue)

   strValue = Replace(strValue, "&", "&")

   strValue = Replace(strValue, "<", "<")

   strValue = Replace(strValue, ">", ">")

   strValue = Replace(strValue, """, """")

   strValue = Replace(strValue, "'", "'")

   strValue = Replace(strValue, "|","|")

   strValue = Replace(strValue, "<br>",vbCrLf)

   DeConvertChar= strValue

End Function

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

parent 에 데이터 전송

parentpage.asp

 

<html>

<head>

<title>parentpage</title>

<script language="javascript" type="text/javascript">

<!--

   function callParentpage(nextdata)

   {

      if(nextdata == "")

        change.style.display = "";

      else

        change.style.display = "none";

   }

-->

</script>

</head>

<body>

   <div id=change style=postion:absolute; display:none;">

     <br>

      보여라

   </div>

 <iframe id=childpage name=childpage src=child.asp width=100 height=100 marginwidth=0 marginheight=0 scrolling=auto></iframe>

</body>

</html>

 

child.asp

<html>

<head>

<title>child page</title>

<script language="javascript" type="text/javascript">

<!--

   function Senddata(nextdata)

   {

       parent.callParentpage(nextdata);

   }

-->

</script>

</head>

<body onload=javascript:Senddata("")>

새로운 창에서 호출

</body>

</html>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

include

#include file = "파일 경로/파일명"

 : 파일 전체를 화면에 표시한다.

Include 파일과 main 파일이 같은 딜렉토리 또는 하위 딜렉토리에 위치할때 사용한다.

 

 

#include virtual = "파일 경로/파일명"

 : 위 내용과 동일하나, 다른 딜렉토리 하위 딜렉토리가 아닌 곳에 파일이 위치할때 사용한다.

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

iframe 사용하기

iframe은 특정한 부분을 frame로 분리해서 전체 페이지 업로트 없이 iframe으로 정의된 페이지만

수정 변경하여 업데이트 할때 사용한다.

 

<%

 

%>

<script language="javascript" type="text/javascript">

<!--

   function update()

  {

      var sddata = "a";

      var sdstate = "b";

      poupdate.location.href = "./poupdate.asp?aaa="+sddata+"&bbb="+sdstate

  }

-->

</script>

 

 

<table width="500" border="0" cellspacing="0" cellpadding="0" style="cursor:hand; onclick="javascript:update();">

<tr>

<td> 여기는 업데이트 않함 </td>

<td> 여기는 이후에만 업데이트

<iframe id="po_tree" name="poupdate" src="./poupdate.asp" frameborder="0" width="300" height="200" marginwidth="0" marginheight="0" scrolling="auto"></iframe>

</td>

</tr>

</table>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

RSS 가져오기 (HTML 가져오기)

요구사항

RSS를 지원 싸이트

 

' XML 생성

set xml = CreateObject("Msxml2.ServerXMLHTTP.3.0")
xml.open "GET", "지원하는 싸이트 경로", false
xml.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xml.send
res1 = xml.status
res = xml.responsetext

 

' 한글 깨지는 것을 방지한다.

Set responseStrm = CreateObject("ADODB.Stream")
responseStrm.Open
responseStrm.Position = 0
responseStrm.Type = 1
responseStrm.Write xml.responseBody
responseStrm.Position = 0
responseStrm.Type = 2
responseStrm.Charset = "euc-kr"
resultStr = responseStrm.ReadText
responseStrm.close
Set responseStrm = Nothing
Set xml = Nothing

' 가져온 데이터 확인

Wscript.Echo "데이터 확인"

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

ASP Error Check

Set objError = Server.GetLastError

Dim ASPError_Number
Dim ASPError_Source
Dim ASPError_Category
Dim ASPError_File
Dim ASPError_Line
Dim ASPError_Column
Dim ASPError_Description
Dim sErrMsg, sQuery

ASPError_Number = Hex(objError.Number)
ASPError_Source = Server.HTMLEncode(objError.Source)
ASPError_Category = objError.Category
ASPError_File = objError.File
ASPError_Line = objError.Line
ASPError_Column = objError.Column
ASPError_Description = objError.Description

 

 

On Error Resume Next
Call Object

If Err.Number <> 0 Then
 Response.Write "오류내용 : " & err.Description
 Response.End
End if

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

ASP 이용 XML Load

XML형식으로 전달되는 데이터 받기

 

<%

   Dim myXml, serverURL, Xadd, strcondition

   DIM DayTemp(3)

 

   set myXml = CreateObject("Microsoft.XMLDCOM")   ' XML 변수선언

   myXml.async = false

   myXml.setProperty "ServerHTTPRequest", True ' HTTP 경로

   serverURL = http://www.google.co.kr/ ' XML 파일 경로

 

   myXml.Load(serverURL)

 

   if myXml.parseError.errorCode <> 0 then  ' 데이터 Loading 확인

       response.write("ERROR")

   else

       set Xadd = myXml.documentElement.selectSingleNode("//current_conditions")  ' //current_conditions 노드 데이터 얻기

       strcondition = Xadd.selectSingleNode("condition").Attributes(0).text

      

   for i = 1 to 3
      Set Xadd = myXml.documentElement.selectSingleNode("//forecast_conditions["&i&"]")  ' //forecast_conditions["&i&"] 노드가 여러개일경우
      DayTemp(i) = Xadd.selectSingleNode("day_of_week").Attributes(0).text
   Next

 

   set Xadd = nothing

   set myXml = Nothing

%>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

ActiveX 추가하기 (javascript)

ASP 에서 Activex를 사용하기 위해 Object 추가 필요

 

'** Object 생성

<OBJECT id=Actvie????? style="display;none"

codebase="CA?????.cab#version=1,0,0,1"

classid=clsid:F??????-????-????-????-??????????B VIEWASTEXT>

 

<PARAM NAME="_Version" VALUE="65536">

<PARAM NAME="_ExtentX" VALUE="2646"> '초기 Activex 위치

<PARAM NAME="_ExtentY" VALUE="2646">'초기 Activex 위치

<PARAM NAME="_StockProps" VALUE="0">


</OBJECT>

 

'** ActiveX에 파라미터를 넘긴다.

'** 각각의 파라미터는 정해진 형식으로 전송

<HTML>

<HEAD>

</HEAD>

<script language = "javascript">

function ActiveXShow()

{

      Actvie?????.setUrl = "www.????.com";

      Actvie?????.SetWindowRect("400", "4000");

      Actvie?????.Create();

}

</script>

<BODY Onload="javascript:ActiveXShow()" >
<P>Test</P>
<P>

</P>
</BODY>
</HTML>

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

VB Script DB 연결

VB Function으로 DB연결 관련된 내용을 구성하여 쉽게 dB 접근및 Query 전송 하기

 

'------------------- DBConnection.asp

 

<!--METADATA type="typelib" FILE="C:\program Files\Common Files\System\ado\msado15.dll"-->

 

Dim Conn

 

Function OpenDB()

     Dim SeverName, DatabaseName, strUserID, strUserPW

     SeverName = "DBIP:port"

     DatabaseName = "DBname"

     strUserID = "DBUser"

     strUserPW = "UserPW"

 

     Conn.ConnectionString = "provider=SQLOLEDB;Data Source=" & SeverName & ";Initial Catalog=" & DatabaseName & ";User Id=" & DBUser& ";Password=" & strUserPW

     Conn.ConnectionTimeout = 20
     Conn.Open
     Conn.BeginTrans()

End Function

 

Function CloseDB()

      If Conn.Errors.Count > 0 Then
               Conn.RollbackTrans()
      Else
               Conn.CommitTrans()
      End If

 

      If VarType(Conn) = vbString Then
              If Conn.state Then
                      Conn.Close
              End If
      End If

End Function

 

Function QuerySend(strConn, strQuery)

      Dim RecordSet

          On Error Resume Next

     Set RecordSet = Server.CreateObject("ADODB.RecordSet")
     RecordSet.Open strSql, strConn, 0, 1

     If RecordSet.bOF Or RecordSet.EOF Then
           dbQuery = ""
     Else
           dbQuery = RecordSet.GetRows
     End If

 

     RecordSet.Close
     Set RecordSet = Nothing

     If Err.number <> 0 Then
            Err.Clear

     End If

End Function

 

' ----------------------------- end

 

<!-- #include virtual="DBConnection.asp" //-->

 

<%

Dim rTData, strQuery, rRow

Call OpenDB()

setQuery = "Select *from Table"

rTData = QuerySend(Conn, strQuery)

 

Dim IndexLow, indexColl, nLow, nColl

nLow = UBound(rTData, 2)

nColl = UBound(rTData, 1)

 

Call CloseDB()


    if IsArray(rTData) Then

        for indexLow = 0 To nLow

            for indexColl = 0 To nColl

               Response.Write(RS_Tdata(indexColl, indexLow)

            NEXT

        NEXT

   End if

%>

 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

java script 이용 객체 hidden

단순하게 객체(버튼 또는 Text box 등)을 보기/않보이기 기능

 

<html>
<head>
<title> Text Box Hidden </title>

<script language="JavaScript" type="text/JavaScript">
  <!--
        function SelectChange(arg1)
       {
            var form = document.formSearch;
            if(arg1 < "2")
            { 
                form.I_Sinpt.style.visibility = 'visible';
             }
            else
            {
             form.I_Sinpt.style.visibility = 'hidden';
             }
        }
   //-->
</script>
</head>
<body>
   Text box 숨기기
   <table border="0" align="center" cellpadding="0" cellspacing="0">
   <form name="formSearch" method="post">
     <tr>
       <td width="80">
          <select name="I_Sflag" class="tbox" onChange = "SelectChange(this.value);">
            <option value="1" >하나</option>
            <option value="2" >둘</option>
            <option value="3" >셋</option>
          </select>
       </td>
       <td width="20">
          <input name="I_Sinpt" type="text" class="tbox" size="20" value="" onkeypress="enter()">      
       </td>
     </tr>
   </form>
   </table>
</body>
</html>

 

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

File Down 받기

Client로 파일을 다운 받는다.

 

ASP(VB)

 

<!-- METADATA TYPE="typelib" FILE="C:\program Files\Common Files\System\ado\msado15.dll" -->

 

      Dim objFile, filename

      filename = "text.txt"

 

      Set objFile = Server.CreateObject("ADODB.Recordset") '결과 레코드셋 생성 '

      Response.contentType = "application/unknown"

      Response.AddHeader "Content-Disposition", "attachment; filename=" & filename

      Response.CacheControl = "public"

      Response.Write("확인") ' 파일에 쓰기

      Response.Write(" " & vbcrlf) ' Enter 입력

      set objFile = Nothing

 

파일 다운로드 또는 Open 창을 띄워 Client가 Down 받을수 있도록 한다.

출처 : Tong - 공원님의 ┣ ★ 먹고사는일(Web)통

CreateTextFile 을 이용한 File 처리

Web에서는 Client로 파일이 저장되는 것을 기본적으로 금지하고 있다.

 

그래서 Server 에서 파일을 생성하여 그 파일을 다시 Client로 다운 받는 방식을 사용하는데

 

CreateTextFile을 이용하여 파일을 생성하는 것을 알아본다.

 

CreateTextFile는 FileSystemObject 객체에 정의되어 있다.

 

CreateTextFile는 파일을 생성하여 저장한다.

 

사용 방법 (ASP_vb)

 

      Dim fileObj, fileCon

      Dim filename filename = server.MapPath("/testfile1.txt")

      Set fileObj = CreateObject("Scripting.FileSystemObject")

      Set fileCon = fileObj.CreateTextFile(filename, true) ' 줄을 씁니다.

 

      if fileObj.fileExists(filename) Then        ' 파일 생성여부 확인

           fileCon.Write ("테스트") ' 파일을 닫습니다.

           fileCon.WriteBlankLines ("테스트") ' 파일을 닫습니다.

           fileCon.WriteLine ("테스트") ' 파일을 닫습니다.

           fileCon.Close

      else

           '생성실패

      end if

 

CreateTextFile("파일 이름", "덥어쓰기 여부", "Unicode여부:기본 ASCII")

mapPath : server의 Web 서비스 위치

Write : File에 쓴다.

WriteBlankLines : Line을 띄운다.

WriteLine : File에 한 라인을 쓴다.

 

2010년 2월 10일 수요일

TCHAR => char* 유니코드

유니코드 일때

 

TCHAR szFileName[MAX_PATH];

 

/// 길이

int nLengs = (wcslen(szFileName)+1)*2;

 

char* chrTemp[MAX_PATH];

 

WideCharToMultiByte(CP_ACP, 0, szFileName, -1, (LPSTR)chrTemp, nLengs, NULL, NULL);

 

**** 출처

http://angelgrd.egloos.com/2142788 

2010년 1월 29일 금요일

GetSysColor(int nValue)

정말 잘 잊어 버리는 System color

출처 : msdn

 

Value Meaning

COLOR_3DDKSHADOW
21

Dark shadow for three-dimensional display elements.

COLOR_3DFACE
15

Face color for three-dimensional display elements and for dialog box backgrounds.

COLOR_3DHIGHLIGHT
20

Highlight color for three-dimensional display elements (for edges facing the light source.)

COLOR_3DHILIGHT
20

Highlight color for three-dimensional display elements (for edges facing the light source.)

COLOR_3DLIGHT
22

Light color for three-dimensional display elements (for edges facing the light source.)

COLOR_3DSHADOW
16

Shadow color for three-dimensional display elements (for edges facing away from the light source).

COLOR_ACTIVEBORDER
10

Active window border.

COLOR_ACTIVECAPTION
2

Active window title bar.

Specifies the left side color in the color gradient of an active window's title bar if the gradient effect is enabled.

COLOR_APPWORKSPACE
12

Background color of multiple document interface (MDI) applications.

COLOR_BACKGROUND
1

Desktop.

COLOR_BTNFACE
15

Face color for three-dimensional display elements and for dialog box backgrounds.

COLOR_BTNHIGHLIGHT
20

Highlight color for three-dimensional display elements (for edges facing the light source.)

COLOR_BTNHILIGHT
20

Highlight color for three-dimensional display elements (for edges facing the light source.)

COLOR_BTNSHADOW
16

Shadow color for three-dimensional display elements (for edges facing away from the light source).

COLOR_BTNTEXT
18

Text on push buttons.

COLOR_CAPTIONTEXT
9

Text in caption, size box, and scroll bar arrow box.

COLOR_DESKTOP
1

Desktop.

COLOR_GRADIENTACTIVECAPTION
27

Right side color in the color gradient of an active window's title bar. COLOR_ACTIVECAPTION specifies the left side color. Use SPI_GETGRADIENTCAPTIONS with the SystemParametersInfo function to determine whether the gradient effect is enabled.

COLOR_GRADIENTINACTIVECAPTION
28

Right side color in the color gradient of an inactive window's title bar. COLOR_INACTIVECAPTION specifies the left side color.

COLOR_GRAYTEXT
17

Grayed (disabled) text. This color is set to 0 if the current display driver does not support a solid gray color.

COLOR_HIGHLIGHT
13

Item(s) selected in a control.

COLOR_HIGHLIGHTTEXT
14

Text of item(s) selected in a control.

COLOR_HOTLIGHT
26

Color for a hyperlink or hot-tracked item.

COLOR_INACTIVEBORDER
11

Inactive window border.

COLOR_INACTIVECAPTION
3

Inactive window caption.

Specifies the left side color in the color gradient of an inactive window's title bar if the gradient effect is enabled.

COLOR_INACTIVECAPTIONTEXT
19

Color of text in an inactive caption.

COLOR_INFOBK
24

Background color for tooltip controls.

COLOR_INFOTEXT
23

Text color for tooltip controls.

COLOR_MENU
4

Menu background.

COLOR_MENUHILIGHT
29

The color used to highlight menu items when the menu appears as a flat menu (see SystemParametersInfo). The highlighted menu item is outlined with COLOR_HIGHLIGHT.

Windows 2000:  This value is not supported.

COLOR_MENUBAR
30

The background color for the menu bar when menus appear as flat menus (see SystemParametersInfo). However, COLOR_MENU continues to specify the background color of the menu popup.

Windows 2000:  This value is not supported.

COLOR_MENUTEXT
7

Text in menus.

COLOR_SCROLLBAR
0

Scroll bar gray area.

COLOR_WINDOW
5

Window background.

COLOR_WINDOWFRAME
6

Window frame.

COLOR_WINDOWTEXT
8

Text in windows.

OnMouseLeave() 메시지 발생

OnMouseHover(UINT nFlags, CPoint point)

OnMouseLeave()

 

OnMouseMove(UINT nFlags, CPoint point) 함수에 TRACKMOUSEEVENT를 이용하여  Mouse Hover, Leave 등록하고 주기적으로 마우스의 위치를 확인 전달 한다.

 


void CUserClass::OnMouseMove(UINT nFlags, CPoint point)
{
 TRACKMOUSEEVENT tmev;
 tmev.cbSize = sizeof(tmev);
 tmev.hwndTrack = m_hWnd;
 tmev.dwFlags = TME_LEAVE|TME_HOVER;
 tmev.dwHoverTime = 1;
 TrackMouseEvent(&tmev);
 CButton::OnMouseMove(nFlags, point);
}