질문 1.
윈도우 API 함수 StretchBlt로 바꾸어 보세요. 그래도 문제가 생긴다면, StretchDraw의 문제는 아닌거죠.
질문 2.
예외라는 것이 윈도우 OS에서 발생되는 것이 있고, C++ 소스의 throw에 의해서 발생되는 것이 있습니다. 이 두가지의 차이점에서 생긴 문제로 보여 집니다. 그리고, 예외창도 윈도우 OS에서 띄우는 것이 있고, C++빌더에서 띄우는 것이 있습니다.
솔직히 윈도우 OS자체의 예외는 좀 복잡하더군요. 제프리 리처의 WINDOWS via C/C++ 책의24장과 25장을 참고하시면 도움이 될 것 같구요.
단순히 윈도우 예외창에 대한 제어는, SetErrorMode함수를 이용하면 됩니다.
그리고, 될 수 있으면 DLL의 예외는 DLL자체에서 모두 해결해야 되며, DLL을 호출한 EXE로 전가되는 것을 피해주는 것이 좋습니다.
질문 3.
BCB6에서 테스트 해 보니까 잘 됩니다.
#define WM_TEST (WM_USER+1000)
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TTrayIcon *TrayIcon1;
TImageList *ImageList1;
TButton *Button1;
TTimer *Timer1;
TMemo *Memo1;
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void __fastcall OnTest( TMessage &Msg );
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_TEST, TMessage, OnTest)
END_MESSAGE_MAP(TForm)
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HWND hwnd = FindWindow( "TForm1", "Form1" );
if( hwnd ){
PostMessage( hwnd, WM_TEST, 0, 0 );
}else{
Memo1->Lines->Add("FindWindow Failed!");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OnTest( TMessage &Msg )
{
Memo1->Lines->Add("OK!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TrayIcon1->Minimize();
}
쓰레드 이야기가 나온 것으로 보아서 동기화 문제일 수도 있겠다 싶은데, 디버깅을 해 보시기 바랍니다.
주누 님이 쓰신 글 :
: BCB6 Ent에서 질문입니다.
:
: 질문 1.
:
: 비트맵 이미지 크기를 변경하기 위해서
: Graphics::TBitmap을 두개 생성한뒤 한 비트맵에서 다른 비트맵으로
: Graphics::TBitmap의 맴버함수인 StretchDraw를 이용하여 크기를 변경할경우
:
: 어디선가 메모리 누수가 일어 나는 것 같습니다. (두 비트맵은 std::auto_ptr을 이용하여 만들었습니다.)
: 다만 실제 메모리 사이즈는 크게 증가하지는 않고 다만 사용하다가 리소스 부족이라고 뜨는 것을 봐서는
: 단순 메모리 누수가 아닌 다른 문제 같은데요.
: 해결 방법이 있나요? 문제는 약 초당 20번씩 크기를 변경할때 한두시간이 지나야 발생합니다.
:
:
: 질문 2.
:
: 프로그램 문제인지 빌더의 버그인지 간혹 try... catch문이 정상 동작을 안하는것 같습니다.
: dll에서 발생하는 예외를 처리하기 위해서 WinAPI의 SetUnhandledExceptionFilter를 이용하여 잡도록 하였고 정상 동작을 하다가..
: 어느 순간... 프로젝트명의 cpp파일의 try catch부분의 ShowException를 비활성 하였음에도 불구하고 예외발생시 메세지를 띄우는 경우가 생기고 이후로 몇몇 부분의 예외 처리가 정상 동작을 안합니다.
: 어느부분에서 실수 한 것일까요?
: 현재 강제로 Application->OnException을 만들어서 지정해주니 메세지 뜨는 부분을 해결 됬지만 WinAPI의 SetUnhandledExceptionFilter부분은 정상 동작을 안하는 것같습니다.
:
:
: 질문 3.
:
: 빌더의 기본제공되는 TTrayIcon을 이용하여 프로그램을 제작 하였더니 TrayIcon->Minimize()를 해버리면 FindWindow를 했을시 다른 값을 반환 합니다.
: Minimize이전에는 정상적으로 헨들을 가져오고 해당 헨들을 이용하여 메세지를 정상적으로 보낼수 있지만
: 이후 숨김상태에서는 실패값이 아닌 다른 헨들을 가져와서 이후 메세지를 정상적으로 보낼수가 없습니다. (받는 프로그램이 못받음으로)
: 이건 원래 이런건 가요?
: 특이 사항으로 Minimize시 몇몇 부분의 코드는 작동하고(타이머나 쓰레드) 몇몇 부분은 멈춤니다.
: 다만 창을 하나라도 띄우거나 트레이에 등록한 PopupMemu를 띄우거나 하면 또 정상적으로 받아와 집니다.