这一步只添加基本的接口,并把接口名称调试出来,具体实现后续再做。先要把流程走通之后,再逐步迭代。
在SSOPOSServiceObjectPOSPrinter.idl文件里的ISOPOSPrinter下面添加如下接口:
interface ISOPOSPrinter : IDispatch{
[id(201)] HRESULT Open([in] BSTR DeviceName, [out, retval] LONG* pRC);
[id(202)] HRESULT Close([out, retval] LONG* pRC);
[id(203)] HRESULT ClaimDevice([in] LONG Timeout, [out, retval] LONG* pRC);
[id(204)] HRESULT ReleaseDevice([out, retval] LONG* pRC);
[id(205)] HRESULT CheckHealth([in] LONG Level, [out, retval] LONG* pRC);
[id(206)] HRESULT ClearInput([out, retval] LONG* pRC);
[id(207)] HRESULT ClearInputProperties([out, retval] LONG* pRC);
[id(208)] HRESULT ClearOutput([out, retval] LONG* pRC);
[id(209)] HRESULT DirectIO([in] LONG Command, [in] LONG* pData, [in] BSTR* pString, [out, retval] LONG* pRC);
[id(210)] HRESULT CompareFirmwareVersion([in] BSTR FirmwareFileName, [in] LONG* pResult, [out, retval] LONG* pRC);
[id(211)] HRESULT ResetStatistics([in] BSTR StatisticsBuffer, [out, retval] LONG* pRC);
[id(212)] HRESULT RetrieveStatistics([in] BSTR* pStatisticsBuffer, [out, retval] LONG* pRC);
[id(213)] HRESULT UpdateFirmware([in] BSTR FirmwareFileName, [out, retval] LONG* pRC);
[id(214)] HRESULT UpdateStatistics([in] BSTR StatisticsBuffer, [out, retval] LONG* pRC);
[id(215), helpstring("Use ClaimDevice")] HRESULT Claim([in] LONG nTimeout, [out, retval] LONG* pRC);
//[id(216), helpstring("Use ReleaseDevice")] HRESULT Release([out, retval] LONG* pRC);
[id(217)] HRESULT BeginInsertion([in] LONG Timeout, [out, retval] LONG* pRC);
[id(218)] HRESULT BeginRemoval([in] LONG Timeout, [out, retval] LONG* pRC);
[id(219)] HRESULT ChangePrintSide([in] LONG Side, [out, retval] LONG* pRC);
[id(220)] HRESULT ClearPrintArea([out, retval] LONG* pRC);
[id(221)] HRESULT CutPaper([in] LONG Percentage, [out, retval] LONG* pRC);
[id(222)] HRESULT DrawRuledLine([in] LONG Station, [in] BSTR PositionList, [in] LONG LineDirection, [in] LONG LineWidth, [in] LONG LineStyle, [in] LONG LineColor, [out, retval] LONG* pRC);
[id(223)] HRESULT EndInsertion([out, retval] LONG* pRC);
[id(224)] HRESULT EndRemoval([out, retval] LONG* pRC);
[id(225)] HRESULT MarkFeed([in] LONG Type, [out, retval] LONG* pRC);
[id(226)] HRESULT PageModePrint([in] LONG Control, [out, retval] LONG* pRC);
[id(227)] HRESULT PrintBarCode([in] LONG Station, [in] BSTR Data, [in] LONG Symbology, [in] LONG Height, [in] LONG Width, [in] LONG Alignment, [in] LONG TextPosition, [out, retval] LONG* pRC);
[id(228)] HRESULT PrintBitmap([in] LONG Station, [in] BSTR FileName, [in] LONG Width, [in] LONG Alignment, [out, retval] LONG* pRC);
[id(229)] HRESULT PrintImmediate([in] LONG Station, [in] BSTR Data, [out, retval] LONG* pRC);
[id(230)] HRESULT PrintMemoryBitmap([in] LONG Station, [in] BSTR Data, [in] LONG Type, [in] LONG Width, [in] LONG Alignment, [out, retval] LONG* pRC);
[id(231)] HRESULT PrintNormal([in] LONG Station, [in] BSTR Data, [out, retval] LONG* pRC);
[id(232)] HRESULT PrintTwoNormal([in] LONG Station, [in] BSTR Data1, [in] BSTR Data2, [out, retval] LONG* pRC);
[id(233)] HRESULT RotatePrint([in] LONG Station, [in] LONG Rotation, [out, retval] LONG* pRC);
[id(234)] HRESULT SetBitmap([in] LONG BitmapNumber, [in] LONG Station, [in] BSTR FileName, [in] LONG Width, [in] LONG Alignment, [out, retval] LONG* pRC);
[id(235)] HRESULT SetLogo([in] LONG Location, [in] BSTR Data, [out, retval] LONG* pRC);
[id(236)] HRESULT TransactionPrint([in] LONG Station, [in] LONG Control, [out, retval] LONG* pRC);
[id(237)] HRESULT ValidateData([in] LONG Station, [in] BSTR Data, [out, retval] LONG* pRC);
[id(238)] HRESULT COFreezeEvents([in] VARIANT_BOOL Freeze, [out, retval] LONG* pRC);
[id(239)] HRESULT GetPropertyNumber([in] LONG PropIndex, [out, retval] LONG* pRC);
[id(240)] HRESULT SetPropertyNumber([in] LONG PropIndex, [in] LONG Number);
[id(241)] HRESULT GetPropertyString([in] LONG PropIndex, [out, retval] BSTR* pRC);
[id(242)] HRESULT SetPropertyString([in] LONG PropIndex, [in] BSTR StrVal);
[id(243)] HRESULT OpenService([in] BSTR DeviceClass, [in] BSTR DeviceName, [in] IDispatch* pDispatch, [out, retval] LONG* pRC);
[id(244)] HRESULT CloseService([out, retval] LONG* pRC);
};
在SOPOSPrinter.h文件里的CSOPOSPrinter类里面添加如下接口:
// ISOPOSPrinter
public:
STDMETHOD(Open)(BSTR DeviceName, LONG* pRC);
STDMETHOD(Close)(LONG* pRC);
STDMETHOD(ClaimDevice)(LONG nTimeout, LONG* pRC);
STDMETHOD(ReleaseDevice)(LONG* pRC);
STDMETHOD(CheckHealth)(LONG Level, LONG* pRC);
STDMETHOD(ClearInput)(LONG* pRC);
STDMETHOD(ClearInputProperties)(LONG* pRC);
STDMETHOD(ClearOutput)(LONG* pRC);
STDMETHOD(DirectIO)(LONG Command, LONG* pData, BSTR* pString, LONG* pRC);
STDMETHOD(CompareFirmwareVersion)(BSTR FirmwareFileName, LONG* pResult, LONG* pRC);
STDMETHOD(ResetStatistics)(BSTR StatisticsBuffer, LONG* pRC);
STDMETHOD(RetrieveStatistics)(BSTR* pStatisticsBuffer, LONG* pRC);
STDMETHOD(UpdateFirmware)(BSTR FirmwareFileName, LONG* pRC);
STDMETHOD(UpdateStatistics)(BSTR StatisticsBuffer, LONG* pRC);
STDMETHOD(Claim)(LONG nTimeout, LONG* pRC);
STDMETHOD(Release)(LONG* pRC);
STDMETHOD(BeginInsertion)(LONG nTimeout, LONG* pRC);
STDMETHOD(BeginRemoval)(LONG nTimeout, LONG* pRC);
STDMETHOD(ChangePrintSide)(LONG Side, LONG* pRC);
STDMETHOD(ClearPrintArea)(LONG* pRC);
STDMETHOD(CutPaper)(LONG Percentage, LONG* pRC);
STDMETHOD(DrawRuledLine)(LONG Station, BSTR PositionList, LONG LineDirection, LONG LineWidth, LONG LineStyle, LONG LineColor, LONG* pRC);
STDMETHOD(EndInsertion)(LONG* pRC);
STDMETHOD(EndRemoval)(LONG* pRC);
STDMETHOD(MarkFeed)(LONG nType, LONG* pRC);
STDMETHOD(PageModePrint)(LONG nControl, LONG* pRC);
STDMETHOD(PrintBarCode)(LONG Station, BSTR pData, LONG Symbology, LONG Height, LONG Width, LONG Alignment, LONG TextPosition, LONG* pRC);
STDMETHOD(PrintBitmap)(LONG Station, BSTR FileName, LONG Width, LONG Alignment, LONG* pRC);
STDMETHOD(PrintImmediate)(LONG Station, BSTR pData, LONG* pRC);
STDMETHOD(PrintMemoryBitmap)(LONG Station, BSTR pData, LONG nType, LONG Width, LONG Alignment, LONG* pRC);
STDMETHOD(PrintNormal)(LONG Station, BSTR pData, LONG* pRC);
STDMETHOD(PrintTwoNormal)(LONG Station, BSTR pData1, BSTR pData2, LONG* pRC);
STDMETHOD(RotatePrint)(LONG Station, LONG Rotation, LONG* pRC);
STDMETHOD(SetBitmap)(LONG BitmapNumber, LONG Station, BSTR FileName, LONG Width, LONG Alignment, LONG* pRC);
STDMETHOD(SetLogo)(LONG Location, BSTR pData, LONG* pRC);
STDMETHOD(TransactionPrint)(LONG Station, LONG nControl, LONG* pRC);
STDMETHOD(ValidateData)(LONG Station, BSTR pData, LONG* pRC);
STDMETHOD(COFreezeEvents)(VARIANT_BOOL Freeze, LONG* pRC);
STDMETHOD(GetPropertyNumber)(LONG PropIndex, LONG* pRC);
STDMETHOD(SetPropertyNumber)(LONG PropIndex, LONG Number);
STDMETHOD(GetPropertyString)(LONG PropIndex, BSTR* pRC);
STDMETHOD(SetPropertyString)(LONG PropIndex, BSTR StrVal);
STDMETHOD(OpenService)(BSTR DeviceClass, BSTR DeviceName, IDispatch* pDispatch, LONG* pRC);
STDMETHOD(CloseService)(LONG* pRC);
在SOPOSPrinter.cpp文件里添加接口实现(目前仅调试)如下所示:
STDMETHODIMP CSOPOSPrinter::Open(BSTR DeviceName, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::Close(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ClaimDevice(LONG nTimeout, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
*pRC = OPOS_SUCCESS;
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ReleaseDevice(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
*pRC = OPOS_SUCCESS;
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::CheckHealth(LONG Level, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ClearInput(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ClearInputProperties(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ClearOutput(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::DirectIO(LONG Command, LONG* pData, BSTR* pString, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::CompareFirmwareVersion(BSTR FirmwareFileName, LONG* pResult, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ResetStatistics(BSTR StatisticsBuffer, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::RetrieveStatistics(BSTR* pStatisticsBuffer, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::UpdateFirmware(BSTR FirmwareFileName, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::UpdateStatistics(BSTR StatisticsBuffer, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::Claim(LONG nTimeout, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
*pRC = OPOS_SUCCESS;
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::Release(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::BeginInsertion(LONG nTimeout, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::BeginRemoval(LONG nTimeout, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ChangePrintSide(LONG Side, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ClearPrintArea(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//切纸,需要支持TransactionPrint和AsyncMode
STDMETHODIMP CSOPOSPrinter::CutPaper(LONG Percentage, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::DrawRuledLine(LONG Station, BSTR PositionList, LONG LineDirection, LONG LineWidth, LONG LineStyle, LONG LineColor, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::EndInsertion(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::EndRemoval(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::MarkFeed(LONG nType, LONG* pRC)
{
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//页模式打印,需要支持TransactionPrint和AsyncMode
STDMETHODIMP CSOPOSPrinter::PageModePrint(LONG nControl, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//打印条码,需要支持TransactionPrint和AsyncMode
STDMETHODIMP CSOPOSPrinter::PrintBarCode(LONG Station, BSTR pData, LONG Symbology, LONG Height, LONG Width, LONG Alignment, LONG TextPosition, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//打印位图,需要支持TransactionPrint和AsyncMode,页模式和标准模式命令不同
STDMETHODIMP CSOPOSPrinter::PrintBitmap(LONG Station, BSTR FileName, LONG Width, LONG Alignment, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::PrintImmediate(LONG Station, BSTR pData, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::PrintMemoryBitmap(LONG Station, BSTR pData, LONG nType, LONG Width, LONG Alignment, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//打印文本,需要支持TransactionPrint和AsyncMode
STDMETHODIMP CSOPOSPrinter::PrintNormal(LONG Station, BSTR pData, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::PrintTwoNormal(LONG Station, BSTR pData1, BSTR pData2, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//旋转打印,需要支持TransactionPrint和AsyncMode
STDMETHODIMP CSOPOSPrinter::RotatePrint(LONG Station, LONG Rotation, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//下载位图,后续可通过PrintNormal打印
STDMETHODIMP CSOPOSPrinter::SetBitmap(LONG BitmapNumber, LONG Station, BSTR FileName, LONG Width, LONG Alignment, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::SetLogo(LONG Location, BSTR pData, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//事务模式,需要考虑AsyncMode
STDMETHODIMP CSOPOSPrinter::TransactionPrint(LONG Station, LONG nControl, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::ValidateData(LONG Station, BSTR pData, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::COFreezeEvents(VARIANT_BOOL Freeze, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::GetPropertyNumber(LONG PropIndex, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::SetPropertyNumber(LONG PropIndex, LONG Number)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::GetPropertyString(LONG PropIndex, BSTR* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
//只读属性不可以设置
STDMETHODIMP CSOPOSPrinter::SetPropertyString(LONG PropIndex, BSTR StrVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::OpenService(BSTR DeviceClass, BSTR DeviceName, IDispatch* pDispatch, LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA("CSOPOSPrinter 20240309.001");
OutputDebugStringA(__FUNCTION__);
//保存pDispatch用于后续产生事件
*pRC = OPOS_SUCCESS;
return S_OK;
}
STDMETHODIMP CSOPOSPrinter::CloseService(LONG* pRC)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO:
OutputDebugStringA(__FUNCTION__);
*pRC = OPOS_SUCCESS;
return S_OK;
}
到目前为止,也应该能编译成功。
备注:
OPOS_SUCCESS 为 0