ATL COM
bro, Jo kyung min , nst
오후 12:44 2000-05-12

ASP & VB in ATL C++
=================================================================

ASP 서포트 하기

ATL 프로젝트를 연 후 , New ATL Object을 하되, ActiveX Server Component
로 하게 되면 기본적으로 Response객체나 Request객체의 포인터를
기본 자료로 갖게 된다.

기본 Simple Object에 ASP 기능 서포트 하기

자신의 인터페이스 프록시 클래스헤더에

class ATL_NO_VTABLE CTestCom :
        public CComObjectRootEx<CComMultiThreadModel>,
            :
이런식이라면

#include <asptlb.h>         // Active Server Pages Definitions
             :
class ATL_NO_VTABLE CTestCom :
        public CComObjectRootEx<CComMultiThreadModel>,
            :


ASP에 관한 맴버 메소드와 자료
// ITestCom
public:
        //Active Server Pages Methods
        STDMETHOD(OnStartPage)(IUnknown* IUnk);
        STDMETHOD(OnEndPage)();

private:
        CComPtr<IRequest> m_piRequest;                                        //Request Object
        CComPtr<IResponse> m_piResponse;                                //Response Object
        CComPtr<ISessionObject> m_piSession;                        //Session Object
        CComPtr<IServer> m_piServer;                                        //Server Object
        CComPtr<IApplicationObject> m_piApplication;        //Application Object
        BOOL m_bOnStartPageCalled;                                                //OnStartPage successful?
};

하고... 실제 구현은

STDMETHODIMP CTestCom::OnStartPage (IUnknown* pUnk)  
{
        if(!pUnk)
                return E_POINTER;

        CComPtr<IScriptingContext> spContext;
        HRESULT hr;

        // Get the IScriptingContext Interface
        hr = pUnk->QueryInterface(IID_IScriptingContext, (void **)&spContext);
        if(FAILED(hr))
                return hr;

        // Get Request Object Pointer
        hr = spContext->get_Request(&m_piRequest);
        if(FAILED(hr))
        {
                spContext.Release();
                return hr;
        }

        // Get Response Object Pointer
        hr = spContext->get_Response(&m_piResponse);
        if(FAILED(hr))
        {
                m_piRequest.Release();
                return hr;
        }
        
        // Get Server Object Pointer
        hr = spContext->get_Server(&m_piServer);
        if(FAILED(hr))
        {
                m_piRequest.Release();
                m_piResponse.Release();
                return hr;
        }
        
        // Get Session Object Pointer
        hr = spContext->get_Session(&m_piSession);
        if(FAILED(hr))
        {
                m_piRequest.Release();
                m_piResponse.Release();
                m_piServer.Release();
                return hr;
        }

        // Get Application Object Pointer
        hr = spContext->get_Application(&m_piApplication);
        if(FAILED(hr))
        {
                m_piRequest.Release();
                m_piResponse.Release();
                m_piServer.Release();
                m_piSession.Release();
                return hr;
        }
        m_bOnStartPageCalled = TRUE;
        return S_OK;
}

STDMETHODIMP CTestCom::OnEndPage ()  
{
        m_bOnStartPageCalled = FALSE;
        // Release all interfaces
        m_piRequest.Release();
        m_piResponse.Release();
        m_piServer.Release();
        m_piSession.Release();
        m_piApplication.Release();

        return S_OK;
}

이렇게 하면 된다.

마지막으로 idl도 넣어야 한다.

        interface ITestCom : IDispatch
        {
                //Standard Server Side Component Methods
                HRESULT OnStartPage([in] IUnknown* piUnk);
                HRESULT OnEndPage();        


그렇다면 ASP 서버 페이지 객체로 되어 버리면 VB에서 쓸수 없는가?

아니다. 쓸수 있다.

Method 하나를 만들어보자.


STDMETHODIMP CTestCom::Method(VARIANT varString)
{
        // TODO: Add your implementation code here
        // VB나 ASP나 공통으로 실행되는 부분
        USES_CONVERSION;
        char* pszString = W2A(varString.bstrVal);
        
        ::MessageBox(NULL, pszString, "asdf", MB_OK );
        
        
        if( m_piRequest )        // 만일 리퀘스트 객체가 있다면
        {                       // 아래는 ASP의 경우의 코드
                VARIANT varRes;
                varRes.vt = VT_BSTR;
                varRes.bstrVal = ::SysAllocString(L"hahahah");
                // 웹페이지에 hahahah를 찍어라.
                m_piResponse->Write( varRes );
        }
        else
        {
             // 객체 생성에 실패했으므로 그냥 VB같은 클라이언트에서
             실행되는 코드로 가정된다.
        }

        return S_OK;
}

+ Recent posts