⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplepointworkspacehelper.cpp

📁 COM编程接口处理方法 多个方法调用COM库函数
💻 CPP
字号:
// SimplePointWorkspaceHelper.cpp : Implementation of CSimplePointWorkspaceHelper
#include "stdafx.h"
#include "SimplePointVC.h"
#include "SimplePointWorkspaceHelper.h"
#include "GeneralUtils.h"

/////////////////////////////////////////////////////////////////////////////
// CSimplePointWorkspaceHelper

STDMETHODIMP CSimplePointWorkspaceHelper::InterfaceSupportsErrorInfo(REFIID riid)
{
	static const IID* arr[] = 
	{
		&IID_ISimplePointWorkspaceHelper
	};
	for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		if (InlineIsEqualGUID(*arr[i],riid))
			return S_OK;
	}
	return S_FALSE;
}

// IPlugInWorkspaceHelper
STDMETHODIMP CSimplePointWorkspaceHelper::get_RowCountIsCalculated(VARIANT_BOOL *rowCountCalculated)
{
	if (! rowCountCalculated) return E_POINTER;

  *rowCountCalculated = VARIANT_TRUE;
  return S_OK;
}

STDMETHODIMP CSimplePointWorkspaceHelper::get_OIDIsRecordNumber(VARIANT_BOOL *OIDIsRecordNumber)
{
	if (! OIDIsRecordNumber) return E_POINTER;

  *OIDIsRecordNumber = VARIANT_TRUE;
  return S_OK;

}

STDMETHODIMP CSimplePointWorkspaceHelper::get_NativeType(esriDatasetType DatasetType, BSTR localName, INativeType **ppNativeType)
{
  // We are not implementing native types
	return E_NOTIMPL;

}

STDMETHODIMP CSimplePointWorkspaceHelper::get_DatasetNames(esriDatasetType DatasetType, IArray **DatasetNames)
{
	HRESULT hr;
	USES_CONVERSION;

	if (! DatasetNames) return E_POINTER;

	// Create an empty array
	IArrayPtr ipArray;
	hr = ipArray.CreateInstance(CLSID_Array);
  if (FAILED(hr)) return hr;

	// the only two that we support
	if (DatasetType != esriDTAny && DatasetType != esriDTFeatureClass)
  {
	  *DatasetNames = ipArray.Detach(); // pass ownership of object to client;		
		return S_FALSE;
	}
	// look for each file with the correct extension
	// first make a file filter path e.g. "D:/data/*.spt"
  CComBSTR sPathFilter = m_sWorkspacePath;
	sPathFilter.Append(L"*");
	sPathFilter.Append(g_sExt);

	// try to find the first file.
	HANDLE hSearch;
	WIN32_FIND_DATA findData;
	hSearch = ::FindFirstFile( OLE2CT(sPathFilter), &findData);
	if (hSearch == INVALID_HANDLE_VALUE)
  {
	  *DatasetNames = ipArray.Detach(); // pass ownership of object to client;		
		return S_FALSE;
	}
	
	// Create the dataset helper for the first file 
	IPlugInDatasetInfoPtr ipPlugInDatasetInfo;
	CComBSTR fileName = T2OLE(findData.cFileName);
	hr = CreatePlugInDatasetHelper(fileName, &ipPlugInDatasetInfo);
	if (FAILED(hr)) return hr;

	// Add it to the array - no need to call Addref, since the Add method will do it.
	IUnknownPtr ipUnk = ipPlugInDatasetInfo;
	ipArray->Add(ipUnk);

	// for each additional file
	while (0 != FindNextFile(hSearch, &findData))
	{
		fileName = findData.cFileName;
		// Create the the dataset helper
		// note - the & operator releases the previous object
  	hr = CreatePlugInDatasetHelper(fileName, &ipPlugInDatasetInfo);
	  if (FAILED(hr)) return hr;
		
		IUnknownPtr ipUnk = ipPlugInDatasetInfo;
		ipArray->Add(ipUnk);
	}
	
	*DatasetNames = ipArray.Detach(); // pass ownership of object to client;

	::FindClose(hSearch);
	return S_OK;

}

STDMETHODIMP CSimplePointWorkspaceHelper::OpenDataset(BSTR localName, IPlugInDatasetHelper **datasetHelper)
{
  HRESULT hr;
	USES_CONVERSION;

  if (! datasetHelper) return E_POINTER;

	CComBSTR sFileName = localName;
  sFileName.Append(g_sExt);

  // Check if the dataset is valid
	CComBSTR sFullPath = m_sWorkspacePath;
	sFullPath.Append(sFileName);
	
	if (!FileExists(OLE2CT(sFullPath)))
	{
		CComBSTR sError(L"Dataset does not exist: ");
		sError.Append(localName);
  	AtlReportError(CLSID_SimplePointWorkspaceHelper, sError, IID_IPlugInWorkspaceHelper, E_FAIL);
		return E_FAIL;
	}

  // Create the dataset helper
	IPlugInDatasetInfoPtr ipPlugInDatasetInfo;
	hr = CreatePlugInDatasetHelper(sFileName, &ipPlugInDatasetInfo);
	if (FAILED(hr)) return hr;

	IPlugInDatasetHelperPtr ipPlugInDatasetHelper = ipPlugInDatasetInfo;
  if (ipPlugInDatasetHelper == NULL) return E_FAIL;

	*datasetHelper = ipPlugInDatasetHelper.Detach(); // pass ownership of object to client;

	return S_OK;
}

// ISimplePointWorkspaceHelper methods
STDMETHODIMP CSimplePointWorkspaceHelper::put_WorkspacePath(BSTR newVal)
{
	m_sWorkspacePath = newVal;

	if (m_sWorkspacePath.Length() == 0) return E_FAIL;

	if (m_sWorkspacePath[m_sWorkspacePath.Length() - 1] != L'\\')
		m_sWorkspacePath.Append(L"\\");

	return S_OK;
}

// helper functions
HRESULT CSimplePointWorkspaceHelper::CreatePlugInDatasetHelper(BSTR fileName, IPlugInDatasetInfo ** ppPlugInDatasetInfo)
{
	HRESULT hr;
	if (! ppPlugInDatasetInfo) return E_POINTER;

	IPlugInDatasetInfoPtr ipPlugInDatasetInfo;
	
	// First check to see if the specified dataset is already in our cache
	PlugInDatasets::iterator p;
	p = m_mapDatasets.find(fileName);
	if (p != m_mapDatasets.end())
	{
		ipPlugInDatasetInfo = p->second;
	}
  else 
	{
		// Create the new object
		ISimplePointDatasetHelperPtr ipSimplePointDatasetHelper;
		hr = ipSimplePointDatasetHelper.CreateInstance(CLSID_SimplePointDatasetHelper);
		if (FAILED(hr)) return hr;

		// Initialize it with the dataset name, first strip off the file extension
		TCHAR str[_MAX_PATH];
		::_tcscpy(str, OLE2CT(fileName));
		str[_tcslen(str) - g_sExt.Length()] = _T('\0');
		CComBSTR sDatasetName = T2OLE(str);

		hr = ipSimplePointDatasetHelper->put_DatasetName(sDatasetName);
		if (FAILED(hr)) return hr;

		// Initialize it with the workspace path
		hr = ipSimplePointDatasetHelper->put_WorkspacePath(m_sWorkspacePath);
		if (FAILED(hr)) return hr;

		// QI for the IPlugInDatasetInfo
		ipPlugInDatasetInfo = ipSimplePointDatasetHelper;
		if (ipPlugInDatasetInfo == NULL) return E_FAIL;

		// Add it to the cache
    m_mapDatasets.insert(PlugInDatasets::value_type(fileName, ipPlugInDatasetInfo));
	}

  *ppPlugInDatasetInfo = ipPlugInDatasetInfo.Detach();

	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -