GSI

해당 블로그 : http://blog.naver.com/kellio?Redirect=Log&logNo=45119872
감사 ^^


/*******************************
*  BSTR 변수에 스트링 넣기
*******************************/

BSTR  bstrTemp;
wchar_t tchar[] = L"hello world";
bstrTemp = SysAllocString(tchar);
SysFreeString(bstrTemp);
 
 // HRESULT Tempfunc(BSTR bstrArg);
Tempfunc(bstrTemp);


// BSTR의 길이 구하기

SysStringLen(bstrTemp) 함수를 이용한다~

/*****************************
* LPCTSTR to BSTR
*****************************/

LPCTSTR lpStr= _T("hello world");

BSTR bstrStr;
bstrStr = ((CString)lpStr).AllocSysString();

/*****************************
* BSTR to CString
*****************************/

CString bstrToCString(BSTR bstr)
{
   char* pbstr;
   USES_CONVERSION;  //convert를 위한 매크로
   pbstr=OLE2A(bstr);     //bstr을 char로 convert
   return CString(pbstr);
}

/*****************************
* _bstr_t to CComBSTR
*****************************/

_bstr_t bstrStr(_T("This is the test String!"));
CComBSTR bstrComStr;
bstrComStr.AppendBSTR(bstrStr);
ShowBSTR(bstrComStr);

BSTR CStringTobstr(CString str)
{
    return str.AllocSysString();    //CString을 bstr로 convert
}

[bstr-> char*]

BSTR inputdata;
char *pbstr;
pbstr=OLE2A(inputdata);

[char* -> bstr]

TCHAR szTitle[ 512 ];
_bstr_t bstrText = szTitle;
*bstrTitle = bstrText.copy();

/*******************************
* CString to CComVariant
*******************************/

 CComVariant out(str.AllocSysString());  or  CComVariant out(str);

----------- VARIANT 구조체 사용예 ----------

VARIANT vVal;
VariantInit(&vVal); //초기화
vVal.vt = VT_BOOL;
vVal.boolVal = TRUE;

---------- BSTR 사용예 --------------

1) BSTR m_pStr;
m_pStr = L"Hello CodeIn"; // 문자의 개수가 지정되지 않음

2) wchar_t Example[] = L"String";
BSTR m_pStr = SysAllocString(Example); // BSTR 문자열 영역확보

//..

SysFreeString(m_pStr); // BSTR 문자열 영역 해제

Posted by gsi
:

1. HelloWorld라는걸 노출해줘야 다른 작업이 있는건지 궁금합니다.

           -> 메소드에 [WebMethod] 어트리뷰트를 설정해주는걸로 웹서비스 메소드로의 노출 작업은 완료된상태입니다.

 

2. 웹 서비스를 준비 하는 저의 입장에서 저희 서비스에만 사용하는 형태로 할건데요.

   고려사항이 어떤게 있을지 궁금합니다. 아울러 조금이라도 조언을 해주셨으면 좋겠습니다.

           -> 저희 서비스만 사용하는 형태로고 함은 이 public하게 노출된 웹서비스를 특정 시스템에서는 사용하게 하고프신 것 같은데요.

           웹서비스의 보안은 크게 3단계로 구분할 수 있는데요..

          

첫번째, IIS영역에서 요청(접근)을 제한하는 방법입니다. 웹서비스를 서비스하고 있는 웹 사이트의 IP 접근 제한을 하시면 되구요..

           접근하려는 시스템의 IP만을 접근 허용으로 해주시면 될 듯 합니다.

          

           두번째, 접근 하려는 웹메소드에서 호출하는 사용자를 식별하는 방법이 있습니다. 자세히 설명하기는 힘들지만 메소드를 호출할때

SoapHeader에 사용자 인증 정보를 담아 호출하여 메소드 실행직전에 인증정보가 유효한지를 확인합니다.

 

세번째, 네트워크를 통해 전송되는 웹서비스 결과를 모두 암호화 하여 데이
터에 대한 보안을 설정하실 수 있습니다.

 

각 자세한 방법은 인터넷이나 책을 통해 찾아보시면 될 것 같습니다.

 

3. 인터넷 정보 서비스의 ASP.NET 1.0.**, 2.0.*** 두개가 나오게 되는데요. 웹 서비스를 net 2.0으로 제작할 때

   ASP.NET 2.0.*** 을 사용하는데요 이것으로 해야 되는건지도 궁금합니다.

-> 네 닷넷 프레임워크의 1.1 2.0은 전혀 다른 런타임입니다. 하여 반드시 버전을 정확히 선택해줘야지만 올바른 실행이 가능합니다.


>>>

결과적으로 http:post 형태의 프로토콜을 지원 하기 위해서는 web.config 에 프로토콜을 추가해 주어야 합니다. 기본이 soap 형태만 지원하기 때문에...

<protocols>
   <add name="httpPost"/>
   <add name="httpGet"/>
   <remove name="httpPost/>
   <remove name="httpGet/>
</protocols>

Posted by gsi
:

DC 내용 복사해서 다른 곳의 DC에 적용하기

내용 구현 :

Flicker Free Code 사용한 클래스 의 이름을 CMemDC 라고 하겠습니다.
해당 코드는 위에 있습니다.

우선 CMemDC로 선언한 변수에 현재 화면에 그려진 DC를 적용시켜 줍니다.
m_pTestFormDlg->m_pParentMemDC = new CMemDC(pDC, &rect);

해당 pDC와 화면 영역 값을 넘겨 주면서 생성해 줍니다.
원래 이 부분의 rect는 제가 집어 넣은 겁니다. 안해주면 내부에서 GetClipRect()로 값을
구해서 적용하게 되어 있습니다.

DC와 같이 적용된 CMemDC 쪽에 BitBlt를 사용해서 해당 DC의 내용을 그립니다.
m_pTestFormDlg->m_pParentMemDC->BitBlt(
   0, 0, rect.Width(), rect.Height(), pDC, 0, 0, SRCCOPY);

이제 이 DC를 다른 곳에서 BitBlt를 해서 사용하시면 됩니다.
pdc->BitBlt(0, 0, 850, 666, m_pParentMemDC, 0, 0, SRCCOPY);

이상. ^^

Posted by gsi
:

void CChildView::SaveBitmapToDirectFile(CDC* pDC, CRect BitmapSize, int BitCount, CString strFilePath)
{
 CBitmap bmp, *pOldBmp;
 CDC dcMem; 
 BITMAP                  bm;
 BITMAPINFOHEADER        bi;
 LPBITMAPINFOHEADER      lpbi;
 DWORD                   dwLen;
 HANDLE                  handle;
 HANDLE                  hDIB;  
 HPALETTE                hPal=NULL;

 /*----- CDC의 내용을 Bitmap으로 전송 ----*/
 dcMem.CreateCompatibleDC(pDC);
 bmp.CreateCompatibleBitmap(pDC ,BitmapSize.Width(),BitmapSize.Height());   
 pOldBmp = (CBitmap*) dcMem.SelectObject(&bmp);
 dcMem.BitBlt( 0,0, BitmapSize.Width(), BitmapSize.Height(), pDC, 0,0, SRCCOPY);
 dcMem.SelectObject(pOldBmp);

 if (strFilePath == "")          return;
 /*------------------------- 비트멥 헤더를 기록함 -------------------------*/
 if (hPal==NULL)
  hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
 GetObject(HBITMAP(bmp), sizeof(BITMAP), &bm);

 bi.biSize               = sizeof(BITMAPINFOHEADER);
 bi.biWidth              = bm.bmWidth;
 bi.biHeight             = bm.bmHeight;
 bi.biPlanes             = 1;
 bi.biBitCount           = 32;      
 bi.biCompression        = BI_RGB;
 bi.biSizeImage          = bm.bmWidth * bm.bmHeight * 3;
 bi.biXPelsPerMeter      = 0;
 bi.biYPelsPerMeter      = 0;
 bi.biClrUsed            = 0;
 bi.biClrImportant       = 0;

 int nColors = (1 << bi.biBitCount);
 if( nColors > 256 )
  nColors = 0;
 dwLen  = bi.biSize + nColors * sizeof(RGBQUAD);
 hPal = SelectPalette(pDC->GetSafeHdc(),hPal,FALSE);
 RealizePalette(pDC->GetSafeHdc());
 hDIB = GlobalAlloc(GMEM_FIXED,dwLen);
 lpbi = (LPBITMAPINFOHEADER)hDIB;
 *lpbi = bi;
 GetDIBits(pDC->GetSafeHdc(),
  HBITMAP(bmp),
  0,
  (DWORD)bi.biHeight,
  (LPBYTE)NULL,
  (LPBITMAPINFO)lpbi,
  (DWORD)DIB_RGB_COLORS);
 bi = *lpbi;
 if (bi.biSizeImage == 0)
 {
  bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
   * bi.biHeight;
 }
 dwLen += bi.biSizeImage;
 if (handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE))
  hDIB = handle;

 lpbi = (LPBITMAPINFOHEADER)hDIB;
 GetDIBits(pDC->GetSafeHdc(),
  HBITMAP(bmp),
  0,                   
  (DWORD)bi.biHeight,     
  (LPBYTE)lpbi       
  + (bi.biSize + nColors * sizeof(RGBQUAD)),
  (LPBITMAPINFO)lpbi,  
  (DWORD)DIB_RGB_COLORS);

 BITMAPFILEHEADER      hdr;
 hdr.bfType        = ((WORD) ('M' << 8) | 'B');       
 hdr.bfSize        = GlobalSize (hDIB) + sizeof(hdr);  
 hdr.bfReserved1   = 0;                                
 hdr.bfReserved2   = 0;                                
 hdr.bfOffBits=(DWORD)(sizeof(hdr)+lpbi->biSize + nColors * sizeof(RGBQUAD));
 char* pBmpBuf;
 DWORD FileSize;
 FileSize=sizeof(hdr)+GlobalSize(hDIB);
 pBmpBuf = new char[FileSize];
 memcpy(pBmpBuf,&hdr,sizeof(hdr));
 memcpy(pBmpBuf+sizeof(hdr),lpbi,GlobalSize(hDIB));
 /*--------------------- 실제 파일에 기록함 --------------------------*/
 CFile file;
 file.Open(strFilePath, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite);
 file.Write(pBmpBuf,FileSize);
 file.Close();
 /*------------------------ 임시로 할당한 메모리를 해제.. -------------*/
 delete[] pBmpBuf;

 if(hDIB)
 {      
  GlobalFree(hDIB);
 }
 SelectPalette(pDC->GetSafeHdc(),hPal,FALSE);   
}

Posted by gsi
:

CScrollView를 사용해서 화면을 처리 하다 보면 셀 단위의 뷰를구현할때 즉, 화면이 일정 범위의 간격을 두고 움직이고자 할때 스크롤 바를 움직이면 한픽셀씩 움직이지 않고 한 단위씩 움직이도록 하고자 할때가 있다. 이때는 OnVScroll()를 오버라이드 한다.

void CColorPlayScrollView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 UINT newpos = 0;
 switch(nSBCode) {
  case SB_LINEUP:
  case SB_LINEDOWN:
  case SB_PAGEUP:
  case SB_PAGEDOWN:
  case SB_THUMBPOSITION:
  case SB_THUMBTRACK:
  case SB_TOP:
  case SB_BOTTOM:
  case SB_ENDSCROLL:
   {
    if(nPos%30 == 0) {
//     SetScrollPos(SB_VERT,nPos,TRUE);
     CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
   }
   break;
 }

// SetScrollPos(SB_VERT,newpos,TRUE);

// CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

여기서 모든 메시지를 가져와서 해당 값이 되었을때만 호출하도록 처리 해봤습니다.
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
이 함수를 호출하면 화면이 이동 되도록 해봤습니다. 결과는 아래와 같아요.^^

사용자 삽입 이미지

Posted by gsi
: