반응형

Name Mangling

프로그램에서 함수를 선언하거나 전역 변수 등을 선언 했을 때, 실제 생성되는 함수는 컴파일 단계에서 일정한 규칙을 가지고 변경되는데, 이를 네임 맹글링(Name Mangling)혹은 네임 데커레에션(Name Decoration)이라 부른다.

이러한 작업은 Linker가 다른 Scope에 있는 같은 이름의 함수와 변수에 대해 구별할 수 있도록 하는 요소이므로, Compiler 입장에서는 중요한 작업이다.


일반적으로 Compiler 는 함수에 대해서 그 함수의
이름과 함수의 파라미터 타입 그리고 Calling Convention등을 사용하여 그 이름을 만들어 내게 된다
.

이러한 네임 맹글링은 컴파일러 마다 다른 규칙을 가지게 된다
.

외부라이브러리를 링크하여 컴파일 할때 선언부만 포함하고 실 라이브러리를 포함하지 않으면 발생하는 에러에서 간혹 보게 되는
?TestFunc1@@YAXHPAH@Z와 같은 형태의 함수이름이 네임 맹글링된 함수의 이름이다
.

* C++
로 작성되는 프로그램에서 함수 앞에 붙이는 extern "C" 선언은 함수를 컴파일 할 때, 네임 맹글링을 하지 않고 함수이름만으로 네이밍 하도록 한다(즉 C type으로 함수명을 네이밍하게 된다).

아래의 예에서 extern "C"를 기술했을 경우와, 그렇지 않은 경우의 차이를 확인 할 수 있다.

 

 extern "C" __declspec(dllexport) void TestFunc( int x);

 

__declspec(dllexport) void TestFunc( int x);



* "UNDNAME" 유틸리티를 이용하여 네임 맹글링된 함수의 선언을 확인 할 수도 있다.

(이 유틸리티는 Visual Studio 설치폴더 C:\Program Files\Microsoft Visual Studio x.x\VC\bin 에서 찾을 수 있으며, 파일로 첨부한다.)

 

위에서 생성된 함수를 UNDNAME.exe를 이용해 데코레이션을 제거하면 예상대로 아래와 같이 표시된다.


 

* 이러한 이유 때문에 정적으로 링크하여 사용할 것이 아니라면
   - 즉,
   - LoadLibrary(), GetProcAddress()의 절차를 통해 함수포인터를 얻어 사용하거나,
   - 다른 언어로 작성된 Application에서 Dll을 로드하여 사용
할 용도의 Dll이라면 export되는 함수에 대해 함수의 export선언부에 
extern "C"를 붙여주거나 .def파일을 이용해서 네임맹글링이 적용되지 않도록 하여야 한다.

 

반응형
반응형

tdifw

TDI 드라이버의 훌륭한 샘플인 tdifw에 대한 정보입니다.

URL: http://sourceforge.net/projects/tdifw/
설명: Simple TDI-Based Open Source Personal Firewall for Windows NT4/2000/XP/2003
방식: TDI Hook Driver | TDI Filter Driver

 

 

반응형
반응형

Office2003에서 Office2007문서 열기

Office 2007이 출시되면서, 리본메뉴라는 새로운 타입의 툴바(?)가 나타났다.
그치만, 영 내 취향에는 맞지 않는 관계로,
설치후 1시간만에 내 컴퓨터에서 삭제되는 비운의 주인공이 됬다.

그치만 Office2003만 쓰기에는 나름의 애로사항이 있었으니,,,
2007
사용자가 늘어나면서 2007 포맷의 업무 문서들이 생겨난 것이다.
pptx, xlsx, docx ...
결구 2007을 다시 깔아야 하는가?

docx
파일을 2003으로 열려고 하니, Office 호환팩 사이트로 연결이 된다.
pptx
는 안되누만...

암튼 아래 링크에서 파일을 받아 설치하면 2003에서도 2007문서를 열어 볼수 있다는 말씀.~

http://www.microsoft.com/downloads/thankyou.aspx?familyId=941b3470-3ae9-4aee-8f43-c6bb74cd1466&displayLang=ko

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=941B3470-3AE9-4AEE-8F43-C6BB74CD1466

 

 

반응형
반응형

거절을 위한 10가지 충고

 

1. 싫은 것은 거절하라.

 

2. 짧고 분명하게 하라.

 

3. 정직하게 "NO" 하지 못하고 애매하게 말하는 것은 습관임을 알라.

 

4. 상대가 듣기 좋은 말로 위기를 넘기지 말라.

 

5. 본인에게 거절할 귄리가 있음을 알라.

 

6. 형습해 보라.(녹음기를 사용해서)

 

7. 거절할 문구들을 생각해 두라.

 

8. 남의 기분과 똑같이 내 기분도 생각하며 "NO" 하라

 

9. 순간의 거절을 하지 못하면 평생 후회할 수 있음을 알라.

 

10. 정직한 거절은 "Yes" 보다 홀륭한 때도 있다.

 

반응형
반응형

XP 탐색기에서 압축파일 표시 없애기

 

Windows XP에서 탐색기를 통해서 연 폴더에 압축폴더가 있는 경우,
해당 압축파일의 내용을 보여주려 쓸데없는 애를 쓴다
.
이로 인해 탐색기 내의 파일리스트 디스플레이 시간이 오래 걸리곤 하는데
..
다음과 같이 설정하면 뻘 짓을 하지 않는다
.

시작>실행>regsvr32 /u zipfldr.dll

 

반응형
반응형

Windows Mobile 전원 상태 감시

Windows Mobile의 경우, 장치의 특성상
일정 시간 입력이 없는 경우 suspend모드로 변경되는 경우가 잦게 일어 난다.

본 포스트에서는 특정 어플리케이션에서 전원상태의 변환을 감지하는 방법에 대해 기술한다.

주제의 핵심은
RequestPowerNotifications() 함수로 요약된다.
이 함수를 통해 전원의 변화 상태를 통지받겠다고 등록하면,
전원 상태가 변경될때마다, 통지를 해준다.
. 일반 윈도우 메시지 큐로 전달되는것이 아니라 별도의 윈도우 메시지 큐를 생성해야 한다.


// 전원변화상태통지를요청

BOOL RegisterPwNotify()

{

             m_nBufferSize = (MAX_PATH+sizeof(POWER_BROADCAST))*MAX_MESSAGES;

             m_pBuffer = new BYTE[m_nBufferSize];

             MSGQUEUEOPTIONS msgOptions = {0};

             msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);

             msgOptions.dwFlags = 0;

             msgOptions.dwMaxMessages = MAX_MESSAGES;

             msgOptions.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_PATH;

             msgOptions.bReadAccess = TRUE;

             m_hQueue = CreateMsgQueue(NULL, &msgOptions);

             if (! m_hQueue)

             {

                           MessageBox(g_hWnd, TEXT("Error: CreateMsgQueue"), TEXT("Error!"),

MB_OK|MB_APPLMODAL|MB_ICONSTOP);

 

                           return FALSE;

             }

 

             HANDLE hThread = CreateThread(0, 0, ThreadProc, 0, 0, 0);

             if (! hThread)

             {

                           MessageBox(g_hWnd, TEXT("Error: CreateThread"), TEXT("Error!"),

MB_OK|MB_APPLMODAL|MB_ICONSTOP);

 

                           return FALSE;

             }

 

             m_hRequest = ::RequestPowerNotifications(m_hQueue, POWER_NOTIFY_ALL);

             if (!m_hRequest)

             {

                           MessageBox(g_hWnd, TEXT("Error: RequestPowerNotifications"), TEXT("Error!"),

MB_OK|MB_APPLMODAL|MB_ICONSTOP);

                           return FALSE;

             }

             CloseHandle( hThread );

             return TRUE;

}

 

// Thread를통해위에서생성한메시지큐를감시한다.

void Run()

{

             TCHAR szChar[100];

 

             memset(m_pBuffer, 0, m_nBufferSize);

 

             DWORD dwReaded = 0;

 

             DWORD dwFlags = 0;

 

             while ( TRUE )

             {

                           memset(m_pBuffer, 0, m_nBufferSize);

                           DWORD dwReaded = 0;

                           DWORD dwFlags = 0;

                           if (::ReadMsgQueue(m_hQueue, m_pBuffer, m_nBufferSize, &dwReaded,

MAX_MESSAGES, &dwFlags))

                           {

                                        if (dwReaded >= sizeof(POWER_BROADCAST))

                                        {

                                                     WCHAR szCahr[256] = {0};

 

                                                     POWER_BROADCAST* pb = (POWER_BROADCAST*)m_pBuffer;

                                                     if ( pb->Message & PBT_POWERINFOCHANGE )

                                                     {

                                                                  wsprintf(szChar, L"msg=PBT_POWERINFOCHANGE");

                                                     }

                                                     else if ( pb->Message & PBT_POWERSTATUSCHANGE )

                                                     {

                                                                  wsprintf(szChar, L"msg=PBT_POWERINFOCHANGE");

                                                     }

                                                     else if ( pb->Message & PBT_POWERINFOCPBT_RESUMEHANGE )

                                                     {

                                                                  wsprintf(szChar, L"msg=PBT_RESUME");

                                                     }

                                                     else if ( pb->Message & PBT_TRANSITION )

                                                     {

                                                                  wsprintf(szChar, L"msg=PBT_TRANSITION");

                                                     }

 

                                                     if ( pb->Flags & POWER_STATE_BOOT )

                                                     {

                                                                  wsprintf(szChar, L"%s, flag=POWER_STATE_BOOT", szChar);

                                                     }

                                                     else if ( pb->Flags & PPOWER_STATE_CRITICALOWER_STATE_BOOT )

                                                     {

                                                                  wsprintf(szChar, L"%s, flag=

PPOWER_STATE_CRITICALOWER_STATE_BOOT", szChar);

                                                     }

                                                     else if ( pb->Flags & POWER_STATE_IDLE )

                                                     {

                                                                  wsprintf(szChar, L"%s, flag=POWER_STATE_IDLE", szChar);

                                                     }

                                                     else if ( pb->Flags & POWER_STATE_ON )

                                                     {

                                                                  wsprintf(szChar, L"%s, flag=POWER_STATE_ON", szChar);

                                                     }

                                                     else if ( pb->Flags & POWER_STATE_OFF )

                                                     {

                                                                  wsprintf(szChar, L"%s, flag=POWER_STATE_OFF", szChar);

                                                     }

                                                     else if ( pb->Flags & POWER_STATE_RESET )

                                                     {

                                                                  wsprintf(szChar, L"%s, flag=POWER_STATE_RESET", szChar);

                                                     }

                                                     else if ( pb->Flags & POWER_STATE_SUSPEND )

                                                     {

                                                                  wsprintf(szChar, L"%s, flag=POWER_STATE_SUSPEND",

szChar);

                                                     }

                                                     if ( pb->Message&PBT_POWERINFOCHANGE )

                                                     {

                                                                  wsprintf(szChar, L"%s, SystemPowerState=", szChar);

                                                     }

                                                     else

                                                     {

                                                                  wsprintf(szChar, L"%s, SystemPowerState=%s", szChar,

pb->SystemPowerState);

                                                     }

                                                     MessageBox(g_hWnd, szChar, TEXT("test"),

MB_OK|MB_APPLMODAL|MB_ICONSTOP);

                                        }

                           }

             }

}

 

// 통지등록을제거한다.

BOOL UnRegisterPwNotify()

{

             if ( m_hQueue)

             {

                           CloseMsgQueue(m_hQueue);

                           m_hQueue = NULL;

             }

             if ( m_hRequest )

             {

                           StopPowerNotifications( m_hRequest );

                           m_hRequest = NULL;

             }

             return TRUE;

}

 

 

 

 

 

반응형

+ Recent posts