2010. 10. 28. 12:54
CHtmlView에서 external 개체 사용하여 JScript에서 C++ 함수 호출하기
2010. 10. 28. 12:54 in 프로그래밍/Win32
MFC 개발에 있어 최대 약점 혹은 단점중 하나라면, UI 개발이 쉽지 않다는 것입니다. 어떻게 바꿔 말해보자면, "MFC에서 UI 개발은 어렵다"라고 할 수 있습니다(View의 Change도 쉽게 구현이 안됩니다). 만약, MFC MainUI를 HTML로 구성하고, 각 Control간의 정보 호출을 JS <-> C++로 한다면 용의해 질 수 있으리라 봅니다. 왜냐하면, HTML 자체는 나름 많이 알려진 훌륭한 UI Render이기 때문입니다(뭐 심지어 Flash까지 실행시킬 수 있으니깐요). 즉, MainUI가 HTML로 된다면,
즉, JScript의 "external.Func()"를 호출하여 C++의 xxxView::Func()를 호출하게 됩니다.
이렇게 JScript -> C++ 함수 호출하는데에는 external 개체가 사용되며, Argument와 리턴값도 그대로 사용할 수 있습니다. Argument 전달법은 MSDN을 통해 확인해 보시기 바랍니다.
- 비즈니스 로직 기능 C++ 개발자 (Win32 API 개발자, MFC 개발자)
- UI 개발자 (HTML, JS 개발자)
가 서로 협력해서 작업이 쉽게 이뤄질 수 있습니다.
이러한 C++과 JScript의 중간 영역에 external 개체가 있습니다.
다음과 같은 순서로 진행 할 수 있습니다. (VC 6.0에서는 지원이 되지 않습니다.)
- MFC Project 생성 (Single Document, CHtmlView로 연결)
- 다음과 같이 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() // <-- 추가 };
- 다음과 같이 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!")); }
- 다음과 같이 html 파일 작성(SyntaxHighlighter에서 따옴표를 지우네요. 각 값들에 따옴표를 추가하세요)
hello,world
- xxxxView::OnInitialUpdate() Overriding
Navigate2(TEXT("C:\.....\test.html"); // <-- 추가
즉, JScript의 "external.Func()"를 호출하여 C++의 xxxView::Func()를 호출하게 됩니다.
이렇게 JScript -> C++ 함수 호출하는데에는 external 개체가 사용되며, Argument와 리턴값도 그대로 사용할 수 있습니다. Argument 전달법은 MSDN을 통해 확인해 보시기 바랍니다.
'프로그래밍 > Win32' 카테고리의 다른 글
.rc 파일의 targetver.h 컴파일 오류 해결 방법 (0) | 2010.12.02 |
---|---|
OutputDebugString(...) / TRACE(...) 동작 안할 때 (0) | 2010.11.11 |
멀티쓰래드에서의 CPU 점유율 관리를 위한 코드 구현 (0) | 2010.07.24 |
Message Pumping Sleep 코드 (0) | 2010.07.20 |
Full Design CMainFrame의 구현 (0) | 2010.07.20 |