twain协议,传输文件大小达到200MB时采用文件传输模式

This commit is contained in:
yangjiaxuan 2024-06-17 16:36:46 +08:00
parent 6081a5c6c0
commit 4ca44a6024
1 changed files with 41 additions and 34 deletions

View File

@ -1155,43 +1155,50 @@ HGResult HGTwainDSImpl::ImageNativeXfer(HGUInt type, HGUInt origin, HGImage* ima
return HGTWAIN_ERR_FAIL;
}
#ifdef _WIN64
HANDLE hMem = NULL;
if (TWRC_XFERDONE != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hMem))
HGResult ret = HGBASE_ERR_FAIL;
int fileSize = info.ImageWidth * info.ImageLength * info.BitsPerPixel / 8;
if (fileSize > 200 * 1024 * 1024)
{
return HGTWAIN_ERR_FAIL;
HANDLE hMem = NULL;
if (TWRC_XFERDONE != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGENATIVEXFER, MSG_GET, &hMem))
{
return HGTWAIN_ERR_FAIL;
}
HGStream stream = NULL;
ret = HGBase_CreateDIBStream(hMem, &stream);
GlobalFree(hMem);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
ret = HGBase_CreateImageFromStream(stream, NULL, type, origin, image);
HGBase_DestroyStream(stream);
}
else
{
HGChar tmpFile[260];
HGBase_GetTmpFileName("bmp", tmpFile, 260);
TW_SETUPFILEXFER xfer = {0};
strcpy(xfer.FileName, tmpFile);
xfer.Format = TWFF_BMP;
if (TWRC_SUCCESS != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_SETUPFILEXFER, MSG_SET, &xfer))
{
return HGTWAIN_ERR_FAIL;
}
if (TWRC_XFERDONE != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGEFILEXFER, MSG_GET, NULL))
{
return HGTWAIN_ERR_FAIL;
}
ret = HGBase_CreateImageFromFile(tmpFile, NULL, type, origin, image);
HGBase_DeleteFile(tmpFile);
}
HGStream stream = NULL;
HGResult ret = HGBase_CreateDIBStream(hMem, &stream);
GlobalFree(hMem);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
ret = HGBase_CreateImageFromStream(stream, NULL, type, origin, image);
HGBase_DestroyStream(stream);
#else
HGChar tmpFile[260];
HGBase_GetTmpFileName("bmp", tmpFile, 260);
TW_SETUPFILEXFER xfer = {0};
strcpy(xfer.FileName, tmpFile);
xfer.Format = TWFF_BMP;
if (TWRC_SUCCESS != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_CONTROL, DAT_SETUPFILEXFER, MSG_SET, &xfer))
{
return HGTWAIN_ERR_FAIL;
}
if (TWRC_XFERDONE != m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, &m_iden, DG_IMAGE, DAT_IMAGEFILEXFER, MSG_GET, NULL))
{
return HGTWAIN_ERR_FAIL;
}
HGResult ret = HGBase_CreateImageFromFile(tmpFile, NULL, type, origin, image);
HGBase_DeleteFile(tmpFile);
#endif
return ret;
}