⌨ DEVELOPMENT/C++
[C/C++] process crash 로그 및 덤프 남기기 (access violation)
[C/C++] process crash 로그 및 덤프 남기기 (access violation)
2019.07.06윈도우 개발을 하다 보면 완벽한 프로그램을 만들기를 희망하지만 경험에 의해서, 예외상황에 의해서 프로세스에 문제가 발생하기 마련입니다. __try __exception 을 두는 것에서 한계가 있고 access violation 문제인 경우 특정 옵션을 켜지 않는 이상 __try __exception에서 잡히지 않게 되고, 고객이 사용 중에 문제가 발생한 경우 로그보다 더욱 많은 자료가 기록되어있는 dump 파일을 받을 수 있기 때문에 덤프를 사용합니다. 그렇다면 어떻게 이런 access violation을 포함한 모든 상황에서 process crash가 나는 예외상황을 캐치할 수 있을까요? msdn에 보면 SetUnhandledExceptionFilter API를 제공하고있습니다. SetUnhandled..
[C/C++] convert string, wstring, utf-8
[C/C++] convert string, wstring, utf-8
2019.07.06convert ansi string to unicode string and utf-8 string c/c++에서 ansi string과 unicode string, utf-8 string을 상호 변환하기 위해서는 간단한 대입으로는 불가능합니다. 예전에 소개해드렸던 std::string.assign 방법으로 1byte의 문자열인 경우에만 지원이 되게 되어 제가 만들어서 사용 중인 방법을 소개해드립니다. 쉽게 처리가 되면 참으로 좋겠지만 아래처럼 하면 에러가 나게 됩니다. 그렇기 때문에 string 관련 함수는 따로 만들어놓고 두고두고 사용하는 게 좋습니다. 어떻게 사용하면 좋을지 한번 보겠습니다. 아래 샘플들을 이용하여 편안하고 멋진 개발 하세요 :) convert ansi to unicode string..
[C/C++] 작업표시줄 아이콘 깜빡이게 하기 (FlashWIndow)
[C/C++] 작업표시줄 아이콘 깜빡이게 하기 (FlashWIndow)
2019.07.03카카오톡 쪽지 또는 백그라운드 작업 후 완료되었음을 사용자에게 알려주기 위한 방법 중에 한 가지입니다. 해당 기능을 위해서는 FlashWindowEx라는 API를 사용하게 됩니다. MSDN을 참고하게 되면 다음과 같은 설명이 있습니다. MSDN HOMEhttps://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-flashwindowex FlashWindowEx function Flashes the specified window. It does not change the active state of the window. 즉, 작업표시줄에 지정된 윈도를 깜빡이게 하지만 창을 활성화 화지는 않는다는 얘기죠 해당 API를 사용하면서 주의하실 점 T..
[C++] std::string to std::wstring 서로 변환하기
[C++] std::string to std::wstring 서로 변환하기
2016.01.31convert string to wstring 유니코드 환경과 멀티바이 환경이 함께 동작하는 윈도우 환경에선 사용하는 경우에 따라 멀티바이트 스트링을 사용하기도 하고, 유니코드 스트링을 사용하기도 합니다.이 때, std::string 을 이용하여 아주 간단하게 상호 변환이 가능합니다. 그냥 넣으면 안되나요??네 안됩니다... 아래와 같이 에러가 납니다 그래서 아래와같은 정상적인 방법을 이용하여 컨버팅을 할 수 있습니다. 멀티바이트 -> 유니코드 { std::string message_a = "convert before message"; std::wstring message_w; message_w.assign(message_a.begin(), message_a.end()); wprintf(message_w..
[C/C++] DLL injection. 다른 Process에 내 DLL Load 하기
[C/C++] DLL injection. 다른 Process에 내 DLL Load 하기
2016.01.03DLL Injection기본적으로 내가 만든 Process에 DLL을 Load하는 방법은 간단합니다. 그냥 일반적으로 사용하면 되죠 하지만 다른 Process에 내가 원하는 기능을 동작하게 하고싶은 경우엔 어떻게 해야할까요?? 특별한 방법을 사용하여 내가만든 DLL을 다른 Process에서 Load 하여 DllMain에서 필요한 기능을 실행해버리는겁니다. 정상적으로 DLL을 Load했으니 해당 Process의 메모리에 대한 접근 권한을 갖기때문에 여러가지 동작이 가능합니다. 그 특별한 방법이 어떤건지 code로 보겠습니다. DLL Injection code #include #include #include bool process_name_to_pid( __out DWORD& pid, __in const s..
__cdecl, __stdcall, __fastcall x86 호출 규약(Calling Convention)
__cdecl, __stdcall, __fastcall x86 호출 규약(Calling Convention)
2016.01.01Calling Convention X86에선 호출 규약이 __cdecl, __stacll, __fastcall 등으로 나누어있지만 x64에선 __fastcall 하나의 호출 규약만을 사용하도록 정의 되어있습니다. (__fastcall은 x86 전용이라고 합니다. x64는 추후 다시 정리하겠습니다!)오늘은 x86 호출 규약에 대해서만 정리를 해보겠습니다. 함수 호출규약을 아무것도 입력하지 않으면 기본값은 __cdecl 입니다.해당 테스트는 Visual Studio 2015 Community 에서 이루어졌습니다. __cdecl (c declaration) 이 규약에서 호출자는 스택에서 인수를 정리하며, printf() 와 같은 가변 인자 함수를 지원합니다.함수의 호출시 함수 호출 전과 함수가 끝난 후의 ES..
[C/C++] FormatMessage 윈도우 GetLastError를 메시지로!!
[C/C++] FormatMessage 윈도우 GetLastError를 메시지로!!
2015.12.29GetLastError() code to Message Windows 프로그램 개발시 API를 사용하다보면 에러가 났을때 문제를 확인하기 위하여 GetLastError() 를 사용합니다. 하지만 해당 API는 DWORD 로 넘어오기때문에 자주 사용해서 기억하는 코드가 아니면 MSDN HOME https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms681381(v=vs.85).aspx 위 사이트를 이용하여 Error Number와 Message를 비교해야 합니다. 이 때, 디버그 로그를 기록하거나 메시지를 바로바로 보고싶은 경우 이러 번거로움을 해소하기 위하여 FormatMessage API를 사용합니다. Windows 는 Error Number를 문자열로..
[C/C++] IPC - Pipe client simple example
[C/C++] IPC - Pipe client simple example
2015.12.28PIPE Client Server code HOME 2015/12/21 - [Development/C/C++] - [C/C++] IPC - Pipe server simple example 이전에 소개했던 Multithreaded pipe server에 이어 client code 입니다. 모든 server - client program이 그렇듯이 client는 간단 합니다. 하는일은 서버에 접속해서 데이터를 주고 받는게 다 입니다. 바로 코드로 보겠습니다. 생성자에서 서버 정보를 입력받아 바로 접속을 시도하고, 성공 실패여부는 verify 를 통하여 확인 가능하도록 했습니다. 파이프 서버는 생성할때 서버 이름을 입력해주어야 하고, 마찬가지로 클라이언트에서 접속할때도 서버 이름을 입력해야합니다. 이름은 \\..
[C/C++] IPC - Pipe server simple example
[C/C++] IPC - Pipe server simple example
2015.12.21PIPE Server 프로세스 간 통신(Inter-Process Communication, IPC) 기법 중 하나인 PIPE 통신 입니다. Pipe는 프로세스간에 바이트 스트림을 전송하기 위한 통로의 개념으로 로컬 통신으로 사용하기가 아주 편리한 기법 입니다. (소켓을 이용할수도 있겠지만 로컬 통신에선 포트까지 열어야하는 부담이 있기때문에 비교적 부담이 적은 Pipe를 사용합니다) Pipe는 Named Pipe와 Anonymous Pipe로 나뉘어지며, IPC에선 주로 Named Pipe가 사용됩니다. * Anonymous pipe는 사용성이 불편하고, 비동기 및 양방향 입출력이 지원되지 않는 구식 방식이기 때문입니다. 서버에서 하는 역할을 보겠습니다. [초기화] 1. CreateNamedPipe 를 이..
[C/C++] string replace all 문자열 모두 치환
[C/C++] string replace all 문자열 모두 치환
2015.12.11std::string ReplaceAllSTL의 std::string를 이용하여 간단하게 문자열을 치환할 수 있다. 기본적으론 string.replace가 존재하며 해당 기능은 1번만 치환되므로 모든 문자를 치환하려면 추가로 작업을 해주어야 한다. 다음 코드를 보자 #include std::string replace_all( __in const std::string &message, __in const std::string &pattern, __in const std::string &replace ) { std::string result = message; std::string::size_type pos = 0; while ((pos = result.find(pattern)) != std::string:..
[C/C++] 폴더 전체 경로 중 파일명만 가져오기
[C/C++] 폴더 전체 경로 중 파일명만 가져오기
2015.12.10Path 관련해선 MS에서 제공되는 다양한 API가 존재한다. 그 중 파일명을 가져오기위해서 직접 parsing을 해서 사용하다가 API를 찾게되었다. 바로 PathStripPath 라는 API 이다. Removes the path portion of a fully qualified path and file. 즉 전체 경로 중 실제 경로 부분만 제거한다는 의미이다. MSDN의 예제를 보면 TCHAR szPath1[] = TEXT("c:\\dir1\\file.txt"); PathStripPath(szPath1); // Result: szPath1 == file.txt TCHAR szPath2[] = TEXT("c:\\windows\\system32\\directx\\dinput\\joystick.ini")..
관리자 권한으로 생성한 MMF User 권한으로 접근하기
관리자 권한으로 생성한 MMF User 권한으로 접근하기
2015.04.03서비스스 뿐만 아니라, 시스템이나 관리자 권한으로 생성한 MMF나 혹은 PIPE를 유저 권한으로 읽거나 하려면 반드시라고 해도 좋을 만큼 권한에 관한 문제가 발생합니다. DWORD dwRes; PSID pEveryoneSID = NULL, pAdminSID = NULL; PACL pACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; EXPLICIT_ACCESS ea; SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY; SECURITY_ATTRIBUTES sa; // Create a well-know..