728x90

프로그램이 동작하는 도중에 다른 프로그램을 실행해야 하는 상황이 있다.

이럴 때에는 CreateProcess()혹은 WinExec() 등의 다양한 방법이 있겠지만, 나의 경우에는 CreateProcess()가 익숙하므로

이것에 대해서 일단 정리를 해둔다.


CreateProcess()의 첫 번째 인자 값으로는 프로그램이 위치한 절대 경로를 입력해서 사용하고,

만약 상대 경로의 경우에는 첫 번째 인자 값으로는 NULL, 두 번째 인자 값으로 상대 경로를 넣으면 된다.



728x90
728x90

프로그램의 실행 경로를 가져오기 위해서는 아래와 같이 하면 된다.



코드는 따로 설명할게 없네...



728x90
728x90

이 클래스는 Google 검색을 기반으로 그냥 만든 것이다.


아래 소스 코드는 기본적으로 MFC에서 작업한다는 가정하에 만들어진 것이므로, CString을 사용하고 있다.

추후 다른 환경에서 개발을 한다면 약간의 소스 코드 변경이 필요할 것이다.




CMagicPacket.cpp

CMagicPacket.h



사용 방법은 다음과 같다.



만약 이 패킷을 보냈는데 컴퓨터가 켜지지 않는다면 해당 PC의 설정을 변경해줘야만 한다.




Windows 7 의 경우에는 다음과 같이 설정하면 된다.


1. 네트워크 설정.


2. 제어판 -> 방화벽 -> 고급에서 다음과 같이새 인바운드 규칙을 만들면 된다.




3. 바이오스에서 WOL 관련 기능을 켜주자.




Windows 10 의 경우는 다음과 같다.


1. 빠른 시작을 꺼준다.



2. 네트워크 고급 설정에서 WOL 관련 기능을 켜준다.



3. 바이오스에서 WOL 관련 기능을 켜준다.

728x90
728x90

개발을 하다보니 Enum의 Item을 문자열로 가져오고 싶어질 때가 있었다.

 

그래서 여기저기 찾아보니 다음과 같은 방법이 있었다.

 

#define ENUM_STR_A(x)     (#x)

#define ENUM_STR_W(x)    (L#x)

https://github.com/Neargye/magic_enum

 

GitHub - Neargye/magic_enum: Static reflection for enums (to string, from string, iteration) for modern C++, work with any enum

Static reflection for enums (to string, from string, iteration) for modern C++, work with any enum type without any macro or boilerplate code - GitHub - Neargye/magic_enum: Static reflection for en...

github.com

 

only header 라이브러리 이므로 그냥 사용하면 된다.

728x90
728x90

pIcmpSendEcho() 중에 Stop Debuging 시 Blue Screen이 발생한다.


이것은 나만 발생하는 현상이 아니었다.


https://social.msdn.microsoft.com/Forums/vstudio/en-US/c0d616a2-a1ea-43fb-831c-b1f51a957639/icmpsendecho-blue-screen?forum=vclanguage



위 사이트에서 NIC Driver를 다시 설치하면 된다고 했지만, 다시 설치를 해본 결과 동일한 증상이 발생하였다.



이것은 pIcmpSendEcho() 내부에서 무언가의 작업을 하는 도중에 Stop Debuging 을 하면 잘못된 메모리를 참조하면서 Blue Screen이 발생하는 것 같은데, 계속 Blue Screen을 띄우다간 작업 PC에 문제가 생길 것 같아서 더 깊게는 테스트를 해보지 못했다.




CPing 으로 알려져있는 이 방법은 우선 사용을 자제하는 것이 좋을 것 같다.


왜냐하면 아래의 링크를 보면, 굉장히 예전에 만들어진거라 충돌이 발생하는 것 같다.


https://siderite.blogspot.com/2015/07/getting-blue-screen-of-death-when.html




만약 Ping을 이용하여 다른 컴퓨터의 상태를 확인하고 싶다면, 


http://grandstayner.tistory.com/entry/Network-Ping%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EC%97%B0%EA%B2%B0-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0



그냥 이것을 사용하도록 하자.

728x90
728x90

Case 1


아래와 같이 Func() 내부에서 Pointer를 잘못 썻을 경우 std::thread::join() 에서 return을 안하고


Dead Lock에 걸려있는 현상이 존재한다. (std::thread의 버그인지 vs2013의 버그인지는 잘모르겠다...)




만약 join()에서 Dead Lock이 발생한다면, Pointer를 잘못 썻을 가능성을 한번 생각해보자.





Case 2



두번 째의 경우는 std::thread::join()을 하는 시점에 main() 가 없는 시점이다.


예를 들어서 Singleton Pattern 내부에서 std::thread 를 생성하고 사용한 이후 std::thread를 명시적으로 종료하지 않고, 


Singleton 의 소멸자에서 std::thread::join() 을 호출했다면, Process 의 종료 시점이어서 std::thread::join() 가 반환하고 돌아 갈 곳이 없어진 것이다.


그렇기 때문에 main() 가 없어지기 전에 명시적으로 std::thread::join() 을 호출하여 std::thread 를 종료시켜주자.


728x90
728x90

이것은 ICMP를 이용하는 방식이 아니라 그냥 system() 명령을 이용하여 간단하게 만든 것이다.


아래에 있는 소스 코드를 받아서 바로 사용하면 된다.


사용 방법은 다음과 같다.





CPingTest.cpp


CPingTest.h



p.s : 이것은 Window 에서 개발한 소스입니다...





728x90

'Basic Programming > Network' 카테고리의 다른 글

Network - Wake On Lan Magic Packet 전송  (2) 2017.08.30
728x90

Visual Studio 2013 이전 컴파일러에서 작성된 멀티바이트 문자 집합 스타일의 프로젝트를 Visual Studio 2013에서 불러와 변환 후 컴파일을 하면 다음과 같은 에러 메세지가 발생하게 된다.



error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information.    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppBuild.targets





VS 2013부터 멀티바이트문자집합용 MFC 라이브러리가 포함되지 않은 채 나오기 때문에 위와 같은 에러가 발생하는 것이다. 


쉽게 말하면, 유니코드를 사용하여 개발하라는 것이다.





하지만, MS에서 제공하는 "Visual Studio 2013용 멀티바이트 MFC 라이브러리" 를 설치하면 이 문제가 해결된다.


이것은 임시 방편이라고 생각하자.



다운로드 링크 : https://www.microsoft.com/ko-kr/download/confirmation.aspx?id=40770

728x90

+ Recent posts