#include <windows.h>
#include <RestartManager.h>
#include <stdio.h>


#pragma comment(lib, "Rstrtmgr.lib")


int __cdecl wmain(int argc, WCHAR **argv)
{
	DWORD dwSession;

	PCWSTR pszFile = _T("D:\\R00RR0162232162_2023070523_MACHINE-ALARM.csv");
	HANDLE hFile = CreateFile(pszFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL);
	auto thisProcID = GetProcessId(GetCurrentProcess());

	WCHAR szSessionKey[CCH_RM_SESSION_KEY + 1] = { 0 };
	DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey);
	wprintf(L"RmStartSession returned %d\n", dwError);

	if (dwError == ERROR_SUCCESS) 
	{
		dwError = RmRegisterResources(dwSession, 1, &pszFile, 0, NULL, 0, NULL);
		wprintf(L"RmRegisterResources(%ls) returned %d\n", pszFile, dwError);
		if (dwError == ERROR_SUCCESS)
		{
			DWORD dwReason;
			UINT i;
			UINT nProcInfoNeeded;
			UINT nProcInfo = 10;
			RM_PROCESS_INFO rgpi[10];
			dwError = RmGetList(dwSession, &nProcInfoNeeded,
				&nProcInfo, rgpi, &dwReason);
			wprintf(L"RmGetList returned %d\n", dwError);
			if (dwError == ERROR_SUCCESS)
			{
				wprintf(L"RmGetList returned %d infos (%d needed)\n", nProcInfo, nProcInfoNeeded);
				for (i = 0; i < nProcInfo; i++)
				{
					wprintf(L"%d.ApplicationType = %d\n", i, rgpi[i].ApplicationType);
					wprintf(L"%d.strAppName = %ls\n", i, rgpi[i].strAppName);
					wprintf(L"%d.Process.dwProcessId = %d\n", i, rgpi[i].Process.dwProcessId);

					HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_TERMINATE,
						FALSE, rgpi[i].Process.dwProcessId);
					if (hProcess)
					{
						FILETIME ftCreate, ftExit, ftKernel, ftUser;

						if (GetProcessTimes(hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser) &&
							CompareFileTime(&rgpi[i].Process.ProcessStartTime, &ftCreate) == 0)
						{
							WCHAR sz[MAX_PATH];
							DWORD cch = MAX_PATH;
							if (QueryFullProcessImageNameW(hProcess, 0, sz, &cch) && cch <= MAX_PATH)
							{
								wprintf(L"  = %ls\n", sz);
							}
						}

						if (thisProcID == rgpi[i].Process.dwProcessId)
						{
							wprintf(L"%d.Process.dwProcessId = %d  This is me.. I dont kill myself...\n", i, rgpi[i].Process.dwProcessId);
						}
						else
						{
							if (TerminateProcess(hProcess, 0))
							{
								wprintf(L"%d.Process.dwProcessId = %d  TerminateProcess ok\n", i, rgpi[i].Process.dwProcessId);
							}
							else
							{
								wprintf(L"%d.Process.dwProcessId = %d  TerminateProcess fail\n", i, rgpi[i].Process.dwProcessId);
							}
						}

						CloseHandle(hProcess);
					}
				}
			}
		}
		RmEndSession(dwSession);
	}


	CloseHandle(hFile);
	return 0;
}

내가 나중에 필요할 까봐 여기에 올려둠

아무나 사용해도 됨.

MD5 Hash : 4818f3d8d3fee5cda082f0d8cb24bf9623c4b750

EXE 파일 크기 : 328KB (335,872 바이트)

 

mspaint.zip
0.19MB

 

 

 

 

도구 > 옵션 > Nuget 패키지 관리자 > 패키지 소스

또는

도구 > Nuget 패키지 관리자 > 패키지 관리자 설정 > 패키지 소스

 

 

1. Nuget V2

   추가 URL : https://www.nuget.org/api/v2/

 

2. Nuget V3

   추가 URL : https://api.nuget.org/v3/index.json



 

 

 

1. 이미지 버퍼에서 cv::Mat 초기화 하기.

cv::Mat originFrame = cv::Mat(GetHeight(), GetWidth(), CV_8UC1, GetBits());





2. cv::Mat 의 영상을 BYTE 배열로 변환하기.


LPBYTE src = originFrame.data;
LPBYTE dst = GetBits();

if (src != dst)
{
	Concurrency::parallel_for(0l, (LONG)GetHeight(), [&](int y)
	{
		LPBYTE src_line = src + (y * originFrame.cols);
		LPBYTE dst_line = dst + (y * GetWidthBytes());
		memcpy(dst_line, src_line, GetWidth());
	});
}

다음 코드를 수행하면 pure virtual function call 에러가 발생되면서 프로그램이 죽는다.





	class A
	{
	public:
		A() {
		}

		void intermediate_call() {
			// Bad: virtual function call during object destruction
			virtual_function();
		}

		virtual void virtual_function() = 0;

		virtual ~A() {
			intermediate_call();
		}
	};

	class B : public A
	{
	public:
		// override virtual function in A
		void virtual_function()
		{
			printf("B::virtual_function called\n");
		}
	};



	B myObject;

	// This call behaves like a normal virtual function call.
	// Print statement shows it invokes B::virtual_function.
	myObject.virtual_function();


메모리릭이 발생하면 디버거를 종료했을 때 이런 메시지가 출력된다.

Detected memory leaks!
Dumping objects ->
{103144} normal block at 0x01C79B18, 12 bytes long.
Data: <            > 18 9B C7 01 18 9B C7 01 CD CD CD CD 

왠 만하면 어느 파일의 몇 번째 줄에서 메모리릭이 발생했다고 알려주지만, 이 경우처럼 디버거가 알려주지 못하는 경우도 많고, for문 안에서 메모리릭이 발생하는 경우처럼 위치만 알아서는 정확히 언제 발생하는지 알기 어려울 때도 있다. 이럴 때 사용할 수 있는 것이 중괄호안에 들어있는 숫자다. 이 숫자는 메모리 할당 번호(Memory Allocation Number)인데, 번호가 103144라는 것은 이 프로그램에서 할당받은 메모리 중에서 103144번째 블록이라는 뜻이다(헉... 내 프로그램이 메모리를 이렇게 많이 할당받았던가 -0-;;).

프로그램 코드의 적당한 위치에 

_crtBreakAlloc = 103144; 
라 고 적어주고 디버거를 실행하면 이 메모리를 할당하려고 할 때 프로그램을 Break 시켜준다. 디버그 버전에서는 힙에 메모리를 할당할 때마다 crtdbg 라이브러리(이렇게 표현해도 되나?)가 이 변수를 체크해서 Break 해주는 것이다. 디버깅중에 Watch 윈도우에서 변수 값을 바꿔서 다른 메모리 할당 번호에서 멈출 수도 있다. 전역 변수 값을 변경하는 대신에

_CrtSetBreakAlloc(103144); 
라고 함수를 호출해주어도 마찬가지 효과가 있다.


MSDN 기술문서 중 "Detecting and Isolating Memory Leaks"를 참고했음.
 
//------------------------------------------------------------------------------------
사용 방법 설명
 

Detected memory leaks!
Dumping objects ->
{103144} normal block at 0x01C79B18, 12 bytes long.
Data: <            > 18 9B C7 01 18 9B C7 01 CD CD CD CD 

추가 헤더 파일 : #include <crtdbg.h>
 
[MFC]
~App::InitInstance() 함수 상위에 아래와 같이 문제가 발생된 메모리 블럭 설정
    ...
 
    _CrtSetBreakAlloc(103144);
    _CrtMemDumpAllObjectsSince(0); 
}
 
[Win32/Console]
main()
{
    ...
    _CrtSetBreakAlloc(103144);
    _CrtMemDumpAllObjectsSince(0); 
}


var myMsgBox=new ActiveXObject("wscript.shell");

myMsgBox.Popup ("Hey, this works")



Visual C++ 2013에서 리소스 ID 충돌 재배치 하는 프로그램 (이전 버전도 됨)

자세한 내용은 제작사 홈페이지 참조

http://www.riverblade.co.uk/products/resorg/downloads.html




ResOrg.7z


+ Recent posts