시스템에서 드라이브 추가 혹은 제거되었을 때를 자동으로 감시하는 코드

출처 : http://www.codeproject.com/useritems/Drive_Detect.asp

시스템에서 플로피/하드/CD-ROM/이동 드라이브가 추가 혹은 제거되었을 때를 자동으로 감시하는 코드입니다. 우선 헤더 파일을 프로젝트에 추가하여 줍니다.

#include <dbt.h>

아래의 메시지 핸들러를 추가합니다. 클래스 위저드를 통해서 추가할 수 없으니 수동으로 추가하여 주세요.

bool inline IsBitSet (DWORD64 dwMask, UINT nTHBit)
{
DWORD64 dwBit = 1;
dwBit <<= nTHBit; dwMask &= dwBit; return dwMask ? true : false; } BOOL CT1Dlg::OnDeviceChange( UINT nEventType, DWORD dwData ) { BOOL bReturn = CWnd::OnDeviceChange (nEventType, dwData); DEV_BROADCAST_VOLUME *volume = (DEV_BROADCAST_VOLUME *)dwData; CString log; if (nEventType == DBT_DEVICEARRIVAL) { if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
for (int n = 0; n < 32; n++) { 

mutable 키워드

[CODE]class CTextBlock {
public:
std::size_t length() const;

private:
mutable std::size_t textlength;
mutable bool lengthIsValid;
}

std::size_t CTextBlock::length() const
{
if (!lengthIsValid) {
textLength = std::strlen(pText); // 문제 없습니다.
lengthIsValid = true; // 문제 없습니다.
}
}
[/CODE]
mutable는 비정적 데이터 멤버를 비트수준 상수성의 족쇄에서 풀어주는 키워드입니다

volatile 저장소

컴파일러의 최적화에 따라서는, 변수 N의 값을 다시 변수 N에 저장하는 대신 하나의 레지스터에 남겨 둘 수도 있다. 이런 문제를 컴파일러 최적화 옵션들을 변경하는 식으로 해결하는 것은 코드 전반의 성능에 나쁜 영향을 미칠 수 있다. 올바른 해법은 ANSI C의 volatile 저장소 한정사를 사용하는 것이다. volatile 한정사는 컴파일러에게 변수의 값이 언제라도 바뀔 수 있다고 알려주는 역할을 한다. 컴파일러는 volatile로 지정된 변수를 수정하면 그 값이 반드시 메모리에 저장되도록, 그리고 값을 읽을 때에는 반드시 메모리로부터 값을 가져 오는 식으로 코드를 생성한다.

pragma의 어원

이거 궁금하신 분들이 만으리라 생각됩니다.

유래가 Ada까지 거슬러 가는군요. (http://archive.adaic.com/standards/83rat/html/ratl-02-01.html)

pragma, 그리스어로 action 이라는 뜻이군요. 컴파일러에게 특별한 방법으로 action을 취하라는 프리프로세서와 유사한 녀석이죠^^

저의 의문 하나가 풀리는 순간입니다. [커닝헌 책에]

PP233, A12.8 Pragmas

실수형에서 정수형 형변환 성능 높이기

일반적으로 실수형에서 정수형으로 형변환을 하는 경우가 종종 있다. 이때 보통 묵시적으로 컴파일러가 알아서 해 줄수 있지만 이렇게 할 경우에 속도가 상당히 느리다. 한두번은 빠르게 느껴져도 이게 백만번, 천만번일 경우 형변환 부분에서 전체 함수의 90%까지 잡아먹을 수도 있다. 이럴경우 아래의 코드를 이용하여 성능을 30% 정도 끌어올릴 수 있다.

 

이때, 주의할 점은 아래의 함수를 이용한 경우 실수형은 반올림을 행한다는 것이다. 이 점을 주의하자~

 

우선 아래의 매크로를 선언한다.
#ifdef __BIGENDIAN__ 
#   define FTOI_LONG reserved, l 
#else 
#   define FTOI_LONG l 
#endif
#define USE_FTOI union{ double r; struct { long FTOI_LONG; } l; } __ftoitmp;
#define OP_FTOI(val) (((__ftoitmp.r=(val)+((((65536.*65536.*16.)+(65536.*.5))*65536.)) ), __ftoitmp.l.l-0x80000000L))

 

위의