windows-nt/Source/XPSP1/NT/printscan/wia/test/wiatest2/wiatestdoc.cpp
2020-09-26 16:20:57 +08:00

181 lines
4.1 KiB
C++

// wiatestDoc.cpp : implementation of the CWiatestDoc class
//
#include "stdafx.h"
#include "wiatest.h"
#include "wiatestDoc.h"
#include "wiaselect.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CWiatestDoc
IMPLEMENT_DYNCREATE(CWiatestDoc, CDocument)
BEGIN_MESSAGE_MAP(CWiatestDoc, CDocument)
//{{AFX_MSG_MAP(CWiatestDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWiatestDoc construction/destruction
CWiatestDoc::CWiatestDoc()
{
m_pIRootItem = NULL;
m_pICurrentItem = NULL;
}
CWiatestDoc::~CWiatestDoc()
{
ReleaseItems();
}
BOOL CWiatestDoc::OnNewDocument()
{
BOOL bSuccess = FALSE;
if (!CDocument::OnNewDocument())
return bSuccess;
// select a WIA device
CWiaselect SelectDeviceDlg;
if(SelectDeviceDlg.DoModal() != IDOK){
// no device was selected, so do not create a new document
return bSuccess;
}
// a WIA device was selected, so continue
HRESULT hr = S_OK;
IWiaDevMgr *pIWiaDevMgr = NULL;
hr = CoCreateInstance(CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr,(void**)&pIWiaDevMgr);
if(FAILED(hr)){
// creation of device manager failed, so we can not continue
ErrorMessageBox(IDS_WIATESTERROR_COCREATEWIADEVMGR,hr);
return bSuccess;
}
// create WIA device
hr = pIWiaDevMgr->CreateDevice(SelectDeviceDlg.m_bstrSelectedDeviceID, &m_pIRootItem);
if(FAILED(hr)){
bSuccess = FALSE;
// creation of device failed, so we can not continue
ErrorMessageBox(IDS_WIATESTERROR_CREATEDEVICE,hr);
} else {
bSuccess = TRUE;
}
// release WIA device manager
pIWiaDevMgr->Release();
// set document's title to be the WIA device's name
TCHAR szDeviceName[MAX_PATH];
GetDeviceName(szDeviceName);
SetTitle(szDeviceName);
return bSuccess;
}
/////////////////////////////////////////////////////////////////////////////
// CWiatestDoc serialization
void CWiatestDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CWiatestDoc diagnostics
#ifdef _DEBUG
void CWiatestDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CWiatestDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CWiatestDoc commands
void CWiatestDoc::ReleaseItems()
{
// is CurrentItem different from RootItem?
if(m_pICurrentItem != m_pIRootItem){
// release CurrentItem
if(m_pICurrentItem){
m_pICurrentItem->Release();
}
// release RootItem
if(m_pIRootItem){
m_pIRootItem->Release();
}
} else {
// CurrentItem is the RootItem
// release RootItem and set CurrentItem to NULL
if(m_pIRootItem){
m_pIRootItem->Release();
}
}
m_pIRootItem = NULL;
m_pICurrentItem = NULL;
}
HRESULT CWiatestDoc::GetDeviceName(LPTSTR szDeviceName)
{
HRESULT hr = S_OK;
if(NULL == m_pIRootItem){
return E_FAIL;
}
CWiahelper WIA;
hr = WIA.SetIWiaItem(m_pIRootItem);
if(SUCCEEDED(hr)){
hr = WIA.ReadPropertyString(WIA_DIP_DEV_NAME,szDeviceName);
}
return hr;
}
HRESULT CWiatestDoc::SetCurrentIWiaItem(IWiaItem *pIWiaItem)
{
HRESULT hr = S_OK;
if(m_pICurrentItem){
m_pICurrentItem->Release();
m_pICurrentItem = NULL;
}
// AddRef the item, becuase we are storing it
pIWiaItem->AddRef();
// set the current item
m_pICurrentItem = pIWiaItem;
return hr;
}