在ATL中支持MFC的CSocket (转)

本文介绍了一个基于MFC的CSocket控件——SendFile,该控件能够实现单个文件及其相关联文件的传输功能。文章详细阐述了SendFile的设计思路、使用方法及在VB中的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ATL中支持MFC的CSocket (转)[@more@]

SendFile  XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

 

1.  功能:

 

SendFile 可传送(任意形式)单个文件(档),如果为web页,则同时可以将其同名  . files目录下的所有文件一起传送。

 

2、设计思路:

 

¨  根据用户选择需要传送的文件,获得文件的一些相关信息(主要是文件名),然后开始传送文件到服务器或者是客户端;

¨  判断是否存在同名 . files 目录,如果存在的话,则遍历该目录,每获得一个文件名,即将该文件发送;

¨  遍历结束,释放所有资源。

 

3控件使用:

 

  控件有含有唯一一个Daul接口 FileWork 运行时不可见;该接口含有唯一一个方法 TransDoc

  TransDoc 参数说明:

¨  BSTR ServerName :为domINO服务器名;

¨  BSTR HostName  : 为主机名或者主机IP地址

¨  UINT Port  :主机端口号;

¨  BSTR User  :当前用户名;

¨  BSTR Password  :当前用户密码;

¨  BSTR DocFilename :文件全名;

¨  BSTR uDatabase  :Domino 数据库名;

¨  BSTR uForm  :Domino 表单名;

  注:BSTR 为Basic String/Binary String,在VB中表现为String 类型。

 

4、范例:

 

 

  下面我给出一个在VB中使用该空间的范例:

¨  新建一个标准EXE工程;

¨  在Form上添加一个TEXTBOX,两个COMMAND BUTTON,一个COMMON DIALOG。属性如下:

  Control  name  Property

    TextBox    txtFilename   

   Command Button1    caption 浏览…

Command Button2  caption 发送文件

 

 

代码:

 

Private Sub Command1_Click()

 

  CommonDialog1.ShowOpen

 

  txtFilename.Text = CommonDialog1.FileName

End Sub

 

Private Sub Command2_Click()

FileWork1.TransDoc "Domserver", "10.128.0.3", 1028, "zhangchunye",  "zhangchunye", txtFilename.Text, "Test", "Test"

End Sub

现代码:

 

// FileWork.cpp : Implementation of CFileWork

 

#include "stdafx.h"

#include "SendFile.h"

#include "FileWork.h"

 

 

#include

/

// CFileWork

 

 

 

 

STDMETHODIMP CFileWork::TransDoc(BSTR ServerName,BSTR Hostname,int Port,BSTR User,BSTR password,BSTR DocFilename,BSTR uDatabase,BSTR  uForm)

{

  AFX_MANAGE_STATE(AfxGetStaticModuleState())

 

  // TODO: Add your implementation code here

 

  USES_CONVERSION;

 

 

  AfxSocketInit(NULL);

  CSocket sockClient;

  sockClient.Create();

 

  m_HostName = OLE2T(Hostname);

  m_Port    = Port; 

//  MessageBox(m_HostName,_T("HostName!"),MB_OK);

 

  if(!sockClient.Connect(m_HostName,Port))

  {

  AfxMessageBox("连接到对方机器失败!");

  return 0;

  }

 

  m_UserName = OLE2T(User) ; 

  m_Password = OLE2T(password) ;

  //发送用户名和密码要求登陆

 

  //用户名和密码需要加密。然后再发送。

  sockClient.Send(m_UserName,strlen(m_UserName));

  sockClient.Send(m_Password,strlen(m_Password));

  sockClient.Send(m_ServerName,strlen(m_ServerName));

  sockClient.Send(m_Database,strlen(m_Database));

  sockClient.Send(m_Form,strlen(m_Form));

  用户名和密码通过验证,可以发送文件

 

  char* filename = OLE2T(DocFilename);

  CFile myFile;

  if(!myFile.Open( filename ,/* conversion BSTR to char* */

  CFile::modeRead | CFile::typeBinary))

  {

 

  return 0;

  }

  SOCKET_STREAM_FILE_INFO  StreamFileInfo;

  win32_FIND_DATA  FindFileData;

 

  FindClose(FindFirstFile(myFile.GetFilePath(),&FindFileData));

  memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));

  strcpy(StreamFileInfo.szFileTitle,myFile.GetFileName());

 

  StreamFileInfo.nFileSizeLow  =  FindFileData.nFileSizeLow;

 

  sockClient.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO));

 

  UINT dwRead=0;

  while(dwRead

  {

  byte* data = new byte[5120];

  UINT dw=myFile.Read(data, 5120);

  sockClient.Send(data, dw);

  dwRead+=dw;

  }

  //以下代码设置.htm同名  .files目录。

  char szCurDir[256] ;

 

  ::GetCurrentDirectory(sizeof(szCurDir),szCurDir);

    LPCSTR filetitle;

  filetitle = (LPCTSTR) myFile.GetFileTitle();

  strcat(szCurDir,"");

  strcat(szCurDir,filetitle);

  strcat(szCurDir,".files");

 

  //设置目录结束。

 

 

  myFile.Close();

  Recurse(T2OLE(szCurDir));

 

  LPTSTR m_EndCode = "000";

  sockClient.Send(m_EndCode,strlen(m_EndCode));

  MessageBox(_T("信息发布成功!"),_T("信息发布"),MB_ICONINFORMATION|MB_OK);

  sockClient.Close();

  return S_OK;

};

 

// stdafx.h : include file for standard system include files,

//  or project specific include files that are used frequently,

//  but are changed infrequently

 

#if !defined(AFX_STDAFX_H__0AC71DA2_A0CD_4AA6_8E23_5C459FD52A59__INCLUDED_)

#define AFX_STDAFX_H__0AC71DA2_A0CD_4AA6_8E23_5C459FD52A59__INCLUDED_

 

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

 

#define STRICT

#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0400

#endif

#define _ATL_APARTMENT_THREADED

 

#include

#include

 

#include

//You may derive a class from CComModule and use it if you want to override

//something, but do not change the name of _Module

extern CComModule _Module;

#include

#include

#include

#include

#include

#include  

 

#include

 

 

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

 

#endif // !defined(AFX_STDAFX_H__0AC71DA2_A0CD_4AA6_8E23_5C459FD52A59__INCLUDED)

 

 

 

// This file will be processed by the MIDL tool to

// produce the type library (SendFile.tlb) and marshalling code.

 

import "oaidl.idl";

import "ocidl.idl";

#include "olectl.h"

 

 

  [

  object,

  uuid(68C3C9C3-08CF-4B80-8C8A-1A1503EAF27B),

  dual,

  helpstring("IFileWork Interface"),

  pointer_default(unique)

  ]

  interface IFileWork : IDispatch

  {

 

  [id(1), helpstring("method TransDoc")] HRESULT TransDoc([in]BSTR ServerName,[in]BSTR Hostname,[in]int Port,[in]BSTR User,[in]BSTR password,[in]BSTR DocFilename,[in]BSTR uDatabase,[in]BSTR  uForm);

 

  };

 

[

  uuid(AACF2ED6-2C63-4A9F-B2db-05FD8EBDDB7E),

  version(1.0),

  helpstring("SendFile 1.0 Type Library")

]

library SENDFILELib

{

  importlib("stdole32.tlb");

  importlib("stdole2.tlb");

 

  [

  uuid(E3A8C76D-FD5C-4DF6-9D90-DDD47EC8567C),

  helpstring("_IFileWorkEvents Interface")

  ]

  dispinterface _IFileWorkEvents

  {

  properties:

  methods:

  };

 

  [

  uuid(4D8F2BCB-0546-4DFA-AC6E-C2C3BC26BE38),

  helpstring("FileWork Class")

  ]

  coclass FileWork

  {

  [default] interface IFileWork;

  [default, source] dispinterface _IFileWorkEvents;

  };

};

 

 

 

 

 

// FileWork.h : Declaration of the CFileWork

 

#ifndef __FILEWORK_H_

#define __FILEWORK_H_

 

#include "resource.h"  // main symbols

#include

#include "SendFileCP.h"

 

/add class

typedef struct _SOCKET_STREAM_FILE_INFO {

 

  TCHAR  szFileTitle[128];  //文件的标题名

  DWORD  dwReserved1;   //保留,为0

 

} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO;

/

// CFileWork

class ATL_NO_VTABLE CFileWork :

  public CComObjectrootEx,

  public IDispatchImpl,

  public CComControl,

  public IPersistStreamInitImpl,

  public IOleControlImpl,

  public IOleObjectImpl,

  public IOleInPlaceActiveObjectImpl,

  public IViewObjectExImpl,

  public IOleInPlaceObjectWindowlessImpl,

  public ISupportErrorInfo,

  public IConnectionPointContainerImpl,

  public CComCoClass,

  public CProxy_IFileWorkEvents< CFileWork >

{

public:

  CFileWork()

  {

  m_pUnkMarshaler = NULL;

  }

 

DECLARE_GET_CONTROLLING_UNKNOWN()

DECLARE_REGISTRY_RESOURCEID(IDR_FILEWORK)

 

DECLARE_PROTECT_FINAL_CONSTRUCT()

 

BEGIN_COM_MAP(CFileWork)

  COM_INTERFACE_ENTRY(IFileWork)

  COM_INTERFACE_ENTRY(IDispatch)

  COM_INTERFACE_ENTRY(IViewObjectEx)

  COM_INTERFACE_ENTRY(IViewObject2)

  COM_INTERFACE_ENTRY(IViewObject)

  COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)

  COM_INTERFACE_ENTRY(IOleInPlaceObject)

  COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)

  COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)

  COM_INTERFACE_ENTRY(IOleControl)

  COM_INTERFACE_ENTRY(IOleObject)

  COM_INTERFACE_ENTRY(IPersistStreamInit)

  COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)

  COM_INTERFACE_ENTRY(ISupportErrorInfo)

  COM_INTERFACE_ENTRY(IConnectionPointContainer)

  COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)

  COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)

END_COM_MAP()

 

BEGIN_PROP_MAP(CFileWork)

  PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)

  PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)

  // Example entries

  // PROP_ENTRY("Property Description", dispid, clsid)

  // PROP_PAGE(CLSID_StockColorPage)

END_PROP_MAP()

 

BEGIN_CONNECTION_POINT_MAP(CFileWork)

CONNECTION_POINT_ENTRY(DIID__IFileWorkEvents)

END_CONNECTION_POINT_MAP()

 

BEGIN_MSG_MAP(CFileWork)

  CHAIN_MSG_MAP(CComControl)

  DEFAULT_REFLECTION_HANDLER()

END_MSG_MAP()

// Handler prototypes:

//  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

//  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

//  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

 

 

 

  HRESULT FinalConstruct()

  {

  return CoCreateFreeThreadedMarshaler(

  GetControllingUnknown(), &m_pUnkMarshaler.p);

  }

 

  void FinalRelease()

  {

  m_pUnkMarshaler.Release();

  }

 

  CComPtr m_pUnkMarshaler;

 

// ISupportsErrorInfo

  STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)

  {

  static const IID* arr[] =

  {

  &IID_IFileWork,

  };

  for (int i=0; i

  {

  if (InlineIsEqualGUID(*arr[i], riid))

  return S_OK;

  }

  return S_FALSE;

  }

 

// IViewObjectEx

  DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

 

// IFileWork

public:

  LPTSTR m_Form;

  LPTSTR m_Database;

  HRESULT SendFile(BSTR DocFile);

  void Recurse(BSTR FilePath);

 

  LPTSTR m_ServerName;

 

  LPTSTR m_HostName;

  int m_Port;

  LPTSTR m_UserName;

  LPTSTR m_Password;

  CSocket sockClient;

 

STDMETHOD(TransDoc)(/*[in]*/BSTR  ServerName,/*[in]*/BSTR Hostname,/*[in]*/int Port,/*[in]*/BSTR User,/*[in]*/BSTR password,/*[in]*/BSTR DocFilename,/*[in]*/BSTR uDatabase,/*[in]*/BSTR  uForm);

 

  HRESULT OnDraw(ATL_DRAWINFO& di)

  {

  RECT& rc = *(RECT*)di.prcBounds;

  Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom);

 

  SetTextAlign(di.hdcDraw, TA_CENTER|TA_BASELINE);

  LPCTSTR pszText = _T("ATL 3.0 : FileWork");

  TextOut(di.hdcDraw,

  (rc.left + rc.right) / 2,

  (rc.top + rc.bottom) / 2,

  pszText,

  lstrlen(pszText));

 

  return S_OK;

  }

};

 

#endif //__FILEWORK_H_

 

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-979928/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752019/viewspace-979928/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值