2010. 10. 28. 12:54

CHtmlView에서 external 개체 사용하여 JScript에서 C++ 함수 호출하기

MFC 개발에 있어 최대 약점 혹은 단점중 하나라면, UI 개발이 쉽지 않다는 것입니다. 어떻게 바꿔 말해보자면, "MFC에서 UI 개발은 어렵다"라고 할 수 있습니다(View의 Change도 쉽게 구현이 안됩니다). 만약, MFC MainUI를 HTML로 구성하고, 각 Control간의 정보 호출을 JS <-> C++로 한다면 용의해 질 수 있으리라 봅니다. 왜냐하면, HTML 자체는 나름 많이 알려진 훌륭한 UI Render이기 때문입니다(뭐 심지어 Flash까지 실행시킬 수 있으니깐요).  즉, MainUI가 HTML로 된다면,
  • 비즈니스 로직 기능 C++ 개발자 (Win32 API 개발자, MFC 개발자)
  • UI 개발자 (HTML, JS 개발자)

가 서로 협력해서 작업이 쉽게 이뤄질 수 있습니다.
이러한 C++과 JScript의 중간 영역에 external 개체가 있습니다.

다음과 같은 순서로 진행 할 수 있습니다. (VC 6.0에서는 지원이 되지 않습니다.)

  1. MFC Project 생성 (Single Document, CHtmlView로 연결)
  2. 다음과 같이 xxxxView.h 파일을 수정
    class CAppView : public CHtmlView
    {
    ...
    protected:
    	virtual HRESULT OnGetExternal(LPDISPATCH *lppDispatch); // <-- 추가
    	void Func1(); // <-- 추가
    
    // Implementation
    ...
    // Generated message map functions
    protected:
    	DECLARE_MESSAGE_MAP()
    	DECLARE_DISPATCH_MAP() // <-- 추가
    };
  3. 다음과 같이 xxxxView.cpp 파일을 수정
    BEGIN_MESSAGE_MAP(xxxxView, CHtmlView)
    END_MESSAGE_MAP()
    
    // 아래 3줄 추가
    BEGIN_DISPATCH_MAP(xxxxView, CHtmlView)
    	DISP_FUNCTION(xxxxView, "Func1", Func1, VT_EMPTY, VTS_NONE) // Each methods need here to add mapping
    END_DISPATCH_MAP()
    ...
    // xxxxView construction/destruction
    xxxxView::CV3LAppView()
    {
    	// TODO: add construction code here
    	EnableAutomation(); // <-- 추가
    }
    ...
    // 아래 함수 추가
    HRESULT xxxxView::OnGetExternal(LPDISPATCH *lppDispatch)
    {
    	*lppDispatch = GetIDispatch(TRUE);
    	return S_OK;
    }
    
    void xxxxView::Func1()
    {
    	MessageBox(_T("Hello!"));
    }
  4. 다음과 같이 html 파일 작성(SyntaxHighlighter에서 따옴표를 지우네요. 각 값들에 따옴표를 추가하세요)
    hello,world
     
    
  5. xxxxView::OnInitialUpdate() Overriding
    Navigate2(TEXT("C:\.....\test.html"); // <-- 추가
이렇게 되면 다음과 같은 프로그램으로 동작합니다.


즉, JScript의 "external.Func()"를 호출하여 C++의 xxxView::Func()를 호출하게 됩니다.
이렇게 JScript -> C++ 함수 호출하는데에는 external 개체가 사용되며, Argument와 리턴값도 그대로 사용할 수 있습니다. Argument 전달법은 MSDN을 통해 확인해 보시기 바랍니다.