|
利用VC++开发ASP图像处理组件(二)
作者:符文科 (龙飞)
下载源代码 逆风编程精品
本文第一部分:利用VC 开发ASP图像处理组件(一)
三、COM组件接口设计
前面我们在输入文本后,在程序中创建设备上下文,对输入的文本进行计算并输出了指定文件名的位图文件,在本设计中,我们使用了以JPEG压缩格式存储文件的方式以减小网络传输时间,因jpeg压缩方法的论述已超出本文范围,故在此不再赘述。
为了让其他语言调用此接口,我们以 COM 组件的方式发布此程序,可供VB,DELPHI,PB,ASP等程序调用,下面给出COM组件的设计方法,一般COM组件的创建及编译超出本文范围,故不再作解释。
在组件中清加方法:
STDMETHOD(OutTextImg)(/*[out, retval]*/ long *pVal);ltvalue(500)] long lWeight,
[in,optional,defaultvalue(0)] long l3D);
和
STDMETHOD(OutImg)(BSTR bstrFileName, long lDelFile);
分别实现处理文件本保存为图像及把图像输出到用户浏览器。实现代码如下:
STDMETHODIMP CAspImage::OutImgFromText(BSTR bstrFilePath,
BSTR bstrText,
BSTR bstrBgImg,
long lCSet,
BSTR bstrFont,
long lWidth,
long lHeight,
long lLeft,
long lTop,
long llfHeight,
long lWeight,
long l3D)
{
CImg img;
try{
if(0 == img.OutImgFromText(
bstrFilePath,
bstrText,
bstrBgImg,
lCSet,
bstrFont,
lWidth,
lHeight,
lLeft,
lTop,
llfHeight,
lWeight,
l3D))
{
return S_OK;
}
else
{
return S_FALSE;
}
}
catch(...)
{
return S_FALSE;
}
return S_OK;
/**/
}
一些处理代码我们封装在了Cimg类中,在前面做过介绍,在这里只是简单调用即可。
STDMETHODIMP CAspImage::OutTextImg(long *pVal)
{
HRESULT hr = OutImgFromText(bstrFilePath,
bstrText,
bstrBgImg,
lCSet,
bstrFont,
lWidth,
lHeight,
lLeft,
lTop,
llfHeight,
lWeight,
l3D);
if(SUCCEEDED(hr))
*pVal = 0;
else
*pVal = -1;
return S_OK;
}
OutTextImg 函数只简单调用OutImgFromText 接口。
STDMETHODIMP CAspImage::OutImg(BSTR bstrFileName, long lDelFile)
{
// TODO: Add your implementation code here
_variant_t vReturnBuffer;
LPSAFEARRAY psaFile;
HANDLE hFile;
DWORD dwSizeOfFile;
DWORD dwNumberOfBytesRead;
BOOL bResult;
unsigned char *pReturnBuffer = NULL;
long k;
HRESULT hr = S_OK;
// Create file in this case only OPENS an existing file (or fails
// if the file does not exist!)
hFile = ::CreateFile(
bstrFileName, // name of the file
GENERIC_READ, // desired access
FILE_SHARE_READ, // shared access
NULL, // security attributes
OPEN_EXISTING, // creation disposition - open only if existing!
FILE_FLAG_SEQUENTIAL_SCAN, // flag attributes
NULL );
if( hFile == INVALID_HANDLE_VALUE )
{
return E_FAIL;
}
dwSizeOfFile = ::GetFileSize( hFile, NULL );
if (dwSizeOfFile == 0xFFFFFFFF)
{
return E_FAIL;
}
pReturnBuffer = new unsigned char[dwSizeOfFile];
// Get the binary content of the file
bResult = ::ReadFile( hFile, pReturnBuffer, dwSizeOfFile, &dwNumberOfBytesRead, NULL );
if( FALSE == bResult )
{
return E_FAIL;
}
psaFile = ::SafeArrayCreateVector( VT_UI1 , 0, dwSizeOfFile );
if( !psaFile )
{
return E_FAIL;
}
// Fill in the SAFEARRAY with the binary content of the file
for( k = 0; k < (int) dwSizeOfFile; k )
{
if( FAILED(::SafeArrayPutElement( psaFile, &k, &pReturnBuffer[k] )) )
{
return E_FAIL;
}
}
vReturnBuffer.vt = VT_ARRAY | VT_UI1;
V_ARRAY(&vReturnBuffer) = psaFile;
m_piResponse->BinaryWrite(vReturnBuffer);
if( pReturnBuffer )
delete [] pReturnBuffer;
//_variant_t vOut("OutImg TEST....................");
//m_piResponse->Write(vOut);
::CloseHandle(hFile);
if(lDelFile != 0)
::DeleteFile(bstrFileName);
return SUCCEEDED(hr) ? S_OK : E_FAIL;
return S_OK;
} 本文章更多内容:1 - 2 - 3 - 下一页>> |