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;
}
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;
}
'KB > MFC/Win32' 카테고리의 다른 글
ATL 메소드와 클래스 메소드가 같을경우 버그 (0) | 2004.03.19 |
---|---|
ATL Control 만들기 in HTML (0) | 2004.03.19 |
ATL Timer 쓰기 (0) | 2004.03.19 |
[com ] 이차원 배열이 담아 있는 varData로 배열 요소 얻어오기 (0) | 2004.03.19 |
[com] 웹 페이지(ASP/Script)에서 넘어오는 문자열 잡아 내기 (0) | 2004.03.19 |