DLL과 EXE로 구성된 Visual Studio 솔루션이 있습니다. 내 프로그램은 글로벌 WH_CALLWNDPROC
후크를 설정합니다. 후크 프로시 저는 DLL에 의해 정의됩니다. DLL이 내가 관심있는 모든 프로세스에 제대로 주입되는지 확인했습니다. DLL은 DEF 파일이 아닌 헤더 파일에 정의 된 몇 가지 절차를 내 보냅니다. EXE는 자동으로 DLL을로드하고 DLL에서 메서드를 호출하여 후크를 설정합니다. DLL이로드 될 때 DllMain
은 DLL의 모듈 핸들을 포함하는 내부 HMODULE
변수를 설정합니다. EXE가 installHook
프로 시저를 호출하면 DLL은 후크를 설정합니다. 이 모든게 잘 작동합니다.GDI +를 사용하여 주입 된 DLL로 인해 메모장이 충돌합니다.
내 후크 프로 시저가 WM_SIZING
메시지를 받으면 GDI +를 사용하여 윈도우의 클라이언트 DC
에 무언가를 그려야하는 또 다른 내부 프로 시저를 실행합니다. 표준 GDI를 사용합니다. 그러나 GDI + (내가 사용해야하는) 작동하지 않습니다. Graphics::Graphics(HDC)
생성자는 창의 크기를 조정하려고하면 모든 프로그램이 충돌합니다.
void myFaultyProcedure(HWND hWnd) {
RECT wndRect;
GetWindowRect(hWnd,&wndRect);
unsigned int wndWidth=wndRect.right-wndRect.left;
unsigned int wndHeight=wndRect.bottom-wndRect.top;
HDC hDc;
PAINTSTRUCT ps;
ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
hDc=BeginPaint(hWnd,&ps);
Graphics graphics(hDc); // I think that this causes the program to crash
delete &graphics;
EndPaint(hWnd,&ps);
ReleaseDC(hWnd,hDc);
GdiplusShutdown(gdiplusToken);
}
이 코드는 주어진 윈도우의 폭과 높이를 계산하는 DC 가져, GDI +가 시작, Graphics 객체가 생성, 그래픽 객체 삭제는 출시 : 여기에 충돌이 발생 코드의 조각이다 DC 및 GDI + 종료합니다. 나는 왜이 선 때문에 프로그램이 추락 할 것인지 상상할 수 없다. 메모장과 Windows 탐색기가 모두 충돌합니다 (Windows 탐색기 창은 Windows 탐색기 셸과 별개입니다).
감사합니다.
+1. – karlphillip
나는이 경험이별로 없기 때문에 고마워! GDI +에 대한 설명서에 따르면 모든 GDI + 개체가 삭제되거나 범위를 벗어난 후에 GdiplusShutdown을 호출해야한다고 나와 있습니다. GdiplusShutdown이 Graphics와 동일한 범위에서 호출되기 때문에 delete 연산자를 사용해야한다고 생각했습니다. 그러면 내가해야할 일은 그것이 작동하도록 남겨두고 자동으로 할당이 해제됩니까? – AniDev
@Ani B 처리 방법에 대한 답변을 업데이트했습니다. –