해더

#if !defined(_AFXDLL)
#include <crtdbg.h>
#if defined(DEBUG) | defined(_DEBUG)
#if !defined(DEBUG_NEW)
#define DEBUG_NEW new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif
#endif
#endif

시작하고 함수호출


    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

메모리 할당 순서 브레이크

_CrtSetBreakAlloc(숫자 할당순서);

_CrtIsMemoryBlock() 올바른 힙인지검사

//전역변수의 소멸자는. 릭 출력후 호출 하는듯



#define DEF_FUNC_NUM 10

template< typename T >
class A
{
    // T 클래스의 함수 포인터를 DEF_FUNC_NUM 수 만큼 저장할 배열
    int ( T :: * m_fpWork [ DEF_FUNC_NUM ] )( int, int );

    // 함수 포인터를 저장 함수
    void SetFunc( int iFuncPos, int ( T :: * fpWork )( int, int ) )
    {
        m_fpWork [ iFuncPos ] = fpWork;
    }

    //함수포인터를 사용 함수 (클래스의 함수 포인터는 클래스 내부에서만 사용가능)
    int RunFunc( int iFuncPos, int iValueA, int iValueB )
    {
        int iReturn = 0;
        // ( T *const ) this : 부모의 포인터를 자식의 포인터로 형변환
        iReturn = ( ( T *const ) this ->* m_fpWork [ iFuncPos ] )( iValueA, iValueB );
        return iReturn;
    }
};

//A<B>를 상속받은 B 클래스
class B : A < B >
{
    // 생성자에서 함수포인터에 함수를 넣어줌
    B()
    {
        // 저장
        SetFunc( 0, &B::FuncA );
        SetFunc( 1, &B::FuncB );
    }
    // 생성자에서 저장한 함수를 사용
    int AllRunFunc( int iValueA, int iValueB )
    {
        int iReturn = 0;
        // 사용
        iReturn += RunFunc( 0, iValueA, iValueB );
        iReturn += RunFunc( 1, iValueA, iValueB );
        return iReturn;
    }

    //저장하고 사용할 함수
    int FuncA( int iValueA, int iValueB )
    {
        return iValueA + iValueB;
    }
    int FuncB( int iValueA, int iValueB )
    {
        return iValueA - iValueB;
    }
};

 

내코드를 보고 간추리면서 작성한코드라 test는 해보지 않았다
(내코드는 잘돌아간다)

간략 설며을 붙이자면
A클래스는 부모클래스로서
자식클래스의 함수를 사용하고 싶고
버츄얼 함수로 작성해도 돼지만
그렇다면 함수 추가시
부모쪽에도 함수를 추가해 주어야하는
불편함에 함수포인터 배열로 관리하였다

이해를 돕기위해 배열을 사용하였으며
부모쪽에서 함수포인터를 동적할당하여 관리하여도 무방하다

참고로 내가 사용한 case는
network recv시 해더에 따른 함수를 호출할때 사용하였으며
A클래스는 network 기본 클래스이고
B클래스는 응용 프로그램을 조작하는 network 함수들을 작성하였다

* (클래스의 함수 포인터는 클래스 내부에서만 사용가능)
 ( this ->* m_fpWork )( iValueA, iValueB ); // <- 이런 방식으로 사용

* [ ->* ] 이건 하나의 연산자로 띄어쓰기 불가능: [ -> * ](X),[ ->* ](O)

워드에서써본당~

OLD 2010. 2. 2. 21:40


오홍홍~

워드에서 글이 써지는

이런 신기한 세상.~

ㅋㅋ

'OLD' 카테고리의 다른 글

vmware ububtu 네이버 나눔 코딩 글꼴  (0) 2009.07.18
Hello World~  (0) 2009.05.12


Iterator Pattern

Adapter Pattern

Tamplate Method

Factory Method

Singleton

Prototype

Builder

Absract Factory

Bridge Pattern

Strategy Pattern

Interpreter Pattern

Visitor Pattern

Facade Pattern

Mediator Pattern

Decorator Pattern

Composite

Flyweight Pattern

Command Pattern

State Pattern

Memento Pattern

Chain of Responsibility Pattern



네이버의 나눔 코딩 글꼬을 설치해서 쓰려하면
터미널에서

폰트의 계단 현상이 일어나는데


$sudo rm /etc/fonts/conf.d/29-language-selector-ko-kr.conf
한 후
$fc-cache -fv
를 하면 해결 되는군요

'OLD' 카테고리의 다른 글

워드에서써본당~  (0) 2010.02.02
Hello World~  (0) 2009.05.12


성능 평가시에 간단히 사용가능한 함수이다

1/1000 초단위 이지만 세밀하게 정확하진 않으니 적당히 쓰면 된다.

 

 

DWORD startTime GetTickCount();

작업들 ...

출력(GetTickCount()-startTime);

 

이런 식으로쓴다



원본글 주소 : http://www.tipssoft.com/bulletin/tb.php/FAQ/216
* 이 자료를 퍼 가셔서 타사이트나 블로그에 게재 시 출처를 명시해 주시기 바랍니다.
  본 사이트에 게재된 모든 내용 및 자료는 상업적인 용도로 이용할 수 없습니다.
 
이 자료들은 저희 사이트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하시면 좀더 편리하게 볼수 있습니다.
알짜배기 프로그램 받기 :  http://www.tipssoft.com/bulletin/tb.php/QnA/8406
 
 
ExitWindowsEx 함수를 사용하여 컴퓨터를 종료, 재시작, 로그아웃 시키는 방법은 매우 간단합니다.
이 함수의 첫번째 인자에 아래 나열된 값중에서 원하는 값을 조합해서 명시만 해주면 되기 때문입니다.
 
1. EWX_LOGOFF        : 사용중인 프로그램을 종료하고 시스템을 LOG OFF 시킨다.
2. EWX_POWEROFF   : 시스템을 종료하고 전원을 끊다.
3. EWX_REBOOT       : 시스템을 종료시킨 후 시스템을 재시작 한다.
4. EWX_SHUTDOWN   : 사용자가 시스템의 전원을 끌 수 있도록 시스템을 종료한다.
5. EWX_FORCE          : 강제로 프로세스를 종료시킨다.
 
이 함수를 사용할때 주의해야할 점은 윈도우즈 NT 계열(Windows NT, Windows 2000, Windows XP..)의
운영체제에서는 종료를 위해서 ExitWindowEx 함수를 사용하는 프로세스가 SE_SHUTDOWN_NAME
이라는 권한을 가지고 있어야 하기 때문에 해당 권한을 얻는 기능을 추가해주여야 한다는 것입니다.
( 윈도우즈 98, Me와 같은 운영체제에서는 권한이 필요 없습니다. )
따라서 ExitWindowsEx 함수를 호출하기 전에 먼저 운영체제의 버전을 체크하는 코드가 있어야 합니다.
 
 
// 현재 응용프로그램이 실행되고 있는 윈도우즈의 버전을 반환하도록 작성된 함수입니다.
// ------------------------------------------------------------------------------
// [ 반환값 : 의미 ]
//   -1 : 버전얻기 실패, 1 : Windows 95,  2 : Windows 98,  3 : Windows ME,  4 : Windows NT,
//    5 : Windows 2000,  6 : Windows XP

char GetOSVersionType()
{
    // 계산된 윈도우즈 버전을 저장할 변수
    char version = -1;
    // 윈도우즈 버전에 관련된 정보를 얻어올 변수
    OSVERSIONINFOEX osvi;
    // OSVERSIONINFOEX 구조체 값을 얻었는지 OSVERSIONINFO 구조체값을 얻었는지를
    // 구분할 변수 ( 0 이면, OSVERSIONINFO 구조체 정보를 얻었다는 뜻입니다. )
    BOOL version_ex_flag = 0;

    // 운영체제의 버전과 관련된 정보를 얻기 위해 구조체 변수를 초기화합니다.
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    // 현재 운영체제의 버전을 알수 없기 때문에 OSVERSIONINFOEX 속성으로 버전정보를 얻습니다.
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
 
    // GetVersionEx 함수를 사용하여 현재의 운영체제 정보를 얻습니다.
    // OSVERSIONINFOEX 값을 설정하고 호출했기 대문에 윈도우 NT 4.0 SP6 이상 및 그 이후 버전의
    //  윈도우가 아니라면 이 함수는 실패할 것입니다.
    if(!(version_ex_flag = GetVersionEx((OSVERSIONINFO *)&osvi))){
        // 윈도우즈 버전이 낮아서 OSVERSIONINFOEX 형식으로 값을 얻을수 없는 경우...
        // OSVERSIONINFO 형식으로 재설정하고 값을 얻습니다.
        osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
        if(!GetVersionEx((OSVERSIONINFO *)&osvi)) return -1;
    }
 
    // 얻어온 OSVERSIONINFOEX 구조체 변수의 값을 이용하여 버전을 구별합니다.
    switch(osvi.dwPlatformId){
        // NT 기술 기반의 운영체제인 경우
        case VER_PLATFORM_WIN32_NT:
            if(osvi.dwMajorVersion <= 4) version = 4;
            else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) version = 5;
            else if(version_ex_flag) version = 6;
            break;

        // 윈도우즈 9x 기반의 운영체제인 경우
        case VER_PLATFORM_WIN32_WINDOWS:
            if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) version = 1;
            else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) version = 2;
            else if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) version = 3;
            break;
    }
 
    return version;
}
 
// 현재 운영체제가 NT 계열인 경우, SE_SHUTDOWN_NAME 레벨의 권한 등급을
// 가지고 있어야 하기 때문에 아래의 함수를 이용하여 권한을 얻습니다.
char GetNtPrivilege()
{
    HANDLE h_token;
    TOKEN_PRIVILEGES privilege_info;
 
    // 현재 프로세스의 권한과 관련된 정보를 변경하기 위해 토큰정보를 엽니다.
    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
                                                    TOKEN_QUERY, &h_token)){
        // 권한과 관련된 정보 접근에 실패함..
        return 0;
    }
 
    // 현재 프로세스가 SE_SHUTDOWN_NAME 권한을 사용할수 있도록 설정한다.
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &privilege_info.Privileges[0].Luid);
    privilege_info.PrivilegeCount = 1;
    privilege_info.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
    // 지정한 값으로 권한을 조정한다.
    AdjustTokenPrivileges(h_token, FALSE, &privilege_info, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    if(GetLastError() != ERROR_SUCCESS){
        // 권한 조정에 실패한 경우...
        return 0;
    }
 
    return 1;
}
 
// 컴퓨터를 끌때 사용할 함수
void PowerOff()
{
    if(GetOSVersionType()) <= 3{
        // 현재 운영체제가 Windows 95, Windows 98, Windows ME 인 경우...
        ExitWindowsEx(EWX_LOGOFF | EWX_POWEROFF | EWX_SHUTDOWN, 0);
        ExitWindowsEx(EWX_FORCE, 0);
    } else if(GetNtPrivilege()){
        // 현재 운영체제가 Windows NT, Windows 2000, Windows XP 인 경우...
        ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);
    }
}
 

참좋은친구   08-08-21 17:28
위종료프로그램을 베이직으로만들려면 어뗗게코딩해야되는지요 베이직책에도 exitwindowsex함수로 종료시키는내용은 있는데 전혀안되더군요  아시는분은 베이직으로코딩해서 메일로보내주시면 5만원을 드리겟음니다 xp이고요 exitpro 와 아리를 쓰고있읍니다 즉 필요한것은종료시키는방법입니다
관리자   08-09-10 12:58
'ExitWindowsEx 를 사용하여 컴퓨터 종료하기' 예제가 있어 알려드립니다.

http://www.tipssoft.com/source/s_sub/sub_1/source1_9.html
관리자   09-02-16 14:24
위 예제코드에서 GetOSVersionType() 함수가 비스타 운영체제는 체크하지 못합니다. 따라서
비스타 운영체제를 체크하시려면 GetOSVersionType() 함수에서 스위치문 내용을 아래와 같이
수정하시면 됩니다.

    case VER_PLATFORM_WIN32_NT:
        if(osvi.dwMajorVersion <= 4) version = 4;
        else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) version = 5;
        else if(version_ex_flag){
            if(osvi.dwMajorVersion == 5) version = 6;  // XP
            else if(osvi.dwMajorVersion == 6) version = 7;  // 비스타...
        }
        break;

 

 

이글외의 관련글
윈도우즈 셧다운,리부팅,로그오프 관련 API 함수
.

'프로그래밍' 카테고리의 다른 글

D3DFont  (0) 2010.07.21
MFC 가 아닌경우 메모리 릭 검사  (0) 2010.06.25
템플릿 클래스 함수 포인터 배열 상속  (0) 2010.05.21
디자인 패턴 21종(23-2) 정리 .xlsx  (0) 2009.09.19
[MFC] DWORD GetTickCount(VOID)  (0) 2009.07.08

Hello World~

OLD 2009. 5. 12. 12:28


하이~
 새로 시작하는 군요

2~3년 쉬어 오던 블로그를 이번기회에 tistory에서 새로 시작 해보렵니다.

화이팅.!

'OLD' 카테고리의 다른 글

워드에서써본당~  (0) 2010.02.02
vmware ububtu 네이버 나눔 코딩 글꼴  (0) 2009.07.18