MFC activeX中如何传递自定义结构

林夕合鸟 2008-01-15 11:46:59
如题,也就是再Ctrl类中,thankyou 了先!
不是ATL啊!
...全文
244 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
AutoWalk 2008-12-03
  • 打赏
  • 举报
回复
如果我要在C#中使用这个控件呢?怎么把BSTR转成EPOINT结构?
林夕合鸟 2008-01-25
  • 打赏
  • 举报
回复
不好意思到现在才结贴阿!
美丽海洋 2008-01-22
  • 打赏
  • 举报
回复
gz
teli_eurydice 2008-01-22
  • 打赏
  • 举报
回复
本地的就直接传 指针,不在本地就封装成接口
lsyxp17 2008-01-18
  • 打赏
  • 举报
回复
来学习一下
jameshooo 2008-01-18
  • 打赏
  • 举报
回复

template<class T>
class CBSTR
{
protected:
BSTR bstr;
T* pT;

public:
CBSTR() : bstr(NULL), pT(NULL) {}
CBSTR(const T& other)
{
bstr = ::SysAllocStringByteLen((char*)&other, sizeof(T));
pT = &other;
}
CBSTR(BSTR obstr)
{
bstr = obstr;
pT = (T*)obstr;
}

~CBSTR()
{
if (bstr)
{
::SysFreeString(bstr);
bstr = NULL;
}
pT = NULL;
}

operator BSTR() { return bstr; }
operator T*() { return pT; }
};

CBSTR<EDPoint> bstred(empPoint);
pInterface->MethodIn((BSTR)bstred, ...);

BSTR outbstr = NULL;
pInterface->MethodOut(&outbstr);
CBSTR<EDPoint> bstred2(outbstr);
EdPoint* pedp = bstred2;
pedp->x;
pedp->y;
林夕合鸟 2008-01-18
  • 打赏
  • 举报
回复
Typedef struct EDPoint
{
Double x;
Double y;
}EDPoint;
EDPoint tmpPoint;
一、 BSTR方式传递自定义结构体参数;
1. 如何从BSTR转化为EDPoint:
memcpy(&tmpPoint, (LPVOID)bstr, sizeof(tmpPoint));
2. 如何从EDPoint转化为BSTR;
BSTR bstr = SysAllocStringByteLen((char*)& tmpPoint, sizeof(tmpPoint));


二、 BYTE流方式传递自定义结构体参数;
1. 如何从BYTE流转化为EDPoint;
PBYTE bOut[Max];
EDPoint tmpPoint;
Memset(&tmpPoint,0,sizeof(tmpPoint));
Memcpy((LPVOID)& tmpPoint,&bOut,sizeof(tmpPoint));
----memset( &tData, 0, sizeof(ATTRINFO) );
----memcpy( &tData, pIn, sizeof(ATTRIINFO) );

2. 如何从EDPoint转化为BYTE流;
Memset(&bOut,0,Max);
Memcpy(&bOut,(LPVOID)& tmpPoint,sizeof(tmpPoint));
三、 Variant方式传递自定义结构体参数;
初始化:
EDPoint * tmpPoint = NULL;
VARIANT tmpVar;
tmpPoint =(EDPoint*)CoTaskMemAlloc(sizeof(EDPoint));
1. 如何从Variant转化为EDPoint:
tmpPoint = (EDPoint*) tmpVar.byref;

2. 如何从EDPoint转化为Variant:
tmpVar.byref =(LPVOID) tmpPoint;
结束:
CoTaskMemFree((LPVOID) tmpVar);

不过都觉得太过繁了,大家帮忙整个简单的哈!
我如果在外面需要调用需要先将EDPoint转换成BSTR、BYTE..返回后又得转过来,太累了!
指针是如何做的呢?
mgtcllxl 2008-01-18
  • 打赏
  • 举报
回复
mark
林夕合鸟 2008-01-16
  • 打赏
  • 举报
回复
先谢谢jameshooo,我刚刚加了100分,希望可以继续知道其他方法,可以非常好地解决这样的一个问题,不过jameshooo的分已经预订了。结贴得时候一定给。
我是VC新手,希望大家可以告诉下:
以上的自定义结构是否可以用指针来传,是否可以,应该怎么做?
还有就是我想问一下,MFC ActiveX和ATL究竟有多大的区别呢?
是否就仅仅是MFC支持类库,比较大;而ATL比较小,这样的话,如果我的ActiveX用到很多Form是不是就应该用MFC了。
还有如果MFC ActiveX和ATL对象混用,会产生什么样的恶果呢?

谢谢了!
jameshooo 2008-01-15
  • 打赏
  • 举报
回复
一样的过程:
CYourStruct ys;
memcpy(&ys, (LPVOID)bstr, sizeof(ys));
林夕合鸟 2008-01-15
  • 打赏
  • 举报
回复
怎么会没有人呢?
如何将BSTR类型转化为CYourStruct类型呢?
55!
林夕合鸟 2008-01-15
  • 打赏
  • 举报
回复
实在不好意思,最后一个问题,如何解析此BSTR成为CYourStruct呢,
谢谢了!立刻结贴给分!
jameshooo 2008-01-15
  • 打赏
  • 举报
回复
CYourStruct ys;
ys.aa = ...;
BSTR bstr = SysAllocStringByteLen((char*)&ys, sizeof(ys));
林夕合鸟 2008-01-15
  • 打赏
  • 举报
回复
具体点吧!我也隐约知道,可以用BSTR、SafeArray和Variant,指针应该也可以,好汉还能写点具体点的代码,感激不尽啊!
那个SafeArray难看得一米多高的!
jameshooo 2008-01-15
  • 打赏
  • 举报
回复
使用BSTR或者SAFEARRAY封装你的结构内容
林夕合鸟 2008-01-15
  • 打赏
  • 举报
回复
大虾们帮个忙来,最好是简单点的,不知道,指针是否可以,谢谢了!具体如上图所示!。。。
林夕合鸟 2008-01-15
  • 打赏
  • 举报
回复
图片还能放啊!赫,试试!
林夕合鸟 2008-01-15
  • 打赏
  • 举报
回复
比如,我的工程文件叫做GQTest,在对象栏中找到GQTestLib,他的子目录中有"GQTest Control 的调度接口":_GQTest
选中右健添加方法。
此时即使我在idl中定义了Struct应该也还是不形吧!
  • 打赏
  • 举报
回复
不是atl那么就在odl文件中定义,最次的解决方案是将这个struct包装成COM对象.
ouyh12345 2008-01-15
  • 打赏
  • 举报
回复
在odl中,把结构定义好
主要介绍如何开发一个ActiveX控件,提供接口,与相应事件挂钩。文涉及到VARIANT,SAFEARRAY,BSTR的详细使用方法。 另外还提供了WinSock的详细开发步骤,以及如何响应网络超时,网络断开的事件方法以及在VC,VB调用该控件的方法。 一、MFC ActiveX控件开发步骤(VC 6.0): New->Projects->MFC ActiveX ControlWizard,然后输入MFCWinSock工程名。如下图: 图一 创建工程 一路狂按Next,直至Finsh出现,再按下OK,如下图:     图二 创建完成 二、架设Socket环境: 首先在StdAfx.h文件加入下面这句代码: #include // MFC socket extensions 打开MFCWinSock.cpp文件,添加代码,看起来如下: //////////////////////////////////////////////////////////////////////////// // CMFCWinSockApp::InitInstance - DLL initialization BOOL CMFCWinSockApp::InitInstance() { BOOL bInit = COleControlModule::InitInstance(); if (bInit) { // TODO: Add your own module initialization code here. if (!AfxSocketInit()) { AfxMessageBox("无法初始化Socket,请检查!"); return FALSE; } WSADATA wsaData; WORD wVersion = MAKEWORD(1, 1);//设定为Winsock 1.1版 int errCode; errCode = WSAStartup(wVersion, &wsaData);//启动Socket服务 if (errCode) { AfxMessageBox("无法找到可以使用的 WSOCK32.DLL"); return FALSE; } } return bInit; } //////////////////////////////////////////////////////////////////////////// // CMFCWinSockApp::ExitInstance - DLL termination int CMFCWinSockApp::ExitInstance() { // TODO: Add your own module termination code here. WSACleanup();//结束网络服务 return COleControlModule::ExitInstance(); } 三,提供控件接口和事件 在MFCWinSockCtl.cpp加入如下代码: #ifndef WM_MYWINSOCK #define WM_MYWINSOCK WM_USER+1888 #endif View->ClassWizard->Automation->Add Method…如下图: 图三 创建接口 这个时候,我们为这个控件添加了一个Connect()的接口,出于通用性,安全性和扩展性的考虑,我们采用了VARIANT类型的参数, 很多人可能都不太了解该类型,又或者有接触过,但被吓怕了,那么我们来看清它的本来面目: struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { LONG lVal; BYTE bVal; SHORT iVal; FLOAT fltVal; DOUBLE dblVal; VARIANT_BOOL boolVal; _VARIANT_BOOL bool; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown __RPC_FAR *punkVal; IDispatch __RPC_FAR *pdispVal; SAFEARRAY __RPC_FAR *parray; BYTE __RPC_FAR *pbVal; SHORT __RPC_FAR *piVal; LONG __RPC_FAR *plVal; FLOAT __RPC_FAR *pfltVal; DOUBLE __RPC_FAR *pdblVal; VARIANT_BOOL __RPC_FAR *pboolVal; _VARIANT_BOOL __RPC_FAR *pbool; SCODE __RPC_FAR *pscode; CY __RPC_FAR *pcyVal; DATE __RPC_FAR *pdate; BSTR __RPC_FAR *pbstrVal; IUnknown __RPC_FAR *__RPC_FAR *ppunkVal; IDispatch __RPC_FAR *__RPC_FAR *ppdispVal; SAFEARRAY __RPC_FAR *__RPC_FAR *pparray; VARIANT __RPC_FAR *pvarVal; PVOID byref; CHAR cVal; USHORT uiVal; ULONG ulVal; INT intVal; UINT uintVal; DECIMAL __RPC_FAR *pdecVal; CHAR __RPC_FAR *pcVal; USHORT __RPC_FAR *puiVal; ULONG __RPC_FAR *pulVal; INT __RPC_FAR *pintVal; UINT __RPC_FAR *puintVal; struct __tagBRECORD { PVOID pvRecord; IRecordInfo __RPC_FAR *pRecInfo; } __VARIANT_NAME_4; } __VARIANT_NAME_3; } __VARIANT_NAME_2; DECIMAL decVal; } __VARIANT_NAME_1; }; 它先是一个结构体,里面有一个重要成员VARTYPE vt;vt即是指明当前的数据类型,比如整型或者字符型,当指明vt后, 后面看到各种变量类型包括在一个联合体当,也就是说指明vt后,你只能使用对应的其之一变量类型。看着这众多的各种不同 类型变量集在一起,确实让人吓了一跳,但细细看来,大多数变量跟我们平时的用法相似。值得一提的是SAFEARRAY __RPC_FAR *parray; 也许有很多人还没有接触过SAFEARRAY类型的变量,SAFEARRAY实际上也是一个结构,大家可以参考MSDN,我也将在后面介绍它的具体使用方法。 用同样的方法创建DisConnect()接口 创建两个事件,FireCloseWinsock()响应网络断开事件,FireRecvSockEvent()响应网络有数据到达的事件。创建方法如下图: 图四 创建事件 重载控件消息处理函数WindowProc(),在View->ClassWizard打开类向导,在消息映射找到WindowProc,如下图: 图五 重载WindowProc() 四、编写代码 编写VariantToLong()转换函数,该函数代码如下: //类型转换,将VARIANT类型转换成Long类型 long CMFCWinSockCtrl::VariantToLong(const VARIANT &var) { long r; switch(var.vt) { case VT_UI2://USHORT r = var.uiVal; break; case VT_UI4://ULONG r = var.ulVal; break; case VT_INT://INT r = var.intVal; break; case VT_UINT://UINT r = var.uintVal; break; case VT_I4://LONG r = var.lVal; break; case VT_UI1://BYTE r = var.bVal; break; case VT_I2://SHORT r = var.iVal; break; case VT_R4://FLOAT r = (long)var.fltVal; break; case VT_R8://DOUBLE r = (long)var.dblVal; break; default: r = -1;//无法转换该值 break; } return r; } 大家可以看到,该函数将最基本的若干数据类型转换成了long类型,但VARIANT决不是个简单的谱,我将在后面继续揭开它的神秘面纱. 编写我们刚才的接口Connect(),代码代码如下: 在MFCWinSockCtrl.h加入 SOCKET OnlySock;//建立的唯一Socket,不允许重复建立多个 bool isOnlyConnect;//是否建立了连接 然后再编写Connect(),看起来如下: BOOL CMFCWinSockCtrl::Connect(const VARIANT FAR& RemoteHost, const VARIANT FAR& RemotePort) { // TODO: Add your dispatch handler code here if(isOnlyConnect)//该连接已建立,还没有断开 return FALSE; CString IPAddress; int Port;//转换成整型的端口 switch(RemoteHost.vt) { case VT_BSTR://字符串型 IPAddress = CString(RemoteHost.bstrVal); break; case VT_BYREF|VT_I1://CHAR * IPAddress.Format("%s",RemoteHost.pcVal);//RemoteHost.pbstrVal); break; default: IPAddress = ""; return FALSE; } Port = VariantToLong(RemotePort);//我们编写的一个VARIANT转换成long类型的函数 if(Port<=0) return FALSE; _TCHAR *ip = 0; struct hostent *host = 0; struct sockaddr_in addr; ULONG dotIP = inet_addr(IPAddress); OnlySock = socket(AF_INET, SOCK_STREAM, 0); // 判断是否为点IP地址格式 if (OnlySock == INVALID_SOCKET) { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; } memset(&addr, 0, sizeof(struct sockaddr_in)); // 设定 SOCKADDR_IN 结构的内容 // 如果通讯协议是选择IP Protocol,那此值固定为AF_INET // AF_INET 与 PF_INET 这两个常量值相同 addr.sin_family = AF_INET; addr.sin_port = htons(Port); addr.sin_addr.S_un.S_addr = dotIP; if (dotIP == INADDR_NONE) { host = gethostbyname(IPAddress); if (!host) { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; }; ip = inet_ntoa(*(struct in_addr*)(*host->h_addr_list)); addr.sin_addr.S_un.S_addr = inet_addr(ip); } //开始连线 if (connect(OnlySock, (LPSOCKADDR)&addr, sizeof(SOCKADDR))) { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; } int iError = WSAAsyncSelect(OnlySock, m_hWnd,WM_MYWINSOCK, FD_READ|FD_CLOSE); //只对网络断开和数据到达通知感兴趣 if(iError == SOCKET_ERROR)//无法绑定Winsock的事件通知 { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有的SOCK资源 return FALSE; } isOnlyConnect = true; return TRUE; } 有必要提一下WSAAsyncSelect(),这里接收网络数据到达和断开的两个消息,我们收到WM_MYWINSOCK消息时将处理该消息并作为事件传送给调用者. 第二个参数,窗口句柄,我们传送了m_hWnd,这是因为MFC ActiveX也属于一个窗口,并且是可见的,因此可以成功。 编写WindowProc(),代码看起来如下: LRESULT CMFCWinSockCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch(message) { case WM_MYWINSOCK://响应自定义的消息 switch(WSAGETSELECTEVENT(lParam)) { case FD_READ://有新数据到达 FireRecvSockEvent(); break; case FD_CLOSE://对方已断掉当前连接 FireCloseWinsock(); break; } break; default: break; } return COleControl::WindowProc(message, wParam, lParam); } 本部分结束语: 好了,现在一个可以运行的控件已经完成,里面提供有Connect()和DisConnect()接口,和RecvSockEvent()及CloseWinsock()事件。以及WinSock的使用方法。 在下一部分(高级篇)将讲解两个重要接口SendData()和GetData(),下期内容如下: long SendData(const VARIANT FAR& Data, const VARIANT FAR& DataType,const VARIANT FAR& DataLength, const VARIANT FAR& TimeOut) long GetData(VARIANT FAR* Data, const VARIANT FAR& DataType, const VARIANT FAR& DataMaxLength, const VARIANT FAR& TimeOut) VARIANT和SAFEARRAY的复杂用法。 控件开发出来后在VC和VB环境下的使用方法。 声明: 部分资料来源于网络,本文所用的所有源代码仅供非商业用途,并请保留原版权,否则后果自负! 欢迎大家拍砖,或指正不足的地方,一起探导更好的方法。 欢迎访问www.59186618.com,感谢您的支持!
说明:本书稿为张孝祥、袁龙友两位老师在2000 年依据张孝祥的vc 讲课记录整理,由于时间关系,仅仅是写成了草稿,欢迎大家使用! 第1 章 掌握C 1.1 类的定义与应用 1.1.1 结构的定义 1.1.2 类的定义 1.1.2.1 类与结构 1.1.2.2 类的使用 (例子代码EX01-00) 1.2 函数的重载 1.2.1 重载参数个数不同的函数 (例子代码EX01-01) 1.2.2 重载参数数据类型不同的函数 (例子代码EX01-02) 1.3 构造函数与析构函数 1.3.1 构造函数 1.3.2 析构函数 (图1,没有)(图2,没有) 1.4 this 指针的引用 1.5 类的继承与protected 访问修饰符 1.5.1 单一继承 (例子代码EX01-03) (图x,没有) 1.5.2 多重继承 1.6 虚函数与多态性 1.7 类的书写规范 1.8 小结 第2 章 Windows 程序内部运行原理 2.1 Windows 应用程序,操作系统,计算机硬件之间的相互关系 2.1.1 关于API (图1,没有) 2.1.2 关于消息及消息队列 (图1、图2 没有) 2.2 什么是句柄 2.3 谈谈WinMain 函数 (例子代码EX02-00) 2.3.1 WinMain 函数的定义及功能 2.3.2 窗口及其生成 2.3.2.1 如何设计一个窗口类——步骤1 2.3.2.2 注册设计好的窗口类——步骤2 2.3.2.3 创建窗口——步骤3 2.3.2.4 显示创建的窗口——步骤4 2.3.3 消息循环 2.3.4 完成回调函数 2.4 程序编写操作步骤与实验 2.5 小结 第3 章 VC 集成开发环境介绍 3.1 Visual C 开发环境 3.1.1 工作区窗格 3.1.2 输出窗格 3.1.3 编辑区 3.1.4 菜单栏、工具栏、状态栏 3.2 系统菜单功能介绍 3.2.1 File 菜单 3.2.2 Edit 菜单 3.2.3 View 菜单 3.2.4 Insert 菜单 3.2.5 Project 菜单 3.2.6 Build 菜单 3.2.6 Tools 菜单 3.2.7 Window 菜单 3.2.8 Help 菜单 3.3 Visual C 重要工具介绍 3.3.1 C/C 编译器 3.3.2 资源编辑器 3.3.3 资源编译器 3.3.4 链接器和调试器 3.3.5 AppWizard 和ClassWizard 3.3.6 资源浏览器 3.3.7 Microsoft 活动模板库、仓库 3.4 小结 第4 章 MFC 应用程序框架剖析 4.1 什么是MFC 以及MFC 的特点 (例子代码EX04-00) 4.2 MFC 应用程序框架 (例子代码EX04-01) 4.3 应用程序框架说明 4.4 文档-视图体系结构 4.4.1 文档-视图相互作用的函数 4.4.2 单文档-视图应用程序结构 4.4.2 多文档-视图应用程序结构 4.5 MFC 消息映射机制 4.5.1 消息的种类 4.5.2 应用程序的Run 函数 4.5.3 消息映射表 4.5.4 如何添加消息映射 4.6 ClssWizard 的使用 4.6.1 ClssWizard 概貌 4.6.2 如何添加消息处理函数 4.6.3 如何添加成员变量 4.6.4 如何添加一个新类 第5 章 图形与文本 5.1 理解图形设备接口 5.2 设备描述表 5.2.1 什么是设备描述表 5.2.2 MFC 的设备描述表类 5.2.3 获取设备描述表 5.3 Windows 的GDI 对象 5.4 GDI 对象的创建 5.4.1 自定义画刷(CBrush) 5.4.2 自定义画笔(CPen) 5.4.3 自定义字体(CFont) 5.5 GDI 对象的使用及示例 5.5.1 画笔的使用 5.5.1.1 在MFC 程序画线 5.5.1.2 在Windows Application 程序画线 5.5.1.3 实现橡皮筋功能 5.5.2 画刷的使用 5.5.2.1 带颜色的画刷的使用 5.5.2.2 带位图的画刷的使用 5.5.3 字体的使用 5.5.3.1 一个简单的文字处理程序 5.5.3.2 模拟卡拉OK 程序 5.5.3.3 剪切区和路径层 第六章 菜单、工具栏和状态栏 6.1 菜单 6.1.1 菜单介绍 6.1.2 创建一个菜单 6.1.2.1 添加一个菜单资源 6.1.2.2 利用菜单编辑器编辑菜单资源 6.1.2.3 将菜单加入到应用程序 6.1.2.4 给菜单项添加COMMAND 消息处理 6.1.2.5 给菜单项添加UPDATE_COMMAND_UI 消息处理 6.1.2.6 一个简单的绘图程序 6.1.3 在应用程序控制菜单 6.1.3.1 在应用程序取得菜单 6.1.3.2 在应用程序修改菜单的状态 6.1.3.3 在应用程序添加、删除、插入菜单或菜单项 6.1.3.4 一个简易的电话本程序 6.1.4 创建快捷方式菜单 6.2 工具栏 6.2.1 工具栏介绍 6.2.1.1 熟悉CToolBar 类 6.2.1.2 AppWizard 是如何创建工具栏 6.2.1.3 利用工具栏编辑器设计工具栏按钮 6.2.2 新建一个工具栏 6.2.3 显示/隐藏工具栏 6.3 状态栏 6.3.1 状态栏介绍 6.3.1.1 熟悉CStatusBar 类 6.3.1.2 AppWizard 是如何创建状态栏 6.3.2 修改状态栏 6.3.2.1 指示器数组 6.3.2.2 修改状态栏窗格 6.3.3 在状态栏上显示鼠标坐标、时钟和进度条 6.3.3.1 在状态栏上显示鼠标坐标 6.3.3.2 在状态栏上显示时钟 6.3.3.3 在状态栏上显示进度条 第七章 对话框和控件 7.1 对话框及控件的介绍 7.1.1 常用控件介绍 7.1.2 对话框介绍 7.1.2.1 对话框的组成 7.1.2.2 对话框的种类 7.1.2.3 使用对话框编辑器设计对话框 7.1.3 创建一个对话框 7.1.3.2 创建非模态对话框 7.1.3.3 对话框的数据交换机制 7.1.3.4 创建模态对话框 7.1.4 模态对话框和非模态对话框的区别 7.1.5 按钮逃跑小程序 7.2 属性页和向导对话框 7.2.1 创建属性页对话框 7.2.1 创建向导对话框 7.3 公用对话框 7.3.1 增加设置对话框来完善绘图程序 7.3.2 颜色对话框的使用 7.3.3 字体对话框的使用 7.3.4 控制控件颜色做漂亮界面 第8 章 文档序列化 8.1 序列化 8.1.1 CArchive 类和Serialize 函数 8.1.2 使自己的类支持序列化 8.1.3 实例:保存和显示图形 8.2 CFile 类 8.2.1 CFile 类的构造函数 8.2.2 打开文件 8.2.3 读写数据 8.2.4 关闭文件 8.3 文件I/O 处理 8.3.1 利用MFC 类来实现 8.3.2 利用C 函数来实现 8.3.3 利用C 函数来实现 8.3.4 利用API 函数来实现 8.3.5 创建保存、打开对话框 8.4 注册表操作 8.4.1 什么是注册表 8.4.2 注册表结构 8.4.3 修改注册表 第9 章 修改框架程序的显示效果 9.1 修改Windows 应用程序外观样式 9.1.1 在框架类修改程序外观 9.1.2 在视图类修改程序外观 9.2 制作动画图标 9.3 将图片作为窗口显示的背景 第10 章 网络编程 10.1 计算机网络的基本概念 10.1.1 计算机网络的分类 10.1.2 网络拓扑结构 10.2 网络体系结构和网络协议 10.2.1 ISO/OSI 参考模型 10.2.2 TCP/IP 参考模型 10.2.3 TCP/IP 协议 10.2.3.1 协议概述 10.2.3.2 TCP/IP 协议层次结构及各种协议介绍 10.2.3.3 IP 地址 10.2.3.4 端口号 10.2.4 专业术语解释 10.3 Socket 套接字 10.3.1 Socket 介绍 10.3.2 关于协议族和地址族 10.3.3 使用Socket 10.3.3.1 创建Socket 10.3.3.2 指定本地地址及端口号 10.3.3.3 建立连接 10.3.3.4 监听连接 10.3.3.5 发送数据 10.3.3.6 接收数据 10.3.3.7 关闭套接字 10.3.4 套接字一般调用过程 10.4 WinSock 编程机制 10.4.1 认识Windows Socket 10.4.2 Windows Sockets 库函数介绍 10.4.2.1 Berkeley socket 函数 10.4.2.2 数据库函数 10.4.2.3 Windows 专有扩展函数 10.5 WinSock 编程实例 10.5.1 实例一:面向连接服务的socket 调用 10.5.2 实例二:面向非连接服务的socket 调用 10.5.3 实例三:基于字符界面的聊天程序 第11 章 线程间的同步 11.1 进程和线程的概念 11.2 Win32 的线程 11.2.1 线程的创建 11.2.2 线程的终止 11.2.3 实例:通过创建多线程来编写网络聊天程序 11.3 MFC 的线程处理 11.3.1 创建工作者线程 11.3.2 创建用户界面线程 11.4 线程同步 11.4.1 为什么要同步 11.4.2 等待函数 11.4.3 同步对象 11.4.3.1 关键代码段 11.4.3.2 互斥对象 11.4.3.3 信标对象 11.4.3.4 事件对象 11.4.4 如何选择同步对象 第12 章 进程间的通讯 12.1 进程控制 12.1.1 进程的创建 12.1.2 进程的终止 12.2 进程间通讯 12.2.1 剪贴板通讯方式 12.2.2 邮槽通讯方式 12.2.3 管道通讯方式 12.2.3.1 命名管道通讯 12.2.3.2 匿名管道通讯 第14 章 ActiveX 技术 14.1 ActiveX 简介 14.2 ActiveX 控件和普通Windows 控件 14.2.1 ActiveX 控件和普通Windows 控件的相同点 14.2.2 ActiveX 控件和普通Windows 控件的相同点 14.3 ActiveX 控件的属性、方法和事件 14.3.1 ActiveX 控件的属性 14.3.2 ActiveX 控件的方法 14.3.3 ActiveX 控件的事件 14.4 创建ActiveX 控件
光 盘 说 明 1.本书第4~16章所附代码的运行环境: Visual C++ 6.0及以上版本 最低配置为:CPU:P 233以上.32MB以上内存 2.本书所附光盘范例 第4章 项目ExTest,“不做任何事情”的应用程序。 第5章 项目ExTest,在客户区央显示“HELLO!”; 项目ExMyMessage,自定义消息。 第6章 项目ExMDI,“不做任何事情”的多文档应用程序; 项目ExSDI,验证文档视图结构的命令消息处理顺序。 第7章 项目ExMouseCapture,鼠标捕获; 项目ExCursor,改变客户区光标为I形光标; 项目ExMK,鼠标光标位置坐标在状态栏的显示和客户区点击鼠标左键,弹出鼠标光标位置信息对话框; 项目ExChar,只有在当前窗口下输入字符“A”或“a”时,才弹出对话框。 第8章 项目ExTest,修改系统菜单的相关操作; 项目ExPdMenu,添加下拉菜单并实现命令响应,以及工具栏和状态栏的操作; 项目ExPuMenu,弹出菜单的创建、载入与功能实现; 项目ExMyDT,菜单、工具栏、状态栏综合操作,实现一个简单的绘图板。 第9章 项目ExMdMl,反映模式对话框与非模式对话框的几点不同; 项目ExDlgTest(C4),北京奥运金牌榜首的投票对话框,单选按钮、复选框、下压按钮与组框操作; 项目ExDlgTest(C5),个人信息录入对话框,列表框、组合框与滚动条操作; 项目ExDlgTS,通过改变选项卡所包含的颜色滑块实现单文档主窗口所包含图形的色彩变化,选项卡和滑块操作。 第10章 项目ExPen,画笔操作; 项目ExBrush,画刷操作; 项目ExFont,字体操作; 项目MyDraw,位图操作; 项目ExArc,对预设圆左上1/4部分的截取,绘制曲线操作; 项目ExBezier,利用贝塞尔函数绘制图形; 项目ExPie,绘制饼状楔形图; 项目ExDrawText,绘制文本; 项目ExMapMode,设定映射模式并基于设定的映射模式完成绘图。 第11章 项目ExFileStatus,使用类CFile提供的方法实现文件信息获取; 项目ExArTest,利用串行化机制执行读写操作。 第12章 项目ExThread,创建工作线程,计算1+2+…+n; 项目ExMultithreading,创建两个线程,分别用于对一个已有数组的读和写操作,多线程编程。 第13章 项目Calculate和项目ExTestCal,分别用于创建和使用静态链接库; 项目CalSquare和项目ExTestCalSquare,分别用于创建和使用规则动态链接库; 项目CalGCD和项目ExTestCalGCD,分别用于创建和使用扩展动态链接库。 第14章 项目ExMyAccess,MFC ODBC数据库程序创建与操作。 第15章 项目ExSocket和项目ExClient,通过Socket编程实现数据收发; 项目ExGetIP,网络应用程序,IP获取。 第16章 项目SampleCtrl和项目ActiveXTester,创建和使用ActiveX控件。
光 盘 说 明 1.本书第4~16章所附代码的运行环境: Visual C++ 6.0及以上版本 最低配置为:CPU:P 233以上.32MB以上内存 2.本书所附光盘范例 第4章 项目ExTest,“不做任何事情”的应用程序。 第5章 项目ExTest,在客户区央显示“HELLO!”; 项目ExMyMessage,自定义消息。 第6章 项目ExMDI,“不做任何事情”的多文档应用程序; 项目ExSDI,验证文档视图结构的命令消息处理顺序。 第7章 项目ExMouseCapture,鼠标捕获; 项目ExCursor,改变客户区光标为I形光标; 项目ExMK,鼠标光标位置坐标在状态栏的显示和客户区点击鼠标左键,弹出鼠标光标位置信息对话框; 项目ExChar,只有在当前窗口下输入字符“A”或“a”时,才弹出对话框。 第8章 项目ExTest,修改系统菜单的相关操作; 项目ExPdMenu,添加下拉菜单并实现命令响应,以及工具栏和状态栏的操作; 项目ExPuMenu,弹出菜单的创建、载入与功能实现; 项目ExMyDT,菜单、工具栏、状态栏综合操作,实现一个简单的绘图板。 第9章 项目ExMdMl,反映模式对话框与非模式对话框的几点不同; 项目ExDlgTest(C4),北京奥运金牌榜首的投票对话框,单选按钮、复选框、下压按钮与组框操作; 项目ExDlgTest(C5),个人信息录入对话框,列表框、组合框与滚动条操作; 项目ExDlgTS,通过改变选项卡所包含的颜色滑块实现单文档主窗口所包含图形的色彩变化,选项卡和滑块操作。 第10章 项目ExPen,画笔操作; 项目ExBrush,画刷操作; 项目ExFont,字体操作; 项目MyDraw,位图操作; 项目ExArc,对预设圆左上1/4部分的截取,绘制曲线操作; 项目ExBezier,利用贝塞尔函数绘制图形; 项目ExPie,绘制饼状楔形图; 项目ExDrawText,绘制文本; 项目ExMapMode,设定映射模式并基于设定的映射模式完成绘图。 第11章 项目ExFileStatus,使用类CFile提供的方法实现文件信息获取; 项目ExArTest,利用串行化机制执行读写操作。 第12章 项目ExThread,创建工作线程,计算1+2+…+n; 项目ExMultithreading,创建两个线程,分别用于对一个已有数组的读和写操作,多线程编程。 第13章 项目Calculate和项目ExTestCal,分别用于创建和使用静态链接库; 项目CalSquare和项目ExTestCalSquare,分别用于创建和使用规则动态链接库; 项目CalGCD和项目ExTestCalGCD,分别用于创建和使用扩展动态链接库。 第14章 项目ExMyAccess,MFC ODBC数据库程序创建与操作。 第15章 项目ExSocket和项目ExClient,通过Socket编程实现数据收发; 项目ExGetIP,网络应用程序,IP获取。 第16章 项目SampleCtrl和项目ActiveXTester,创建和使用ActiveX控件。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧