2010-11-23 4 views
0

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 탐색기 셸과 별개입니다).

감사합니다.

답변

4

확신이 다음 줄 코드 타격을 위로하고있다

delete &graphics; 

에게 있습니다. delete은 포인터가 new에 의해 얻어진 경우에만 사용해야합니다. 여기에 스택에 뭔가가 있습니다. 할당 된 스택에서 delete를 호출하는 것은 의미가 없습니다.

는 그래픽 인스턴스가 GdiplusShutdown이 새로운 범위를 도입 할 수 호출되기 전에 파괴되어 있는지 확인하려면 : 음이 발견

{ 
    Graphics g(...); 
    g.DoStuff(); 
    ... 
} // g is destroyed here 
GdiplusShutdown(...) 
+0

+1. – karlphillip

+0

나는이 경험이별로 없기 때문에 고마워! GDI +에 대한 설명서에 따르면 모든 GDI + 개체가 삭제되거나 범위를 벗어난 후에 GdiplusShutdown을 호출해야한다고 나와 있습니다. GdiplusShutdown이 Graphics와 동일한 범위에서 호출되기 때문에 delete 연산자를 사용해야한다고 생각했습니다. 그러면 내가해야할 일은 그것이 작동하도록 남겨두고 자동으로 할당이 해제됩니까? – AniDev

+1

@Ani B 처리 방법에 대한 답변을 업데이트했습니다. –

관련 문제