您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:21 来源:vckbase.com

本文章共4978字,分3页,当前第1页,快速翻页:
 

利用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 - 下一页>>
相关文章

从 ADO 迁移到 ADO.NET(一)
获得 Win32 窗口句柄的更好的方法
关于 IDispatch 接口的 LPDispatch 属性的实
用ATL开发复合控件
后缀表达式求值及校验
浅谈PDFlib中文输出(四)PDFlib 接收的几种
事件编程(二)
用鼠标手势动作来发送命令
在VC中使用 Flash 美化你的程序
更改屏幕显示数据的作弊程序
可设置单元格颜色的ClistCtrl类
IP Messenger 详细分析
C :使用 Visual C 2005 的现代语言特色
毫秒定时器
类似于FlashGet的悬浮框的制作
不重起Windows直接更改IP地址
MFC程序员的WTL指南: 中文版序言
COM 组件设计与应用(五)——用 ATL 写第一
编写多文档应用程序
PhotoShop插件开发之选区(Selection)

相关评论


本文章所属分类:首页 VC++

  热门关键字: