新颖网络文件上传插件开发文档For VC6
时间:2010-09-05 来源:XproerStorage
版权所有 2009-2010 北京新颖网络
保留所有权利
官方网站:http://www.ncmem.com
官方博客:http://www.cnblogs.com/xproer
产品论坛:http://www.5gzl.com/bbs/
联系邮箱:[email protected]
Visual Studio 6.0示例下载:http://www.ncmem.com/download/FileUploaderDemoVC6.rar
联系QQ:1085617561
1. C++包装对象
1.1. FileUploaderImpl类
类型:C++
头文件:FileUploaderImpl.h
说明:文件上传对象的包装类,用户在实际的项目中只需要创建FileUploaderImpl对象,然后通过FileUploader对象就可以进行文件上传操作。
方法
|
名称 |
说明 |
Post |
开始上传文件 |
|
SetUserName |
设置FTP用户名 |
|
SetUserPass |
设置FTP用户密码 |
|
Stop |
停止上传文件 |
Post方法
开始上传文件。
说明:此函数将会自动实现断点续传功能。如果当前任务文件只上传了一半,则在下次开始时FileUploader组件将会自动定位到上次上传的位置继续上传数据。
Stop方法
停止上传任务。
SetUserName方法
设置FTP用户名称。
SetUserPass方法
设置FTP用户密码。
this->m_Uploader.SetUserName("test");
创建FileUploaderImpl示例
FileUploaderImpl m_Uploader;//上传对象
GUID clsid;
HRESULT hr = ::CLSIDFromProgID(L"XproerWebPlug.FileUploader.1",&clsid);
if ( SUCCEEDED(hr) ) hr = this->m_Uploader.CreateDispatch(clsid);
1.2. FileUploaderEventImpl类
类型:C++
头文件:FileUploaderEventImpl.h
文件上传组件事件包装类。
事件
TransferComplete事件
文件上传完毕。
语法:
STDMETHOD(TransferComplete)(ULONG taskID);
参数:
taskID 任务唯一标识。
TransferConnected事件
服务器连接成功事件。
语法:
STDMETHOD(TransferConnected)(ULONG taskID);
参数:
taskID 任务唯一标识。
TransferConnectedError事件
服务器连接失败事件。
语法:
STDMETHOD(TransferConnectedError)(ULONG taskID);
参数:
TransferData事件
数据上传事件。每上传成功指定长度的数据将会触发此事件。
语法:
STDMETHOD(TransferData)(ULONG taskID, BSTR speed, BSTR postedLength, BSTR percent, BSTR time);
参数:
TransferError事件
数据上传失败事件。
语法:
STDMETHOD(TransferError)(ULONG taskID, ULONG errCode);
参数:
taskID 任务的唯一标识。
errCode 错误码
class FileUploaderError
{
public:
enum V
{
Unknow = 0,//未知错误
LocalFileEmpty=1,//本地文件名为空
RemoteFileEmpty=2,//远程文件为空
IpEmpty=3,//IP为空
UserNameEmpty=4,//用户名为空
UserPassEmpty=5,//密码为空
ConnectServer=6,//连接服务器失败
UserNamePass=7,//用户名密码错误
OpenFileFailed=8,//打开文件失败
PostDataFailed=9,//传输数据失败
LocalFileSize1G=10,//超出指定文件大小
UnRecover=11,
RemoteFolderFail=12,//远程文件夹错误
RemoteHasFile=13,//服务器已存在此文件
UploaderFolder=14,//上传路径错误
ServerTimeOut=15//服务器超时
};
};
TransferStop事件
文件上传停止事件。
语法:
STDMETHOD(TransferStop)(ULONG taskID);
参数:
taskID 任务唯一标识。
连接COM事件示例
GUID clsid;
HRESULT hr = ::CLSIDFromProgID(L"XproerWebPlug.FileUploader.1",&clsid);
if ( SUCCEEDED(hr) ) hr = this->m_Uploader.CreateDispatch(clsid);
LPDISPATCH disp = this->m_Uploader;
if ( SUCCEEDED(hr) ) hr = disp->QueryInterface(IID_IFileUploader,(void**)&this->m_IUpload);
if( SUCCEEDED(hr) )
{
this->m_UploaderEventImpl.DispEventAdvise(this->m_IUpload);//连接上传事件
this->m_UploaderEventImpl.Reciver = this;//连接逻辑事件
}
1.3. FileTransferEvent类
类型:C++
头文件:FileTranserEvent.h
说明:事件接口。如果客户端需要处理文件上传和下载组件的事件则需要实现此类的虚函数。
方法
OnFileTransferComplete方法
文件传输完毕方法。
语法:
virtual void OnFileTransferComplete( ULONG taskID) = 0;
OnFileTransferError方法
文件传输错误。
语法:
virtual void OnFileTransferError( ULONG taskID, ULONG errCode) = 0;
OnFileTransferStop方法
文件传输停止
语法:
virtual void OnFileTransferStop( ULONG taskID) = 0;
OnFileTransferData方法
文件数据传输成功。
语法:
virtual void OnFileTransferData( ULONG taskID, BSTR speed, BSTR postedLength, BSTR percent, BSTR time) = 0;
OnFileTransferConnected方法
服务器连接成功。
语法:
virtual void OnFileTransferConnected( ULONG taskID) = 0;
OnFileTransferConnectedError方法
服务器连接失败。
语法:
virtual void OnFileTransferConnectedError( ULONG taskID) = 0;
1.4. FileDownloaderImpl类
类型:C++
头文件:FileDownloaderImpl.h
说明:文件下载组件包装类。
1.5. FileDownloaderEventImpl类
类型:C++
头文件:FileDownloaderEventImpl.h
说明:文件下载组件事件包装类。
2. COM组件
2.1. XproerWebPlug.FileUploader组件
类型:COM
CLSID:E7BAAB0A-C304-45A6-8065-FA648A9B2EC3
ProgID:XproerWebPlug.FileUploader.1
说明:文件上传组件。提供文件断点续传,超大文件上传功能。
2.2. XproerWebPlug.FileDownloader组件
类型:COM
CLSID:4FAF81E6-6B52-44E9-BE02-4FC2976F4FC4
ProgID:XproerWebPlug.FileDownloader.1
说明:文件下载组件。提供文件断续续传,超大文件下载功能。
3. 在项目中使用文件上传组件
示例下载:
3.1. 步骤
1. 注册新颖网络文件上传组件。
2. 初始化COM环境。
3. 添加头文件。
4. 添加变量。
5. 创建COM组件,并连接事件。
6. 关闭应用程序时断开事件。
注册新颖网络文件上传组件。
注册命令
regsvr32 FileUploader.dll
初始化COM环境
使用ATL前必须包含以下头文件:atlbase.h和atlcom.h,并且定义_Module变量[2]。把以下代码加到 stdafx.h:
#include <atlbase.h>
extern CComModule _Module;
#include <atlcom.h>
在 Project.cpp 文件中要对 _Module 进行定义。如下:
CDemoApp::CDemoApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CDemoApp object
CDemoApp theApp;
CComModule _Module;//添加对 _Module 的定义
/////////////////////////////////////////////////////////////////////////////
// CDemoApp initialization
BOOL CDemoApp::InitInstance()
{}
修改InitInstance()函数
BOOL CDemoApp::InitInstance()
{
AfxEnableControlContainer();
_Module.Init(NULL, (HINSTANCE)GetModuleHandle(NULL));//初始化COM环境
::CoInitialize(NULL);//初始化COM
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CDemoDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
修改ExitInstance()函数
int CDemoApp::ExitInstance()
{
::CoUninitialize();
_Module.Term();
return CWinApp::ExitInstance();
}
添加头文件
#include "com/FileUploaderImpl.h"
#include "com/FileDownloaderImpl.h"
#include "com/FileUploaderEventImpl.h"
#include "com/FileDownloaderEventImpl.h"
#include "com/FileTransferEvent.h"
建议:将C++包装类文件放在com文件夹中,这样便于项目管理。
添加COM变量
FileUploaderImpl m_Uploader;//上传对象
FileDownloaderImpl m_Downloader;//下载对象
FileUploaderEventImpl m_UploaderEventImpl;//上传事件接收器
FileDownloaderEventImpl m_DownloaderEventImpl;//下载事件接收器
IFileUploader* m_IUpload;//上传接口
IFileDownloader* m_IDownloader;//下载接口
创建COM组件,并连接事件
//创建上传组件
GUID clsid;
HRESULT hr = ::CLSIDFromProgID(L"XproerWebPlug.FileUploader.1",&clsid);
if ( SUCCEEDED(hr) ) hr = this->m_Uploader.CreateDispatch(clsid);
LPDISPATCH disp = this->m_Uploader;
if ( SUCCEEDED(hr) ) hr = disp->QueryInterface(IID_IFileUploader,(void**)&this->m_IUpload);
if( SUCCEEDED(hr) )
{
this->m_UploaderEventImpl.DispEventAdvise(this->m_IUpload);//连接上传事件
this->m_UploaderEventImpl.Reciver = this;//连接逻辑事件
}
//创建下载组件
hr = ::CLSIDFromProgID(L"XproerWebPlug.FileDownloader.1",&clsid);
if (SUCCEEDED(hr)) hr = this->m_Downloader.CreateDispatch(clsid);
disp = this->m_Downloader;
if ( SUCCEEDED(hr) ) hr = disp->QueryInterface(IID_IFileDownloader,(void**)&this->m_IDownloader);
if ( SUCCEEDED(hr) )
{
this->m_DownloaderEventImpl.DispEventAdvise(this->m_IDownloader);//连接下载事件
this->m_DownloaderEventImpl.Reciver = this;//连接逻辑事件
}
关闭应用程序时断开事件
在应用程序退出时必须要断开COM事件,否则应用程序将会出现错误无法正常退出。
void CDemoDlg::OnDestroy()
{
CDialog::OnDestroy();
if (this->m_IUpload)
{
this->m_UploaderEventImpl.DispEventUnadvise(this->m_IUpload);//取消事件
}
if (this->m_IDownloader)
{
this->m_DownloaderEventImpl.DispEventUnadvise(this->m_IDownloader);//取消下载事件
}
}