728x90

Windows API 중에 SetLayeredWindowAttributes()를 이용하여 윈도우를 투명하게 바꿀 수 있다.


// make it transparent

long l = GetWindowLong(m_hWnd, WL_EXSTYLE);

l |= WS_EX_LAYERED;

SetWindowLong(m_hWnd, GWL_EXSTYLE, l);

SetLayeredWindowAttributes(m_hWnd, 0, nOpacity, LWA_ALPHA);


이 API를 이용하면, 프레임 드랍이 굉장히 심하다...



그래서 구글에서 검색해본 결과, Windows의 Aero 기능을 활용하는 방법이 있었다.


DWM(Desktop Window Manager)가 실행되어 있어야하므로, 프로세스에 dwm.exe가 실행되어 있어야 한다.


// Set margins, extending the bottom margin

MARGINS margins = { -1, -1, -1, -1 };

int val = 0;    // 2;

hr = DwmSetWindowAttribute(m_hWnd, 2, &val, 4);


// Extend frame on the bottom of client area

hr = DwmExtendFrameIntoClientArea(m_hWnd, &margins);


위의 코드를 활용한다면, Aero 기능을 활용하기 때문에 SetLayeredWindowAttributes() 보다는 쓸만 했다.

728x90
728x90

NVIDIA 그래픽 카드에서만 CUDA가 동작을 한다.


DirectX11을 초기화하는 단계에서 그래픽 카드 정보를 확인하고, NVIDIA 그래픽 카드가 아닌 경우 경고를 띄우기 위해서 


DXGI_ADAPTER_DESC 구조체를 사용하여 확인하였다.



<소스 코드>


CComPtr<IDXGIFactory1> factory = nullptr;

HR(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&factory));


if (FAILED(factory->EnumAdapters1(m_nAdapterID, &m_pAdapter)))

    return E_FAIL;    // 그래픽 카드가 없기 때문에 종료


DXGI_ADAPTER_DESC desc;

m_pAdapter->GetDesc(&desc);




위와 같이 그래픽 카드의 정보를 가져와서 확인하면 된다.



728x90
728x90

간단한 어셈블리만 알아두자.


1. 덧셈




2. 뺄셈



3. 곱셈

곱셈의 경우 피승수가 eax에 대입되고 승수는 다른 레지스터나 메모리를 사용하면 된다. 한 연산자가 2개의 인자를 동시에 사용할 수 없다. 항상 eax를 사용하여 곱셈을 연산해야하며, 결과도 eax에 들어가게 되는데 곱의 대상은 다른 레지스터나 메모리 변수를 사용하면 된다.



4. 나눗셈

나눗셈도 곱셈과 방법은 마찬가지이다. 피제수가 eax에 들어가게 되고, 다른 레지스터와 메모리 값을 제수로 사용하게 된다. 결과값의 몫은 eax에 들어가고, 나머지는 edx 레지스터에 들어가게 된다. 한번에 두개의 인자를 입력할 수 없으므로 나누어 계산해야 한다.



728x90

'Parallel Programming > SSE' 카테고리의 다른 글

SSE - SSE (Streaming SIMD Extensions)  (0) 2017.03.14
728x90

SSE (Streaming SIMD Extensions)는 실수 연산에 최적화된 명령어이다.


여기서 SIMD란 Single Instruction Multiple Data의 약자로써, 하나의 명령어를 수행할 때, 레지스터를 좀 더 효율적으로 활용하는 기법을 말한다.


MMX에 이은 Intel의 다음 세대 멀티미디어 명령어이다. CPU에는 참 많은 명령어가 있다. MMX 명령어 50여개를 비롯하여 SSE에서 SSE4 등등이 있다. 이러한 명령어는 부동 소수점 연산등에 탁월한 효과를 보이기 때문에 3D 게임 혹은 멀티미디어 분야에서 그 성능을 발휘한다. 




컴퓨터 시스템의 종류


SISD (Single Instruction Single Data) 

 - 한 번의 연산으로 한개의 데이터를 처리할 수 있는 컴퓨터 시스템


SIMD (Single Instruction Multiple Data) 

 - 한 번의 연산으로 여러 개의 데이터를 처리할 수 있는 컴퓨터 시스템


MISD (Multiple Instruction Single Data) 

 - 하나의 데이터를 처리하기 위해 여러개의 연산 명령이 필요한 컴퓨터 구조


MIMD (Multiple Instruction Multiple Data) 

 - 여러 개의 데이터를 처리하기 위해 여러 개의 연산 명령을 처리하는 컴퓨터 구조




728x90

'Parallel Programming > SSE' 카테고리의 다른 글

SSE - 어셈블리 덧셈, 뺄셈, 곱셈, 나눗셈  (0) 2017.03.14
728x90

팩토리 패턴은 기본적으로 2개로 분류(Factory Method, Abstract Factory) 된다.


팩토리 메소드(Factory Method)는 객체를 생성하되 직접 객체의 생성자를 호출해서 객체를 생성하는 것이 아니라 대행 함수를 통해 간접적으로 객체를 생성하는 방식이다.


쉽게 말하면, 스타크래프트에서 배럭(클래스)에서 유닛(추상클래스)를 통해 마린, 파이어뱃, 메딕 등을 생성하게 된다.


소스코드


unit.h




barracks.h




main.cpp



위와 같이 배럭(클래스)에서는 상황에 따라 마린 또는 메딕등을 생성하지만 무엇이 생성되었는지는 알지 못해도 생성된 유닛을 사용하는데는 문제가 없다. 이렇듯 Factory에서 생성된 객체를 사용자는 종류에 신경쓰지 않고 생성된 객체를 똑같이 사용할 수 있다.




추상 팩토리(Abstract Factory)는 클래스의 객체를 전담 생성하는 클래스를 두지만, 새로운 제품군 생성을 추가하는 것이 쉽도록 클래스 상속을 도입하고 구체적인 제품군별 Factory 클래스 상위에 Abstract Base Class를 정의한 형태의 설계구조를 말한다.


쉽게 말하면 Factory Method의 확장 버전으로 Unit 뿐만이 아니라 Barracks도 Factory Method화 하는 것이다.




아래의 소스 코드에서 ISword는 Unit, ISwordFactory는 Factory의 추상화라고 생각하고 소스 코드를 보면 될 것 같다.


소스 코드


Sword.h




Factory.h




main.cpp




추상 팩토리 패턴에서 팩토리 클래스들의 각 멤버 함수들은 앞에서 언급한 팩토리 메서드(Factory Method) 패턴 형태로 구현되어 있으며 추상팩토리 패턴은 기본적으로 팩토리 메서드 패턴을 활용해서 구현한다.


단점은 새로운 객체가 추가 될때마다 새로운 팩토리 클래스를 정의하고 구현해야 하는 불편함을 초래하는데 이 부분을 해결하려면 객체를 종류별로 팩토리 클래스에 등록해두고 객체 생성 요청시 복제해주는 방식(프로토타입 패턴)을 사용한다.


또한 팩토리 객체를 하나만 두고 싶을 때는 싱글턴 패턴을 사용하면 된다.






출처 : http://blog.naver.com/sorkelf/40169734025http://egloos.zum.com/ani2life/v/2887675

728x90
728x90

#include <windows.h>

#include <iostream>

#include <tchar.h>


int main()

{

    _wsetlocale(LC_ALL, _T("Korean"));


    wchar_t strText[MAX_PATH] = { 0, };

    HINSTANCE hLanguageDll = nullptr;

    LANGID wLanguageID = 0;


    // OS의 언어 ID를 가져온다.

    wLanguageID = GetUserDefaultUILanguage();

    //wLanguageID = 0x412;    // 한글

    //wLanguageID = 0x409;    // 영어


    switch (wLanguageID)

    {

    case 0x409 :    // 영어

        hLanguageDll = LoadLibrary(_T("Language_Eng"));        

        break;


    case 0x412 :    // 한글

        hLanguageDll = LoadLibrary(_T("Language_Kor"));        

        break;

    }


    if (hLanguageDll == nullptr)

        return -1;


    LoadString(hLanguageDll, 101, strText, MAX_PATH);

    wprintf(L"%s \r\n", strText);


    FreeLibrary(hLanguageDll);


    getchar();

    return 0;

}



LANGID : https://msdn.microsoft.com/ko-kr/library/bb165625(v=vs.90).aspx

Display name

Value

Default charset

Arabic

1025

Arabic

Basque

1069

ANSI

Catalan

1027

ANSI

Chinese (Simplified)

2052

GB2312

Chinese (Traditional)

1028

Chinese-Big 5

Czech

1029

Eastern European

Danish

1030

ANSI

Dutch

1043

ANSI

English (United States)

1033

ANSI

Finnish

1035

ANSI

French

1036

ANSI

German

1031

ANSI

Greek

1032

Greek

Hebrew

1037

Hebrew

Hungarian

1038

Eastern European

Italian

1040

ANSI

Japanese

1041

Shift-JIS

Korean

1042

Johab

Norwegian

1044

ANSI

Polish

1045

Eastern European

Portuguese

2070

ANSI

Portuguese (Brazil)

1046

ANSI

Russian

1049

Russian

Slovakian

1051

Eastern European

Slovenian

1060

Eastern European

Spanish

3082

ANSI

Swedish

1053

ANSI

Turkish

1055

Turkish


참조 : http://copynull.tistory.com/91


StringTable.zip


728x90
728x90

자꾸 DLL 만들 때 마다 검색하게 되는 것 같다. ㅠ


그냥 코드만 정리해서 올려둔다.



#include <windows.h>


#ifdef MYDLL_EXPORTS

#define MYDLL __declspec(dllexport) 

#else

#define MYDLL __declspec(dllimport) 

#endif


BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}


return TRUE;

}




사용 예제는 그냥 소스 코드를 첨부하겠다...


DllExample.zip


728x90
728x90

현재 윈도우의 정확한 버전을 얻기 위해서는 Network Management 함수 중 하나인 NetWkstaGetInfo() 를 이용하는 것이다.




NetWkstaGetInfo ()가 다소 느리므로, 처음 호출할 때에는 버전을 알아내기 위해 NetWkstaGetInfo ()를 호출하고, 이 후에는 저장된 값으로 확인하는 것이 좋다.



VerifyVersionInfo() 를 이용하면, ServicePack 버전까지 알아낼 수 있다.




출처 : http://iamskylover.tistory.com/75


Source.cpp


728x90

+ Recent posts