케이피's 불량블로그!

블로그 이미지

케이피

OOP, Debugging... 인생의 숙제들..... [블로그의 글을 맹신하면 곤란]

'MFC'에 해당되는 글 41건

제목 날짜
  • 비트 연산자2 2008.07.08
  • Serialize Tip 2008.07.03
  • Excel Automation 2008.06.10
  • CString::AllocSysString 2008.06.02
  • MFC 복사 붙여넣기! 2008.05.28
  • MFC 문자열 변환 2008.05.28
  • 링크 에러 2008.05.28
  • 젠장할 DLL... 2008.05.26
  • note 2008.05.20
  • 윈도우 메시지 후킹 2008.05.20

비트 연산자

잡다한 정보들(기타정보) 2008. 7. 8. 23:25

유닉스에서의 권한 코드(Read, Write, Execute) 같이 하나의 값으로 다중 플래그의 켜짐과 꺼짐을 표현할 수 있습니다. 이 글에서는 C에서의 내용을 바탕으로 Java에서의 활용 방법을 설명합니다.

비트 연산자에는 시프트 연산자를 제외하면 &(and), |(or), ^(xor), ~(비트 반전)의 4개 연산자가 존재합니다. 각각에 대해 살펴보면,

& 연산 : 양쪽 모두 1일 경우에만 1이라는 결과가 나옵니다.
| 연산 : 양쪽 모두 0일 경우에만 0이라는 결과가 나옵니다.
^ 연산 : |(or)와 비슷하지만 양쪽 모두 1일 경우에만 0이라는 결과가 나옵니다.
~ 연산 : 모든 비트를 반전시킵니다. 즉, 1의 보수를 의미합니다.
여기에서 설명한 연산자는 무부호(Unsigned) 정수에 대해서만 동작하게 됩니다. 때문에 정수 형태의 선언이 아닌 16비트 선언이 사용됩니다. 우선 각각의 플래그를 선언해 보도록 하겠습니다.

view plaincopy to clipboardprint?
public static final int FLAG_A = 0x01;  
public static final int FLAG_B = 0x02;  
public static final int FLAG_C = 0x04;  
public static final int FLAG_D = 0x08;  
public static final int FLAG_E = 0x10;  
public static final int FLAG_F = 0x20;  
public static final int FLAG_G = 0x40;  
public static final int FLAG_H = 0x80;  
public static final int FLAG_A = 0x01;
public static final int FLAG_B = 0x02;
public static final int FLAG_C = 0x04;
public static final int FLAG_D = 0x08;
public static final int FLAG_E = 0x10;
public static final int FLAG_F = 0x20;
public static final int FLAG_G = 0x40;
public static final int FLAG_H = 0x80;
 
다중 플래그 처리를 위해서는 1, 2, 4, 8과 같은 2진수 형식으로 증가되어야 합니다. 위에서 정의된 각 플래그 상수값을 2진수로 변환해 보면 다음과 같습니다.

view plaincopy to clipboardprint?
0x01 = 0000 0001 
0x02 = 0000 0010 
0x04 = 0000 0100 
0x08 = 0000 1000 
0x10 = 0001 0000 
0x20 = 0010 0000 
0x40 = 0100 0000 
0x80 = 1000 0000 
0x01 = 0000 0001
0x02 = 0000 0010
0x04 = 0000 0100
0x08 = 0000 1000
0x10 = 0001 0000
0x20 = 0010 0000
0x40 = 0100 0000
0x80 = 1000 0000
 
위 내용과 같이 각 플래그 상수간의 비트 중복이 없어야 합니다. 비트 연산을 하기 위한 필수 사항입니다. 각각의 상수를 비트 연산 한다고 하면 2진수의 각 자리마다 논리 연산을 수행해 준다는 의미입니다.

FLAG_A와 FLAG_D를 |(or) 연산하면 아래와 같이 "0000 1001"이라는 FLAG_A와 FLAG_D가 동시에 표현된 값이 나옵니다.

view plaincopy to clipboardprint?
0000 0001 
0000 1000 
---------  
0000 1001 // FLAG_A | FLAG_D  
0000 0001
0000 1000
---------
0000 1001 // FLAG_A | FLAG_D
 
위에서 나온 "0000 1001"라는 값에 FLAG_D의 보수(1111 0111)를 &(and) 연산하면 "0000 0001"이라는 FLAG_D를 끈 값이 나옵니다.


view plaincopy to clipboardprint?
0000 1001 
1111 0111 
---------  
0000 0001 // FLAG_A & ~FLAG_D  
0000 1001
1111 0111
---------
0000 0001 // FLAG_A & ~FLAG_D
 
즉 다음과 같이 하나의 값에 복수의 플래그를 켜거나 끌 수 있습니다.

view plaincopy to clipboardprint?
int flag = 0x00; // 플래그 저장 변수  
flag |= FLAG_A;  // FLAG_A 켜기  
flag |= FLAG_D;  // FLAG_D 켜기  
flag &= ~FLAG_D; // FLAG_D 끄기  
int flag = 0x00; // 플래그 저장 변수
flag |= FLAG_A;  // FLAG_A 켜기
flag |= FLAG_D;  // FLAG_D 켜기
flag &= ~FLAG_D; // FLAG_D 끄기
 
그리고 아래와 같이 플래그가 켜져 있는지, 혹은 지정한 플래그들 외에 다른 플래그가 켜져있는지 검사하는 논리식이 가능합니다.

view plaincopy to clipboardprint?
if ((flag & FLAG_A) == FLAG_A) ; // FLAG_A 켜져 있음  
if ((flag & ~(FLAG_A | FLAG_B)) != 0x00) ; // FLAG_A, FLAG_B 외에 다른 플래그 켜져 있음  
if ((flag & FLAG_A) == FLAG_A) ; // FLAG_A 켜져 있음
if ((flag & ~(FLAG_A | FLAG_B)) != 0x00) ; // FLAG_A, FLAG_B 외에 다른 플래그 켜져 있음
 
각각의 논리식은 2진수 변환 상태에서 &(and), |(or), ~(비트 반전)의 연산을 따라해 보면 확실히 이해할 수 있습니다.

Posted by 케이피

Serialize Tip

잡다한 정보들(기타정보) 2008. 7. 3. 22:45

void CMyClass::Serialize(CArchive &ar)
{
 m_lVersion = 1;

 if (ar.IsStoring())
 {  
  ar << m_lVersion;
  ar << m_sStyleCD;
  ar << m_sStyleNM;
  ar << m_nDispType;
  ar << m_nTxtCnt;
  ar << m_sDispFormat;
 }
 else
 {
  ar >> m_lVersion;
  ar >> m_sStyleCD;
  ar >> m_sStyleNM;
  ar >> m_nDispType;
  ar >> m_nTxtCnt;
  ar >> m_sDispFormat;
 }
}

개발도중 m_nDispType 이 String 형태로 바뀌었다...
당연히 바뀌기 전 파일을 읽을 수 없다...

void CClass::Serialize(CArchive &ar)
{
 m_lVersion = 1;

 if (ar.IsStoring())
 {  
  ar << m_lVersion;
  ar << m_sStyleCD;
  ar << m_sStyleNM;
 
  // 저장시에는 새로운 데이터형으로 저장
  ar << m_sDispType;

 
  ar << m_nTxtCnt;
  ar << m_sDispFormat;
 }
 else
 {
  ar >> m_lVersion;
  ar >> m_sStyleCD;
  ar >> m_sStyleNM;
 
  int i;
  ar >> i;
 
//  ar >> m_nDispType;
  ar >> m_nTxtCnt;
  ar >> m_sDispFormat;
 }
}

이런식으로 일단 로드 해서 다시 저장(잃는 정보는 생기겠지만...)
하튼간에 이전 파일을 사용할 수 는 있지...

Posted by 케이피

Excel Automation

잡다한 정보들(기타정보) 2008. 6. 10. 23:30

젠장할 개똥같은 노가다 Excel 같으니...

* 셀 서식 - 텍스트
Range::SetNumberFormatLocal(COleVariant("@"));
* 셀 서식 - 1000 의 자리마다 , 찍기!!!
Range::SetNumberFormatLocal(COleVariant("#,##0_ ")); 

* 정렬 (히밤 대체 무슨 생각으로 이런식으로 한걸까? -_-;)
// 좌 : -4131, 가운데 : -4108, 우 : -4152
Range::SetVerticalAlignment(COleVariant((short)-4108));
Range::SetHorizontalAlignment(COleVariant((short)-4152));

* 셀 테두리
border 사용 - 보면 안다.

* 셀 색
Interior 사용 - 보면 안다.

* 그림 삽입 및 크기 설정 - 안해봐서 할말 없다.
objShapes = sheet.GetShapes();
objShape = objShapes.AddPicture(strPictureName, // FileName
      (long)0,              // LinkToFile
      (long)-1,              // SaveWithDocument
      (float)left,
      (float)top,
      (float)width,
      (float)height);

objShape.SetWidth((float)width);
objShape.SetHeight((float)height);

* Sheet 추가

Worksheets   sheets;     ///< 엑셀의 Worksheets 객체
_Worksheet   sheet;      ///< 엑셀의 _Worksheet 객체
LPCTSTR     strTitle;                 // 설정한 Sheet 명

// sheet를 현재 존재하는 제일 마지막 sheet로 선택해두고...

COleVariant varOption((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
VARIANT     varValue;
V_VT      (&varValue) = VT_DISPATCH;
V_DISPATCH(&varValue) = (LPDISPATCH)sheet;
sheet = sheets.Add(varOption, varValue, varOption, varOption);
sheet.SetName(strTitle);

... 이렇게 하면 맨 마지막 다음에 Sheet가 생김...

* Excel Automation 을 Thread 에서 사용시...
CoInitialize(NULL);
CoUninitialize();


엑셀 매크로 이용하기
1. 엑셀 실행

2. 하고픈 일을 매크로를 켜놓고 한다.

3. 다되었으면 매크로를 종료하고 편집을 눌러 매크로 소스를 본다.

이렇게 하면 힌트는 얻을수있다...
히밤 근데 막장인 나는 COleVariant 변수가 너무 어렵단말이다!

Posted by 케이피

CString::AllocSysString

잡다한 정보들(기타정보) 2008. 6. 2. 00:45

CString::AllocSysString

BSTR AllocSysString ( ) const;
throw( CMemoryException );

Return Value

Points to the newly allocated string.

Remarks

Allocates a new OLE Automation–compatible string of the type BSTR and copies the contents of the CString object into it, including the terminating null character. A CMemoryException is thrown if insufficient memory exists. This function is normally used to return strings for OLE Automation.

Use ::SysFreeString in the rare case that you need to deallocate the returned string.

Note   You must link with MFCO42D.DLL to obtain this function if you are using MFC in a shared library and building in debug mode. You can cause the linker to get MFCO42D.DLL automatically by including <afxdisp.h> in your STDAFX.H file.

For more information about OLE allocation functions in Windows, see::SysAllocString and::SysFreeString in the Win32 SDK OLE Programmer’s Reference.

Example

CString str("Hockey is Best!");
BSTR bstr = str.AllocSysString();

// bstr now contains "Hockey is best", and can be
// passed to any OLE function requiring a BSTR.
// Normally, the function receiving the BSTR will
// free the string when it is done using it.

CString Overview |  Class Members |  Hierarchy Chart

See Also   ::SysAllocString,::SysFreeString, CMemoryException

Posted by 케이피

MFC 복사 붙여넣기!

잡다한 정보들(기타정보) 2008. 5. 28. 23:52

Ctrl+C, Ctrl+V

PreTranslateMessage

/*   // Copy
  case 'C':
   if (GetKeyState(VK_CONTROL) & 0x80000000)
   {
    CWnd * pCtrl = GetFocus();
    if ( pCtrl->IsKindOf(RUNTIME_CLASS(CTreeListEdit)) || pCtrl->IsKindOf(RUNTIME_CLASS(CEdit)) )
    {
     pCtrl->SendMessage(WM_COPY, pMsg->wParam, pMsg->lParam);
     return TRUE;
    }
   }
   break;

   // Paste
  case 'V':
   if (GetKeyState(VK_CONTROL) & 0x80000000)
   {
    CWnd * pCtrl = GetFocus();
    if ( pCtrl->IsKindOf(RUNTIME_CLASS(CTreeListEdit)) || pCtrl->IsKindOf(RUNTIME_CLASS(CEdit)) )
    {
     pCtrl->SendMessage(WM_PASTE, pMsg->wParam, pMsg->lParam);
     return TRUE;
    }
   }
   break;
*/

Posted by 케이피

MFC 문자열 변환

잡다한 정보들(기타정보) 2008. 5. 28. 23:50
OLECHAR FAR* sz == CStirng::AllocSysString();
Posted by 케이피

링크 에러

잡다한 정보들(기타정보) 2008. 5. 28. 23:47

error LNK2001: unresolved external symbol

 - header file만 include하고 관련 라이브러리를 링크 시켜주지 않았기 때문이다.
라이브러리를 링크시키지 못하였기 때문에 해당 라이브러리에 포함된 함수를 사용하면 찾지 못하였다는 에러가 발생한다.

 A: 프로젝트의 Setting 에서 관련 라이브러리를 등록하거나, #pragma comment(lib, "name")를 하여 컴파일

Posted by 케이피

젠장할 DLL...

잡다한 정보들(기타정보) 2008. 5. 26. 00:26

확장 MFC DLL의 경우

Class는 AFX_EXT_CLASS 를 써주면 돼지만...

함수는 .def 파일 EXPORTS 부분에 추가해주어야 해!!!
Func @1

Posted by 케이피

note

잡다한 정보들(기타정보) 2008. 5. 20. 01:23

$# Document 클래스의 포인터 얻기...
CMainFrame* pMfrm = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CMyDoc* pDoc = (CMyDoc*)pMfrm->GetActiveView()->GetDocument();

$ 추가를 계속하면 51번째 데이터부터(1154) 메인데이터가 아무것도 안들어감
    데이터 자체는 들어가는데 상세보기하면 아무것도 없다~ 로드를 못하고있다...
 1154 ~ 1177 사이에 뭔가 있다.. 1154~1162 사이의 문제... 읽지를 못한다..
# 위치가 문제가 아니고 안에 있는 값이 문제다... 1A 를 텍스트 모드로는 읽을수 없다
 바이너리로 읽어야해 난 바본가보다....
- 드래그해서 화면 밖에 드롭시킬때... #디버그시가 아니면 문제 없다...


 binary file을 CStdioFile class 의 Read()와 ReadString() 함수를 이용해서 읽었는데,
파일 끝까지 읽어지지 않아서 디버깅해보니 읽다가 Hex값으로 '1A'를 만나면 읽기가 중단됩니다.
ASCII 표 찾아보니 ctrl+z, SUB 라고 나와있는데 이것 때문에 중단된 것이 맞나요?
그렇다면 파일을 끝까지 한 번에 읽으려면 어떤 클래스의 함수를 이용해야 하나요?
도움 부탁드리겠습니다


# 파일을 읽을때 바이너리로 읽어랏!!!!!!!!!

Posted by 케이피

윈도우 메시지 후킹

귀찮아...(유용링크) 2008. 5. 20. 01:23

윈도우 메시지 후킹

http://blog.naver.com/leejisun9?Redirect=Log&logNo=150005006318

Posted by 케이피
이전페이지 다음페이지
블로그 이미지

OOP, Debugging... 인생의 숙제들..... [블로그의 글을 맹신하면 곤란]

by 케이피

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

  • OOP
  • 안드로이드
  • vs2008
  • trace
  • Automation
  • debugging
  • dbgView
  • 객체지향
  • IME
  • CView
  • 최적화?
  • XML
  • LPCSTR
  • excel
  • Mentor
  • MFC
  • 8강전
  • JAVA 맛보기
  • 유로2008 일정
  • bug
  • CNN
  • MFC Tip
  • SmartClient
  • c#
  • activex
  • DLL
  • 최강 볼걸
  • 엠마스톤
  • Emma Stone
  • CString

글 보관함

«   2025/07   »
일 월 화 수 목 금 토
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

링크

카테고리

전체보기 (98)
Qt의 오묘함 (1)
영양가없는이야기(개인사) (1)
주체못할파괴본능(디버그) (5)
넌왜C++을C처럼쓰냐?(OOP) (2)
잡다한 정보들(기타정보) (53)
귀찮아...(유용링크) (13)
참 잼난다(취미) (6)
JAVA 의 향기~(자바) (2)
코딩을부탁해(Rapid Coding) (0)
베스트똘추짓(개고생리스트) (11)
매운핫소스(허접소스) (1)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
케이피's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

케이피's 불량블로그!

OOP, Debugging... 인생의 숙제들..... [블로그의 글을 맹신하면 곤란]

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 전체보기 (98)
    • Qt의 오묘함 (1)
    • 영양가없는이야기(개인사) (1)
    • 주체못할파괴본능(디버그) (5)
    • 넌왜C++을C처럼쓰냐?(OOP) (2)
    • 잡다한 정보들(기타정보) (53)
    • 귀찮아...(유용링크) (13)
    • 참 잼난다(취미) (6)
    • JAVA 의 향기~(자바) (2)
    • 코딩을부탁해(Rapid Coding) (0)
    • 베스트똘추짓(개고생리스트) (11)
    • 매운핫소스(허접소스) (1)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바