C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[70100] Re:질문 몇가지
박우성 [solgari] 2378 읽음    2013-09-10 11:32
질문 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를 띄우거나 하면 또 정상적으로 받아와 집니다.

+ -

관련 글 리스트
70095 질문 몇가지 주누 3039 2013/09/09
70100     Re:질문 몇가지 박우성 2378 2013/09/10
70101         Re:Re:질문 몇가지 주누 3274 2013/09/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.