728x90

최근에 개발을 하다보니 파일 경로에 "~1" 이 추가되면서 파일 경로명이 달라지는 현상을 경험하였다.

이런건 처음 겪어서 검색을 통해 LFN(Long File Name), SFN(Short File Name) 이라는 개념을 알게되었다.

https://community.spiceworks.com/topic/2317575-what-does-1-mean-when-seeing-it-in-a-folder-filepath

 

What does "~1" mean when seeing it in a folder/filepath?

It's the system way to integrate the long name of the files in systems before windows 95. In earlies days, the file names could only have 8 characters and the extensions only 3. To maintain the compatibility, the newer systems generate an 8.3 name for each

community.spiceworks.com

대충 위에 링크를 보면 이해는 될 것이다.

https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getlongpathnamew

 

GetLongPathNameW function (fileapi.h) - Win32 apps

Converts the specified path to its long form. (Unicode)

learn.microsoft.com

해당 현상을 경험하면서 "~1"이 붙은 LFN 경로를 원래대로 복구하고 싶을때 GetLongPathName() 를 이용하도록 하자.

728x90
728x90

옛날에 개발되다가 중단된 회사의 프로젝트를 받아서 빌드를 하는데 $(QTDIR)의 경로가 이상했다.

예를 들면

내 컴퓨터의 $(QTDIR) 매크로의 주소는 "D:\QT\QT5.1.0" 인데,

Visual Studio에서 빌드 중에 $(QTDIR) 매크로의 주소는 "F:\QT\QT5.1.0" 이었다.

무엇이 문제인지 계속 확인을 하다보니, "프로젝트..vcxproj.user" 파일이 예전에 근무하시던 분이 커밋을 해놓았었기 때문에 발생하는 문제였다. 이 파일들을 전부 삭제하고 다시 빌드하니 정상 동작하였다...

728x90
728x90

atomic 뜻 : https://grandstayner.tistory.com/entry/Automic-Operation%EC%9B%90%EC%9E%90%EC%A0%81-%EC%97%B0%EC%82%B0

 

용어 - Automic Operation(원자적 연산)

간단하게 말하면 중단이 불가능한 연산을 의미한다. 문제는 이를 얼마나 이해하는 것인데 자신이 작성한 코드가 원자적 연산이 아닐 수도 있다는 사실을 알아야 한다. 01: public class Example { 02:  i

grandstayner.tistory.com

 

신입 프로그래머들의 경우에는 위의 사진에서 7번 라인의 a++이 1개의 명령으로 실행이 된다고 생각할 수 있다.

하지만, 이것을 디스어셈블리 해보면 다음과 같이 여러개의 명령어로 실행이되는 것을 알 수 있다.

눈에 보이는 소스코드처럼 1번에 실행이 되는 것이 아니라면 Multi Thread 환경에서는 오동작을 일으킬 확률이 있기 때문에 C++ 11에서는 std::atomic 이라는 구조체를 제공하고 있다.

쉽게 설명하면 std::atomic의 템플릿 인자로 원자적으로 만들고 싶은 타입을 전달하면 그 변수는 기본적으로 원자적인 변수로 동작하게 바뀐다.

아래와 같이 atomic_int를 사용했을 때 디스어셈블리를 확인해보자.

위의 사진과 같이 lock xadd 라는 명령어가 보인다. 즉 lock을 걸어서 a++작업 자체를 원자적으로 동작하는 것을 보장해준다는 것이다.

 

사용법은 아래와 같이 단순하다.

#include <iostream>

int main()
{
    std::atomic<bool> boolean = false;
    boolean = true;
    boolean.store(true);
}

 

종종 사용되는 함수도 봐둘 필요는 있다.

#include <iostream>

std::atomic<bool> gStoppedThread = false;

void LoopThread()
{
    while (gStoppedThread == false)
    {

    }

    gStoppedThread = true;
}

만약 위와 같이 while(gStoppedThread = false)과 gStoppedThread = true 자체가 한번에 처리되어야 하는 상황이 있을 수 있다. 그럴 때는 atomic::compare_exchange_strong() 를 사용하면 된다.

변수 expected(기대값), desired(atomic 변수 값이 expected값과 같다면 이 값으로 적용) 가 추가되었다.

compare_exchange_strong()의 내부 동작은 의사 코드와 거의 동일할 것으로 예상된다.

즉 실제 코드와 같이 변경해주면 저 동작은 원자적으로 동작하는 것을 보장할 수 있다.

ref : https://aerocode.net/117

 

Compare And Exchange(CAS) 명령어

Compare And Exchange (CAS) Compare And Exchange (CAE) 명령어는 락을 사용하지 않는 기본 원자함수이며(CPU 레벨에서 지원한다.), 비교와 교환을 원자성을 가지고 수행한다. Compare And Swap (CAS) 라는 이름..

aerocode.net

 

728x90

'Basic Programming > C++ 11' 카테고리의 다른 글

C++11 - Mordern C++ 프로그래머를 위한 C++ 11/14 핵심  (0) 2018.10.17
c++11 - constexpr  (0) 2018.08.22
C++11 - final, override 키워드  (0) 2017.09.18
C++11 - std::thread  (0) 2016.12.02
C++11 - "default" and "delete" keyword  (0) 2016.11.29
728x90

Memory Leak을 Detect하는 코드를 사용할 때 아래와 같이 new를 새롭게 define해서 사용한다.

   1 #ifdef _DEBUG
   2 #define new new( _CLIENT_BLOCK, __FILE__, __LINE__ )
   3 #endif

 

개발을 하다보면 이 코드가 문제가 될때가 있다. 예를 들면 다른 OpenSource를 사용할때...

그럴때에는 그 헤더를 사용할 때에는 push_macro()를 이용해서 문제를 해결할 수 있다.

#pragma push_macro("new")
#undef new

#include "OpenSource.h" // 오픈소스 헤더

#pragma pop_macro("new")

 

자세한 내용은 아래의 글을 참조하자.

https://dataonair.or.kr/db-tech-reference/d-lounge/technical-data/?mod=document&uid=235804

 

C++ 프로그래밍 : 알면 유용한 메모리 연산자

C++ 프로그래밍 알면 유용한 메모리 연산자 C/C++는 메모리를 직접 다룰 수 있어 개발자 사이에서도 호불호가 극명하게 갈리는 편이다. 메모리를 직접 제어해야 하는 어려움은 다른 언어에도 많은

dataonair.or.kr

 

728x90
728x90

Visual Studio로 개발을 하다보면 프로그램을 실행하고 Visual Studio로 프로세스 연결을 통해 Debugging을 할때가 있는데, 이 프로세스 연결을 자동으로 해주는 프로그램이다.

유료 프로그램이기 때문에 꼭 필요한 경우에 구입해서 사용하면 된다.

Hooking을 할때 굉장히 유용하게 사용된다.

http://entrian.com/attach/

 

Auto-Attach Debugger Add-In for Visual Studio - Entrian Attach

Attach to proc­esses as they start Attach the debugger automatically to processes the moment they start, however they're started. Services, web servers, DllMain, unit tests, setup custom actions, anything you like. Attachment happens directly on process c

entrian.com

 

728x90

'Dev Tool' 카테고리의 다른 글

Dev Tool - Gold Wave  (0) 2020.04.28
Dev Tool - Inno Setup  (0) 2019.11.15
Dev Tool - TortoiseGit  (0) 2018.10.17
Dev Tool - CMake  (0) 2018.02.26
Dev Tool - PixelAtro App  (0) 2018.02.22
728x90

 

기본적으로는 MD로 되기 때문에 vcpkg\scripts\buildsystems\msbuild\vcpkg.targets에서

<VcpkgOSTarget>windows</VcpkgOSTarget> == MD

<VcpkgOSTarget>windows-static</VcpkgOSTarget> == MT

 

 

728x90
728x90
#include <iostream>
#include <memory> 
#include <windows.h>
#include <winuser.h>

bool IsScreenLocked()
{
	HDESK desktopHandle = OpenInputDesktop(0, false, DESKTOP_SWITCHDESKTOP);
	if (desktopHandle == 0)
	{
		desktopHandle = OpenDesktopA("Default", 0, false, DESKTOP_SWITCHDESKTOP);
	}
	if (desktopHandle != 0)
	{
		if (SwitchDesktop(desktopHandle))
		{
			CloseDesktop(desktopHandle);
		}
		else
		{
			CloseDesktop(desktopHandle);
			return true;
		}
	} return false;
}

bool IsScreenSaverRunning()
{
	int isRunning = 0;
	if (!SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &isRunning, 0))
	{
		return false;
	}
	if (isRunning)
	{
		return true;
	}
	return false;
}

int main()
{
	while (true)
	{
		if (IsScreenLocked())
		{
			printf("LockScreen : true");
		}
		else
		{
			printf("LockScreen : false");
		}

		if (IsScreenSaverRunning())
		{
			printf("ScreenSaver : true");
		}
		else
		{
			printf("ScreenSaver : false");
		}

		Sleep(100);
	}
}

 

참조 : https://icodebroker.tistory.com/9207

728x90
728x90
728x90

+ Recent posts