VC6.0开发asp服务器COM组件
VC6.0常用控件使用方法
VC6.0常用控件使用方法 26、List Box---------------列表框控件--类CListBox(1)插入项m_list.AddString(string);(2)设置当前选择项m_list.SetCurSel(项索引);(3)获取当前选择项int nIndex = m_list.GetCurSel();m_list.GetText(nIndex, string);(4)删除一项m_list.DeleteString(项索引);(5)删除所有项m_list.ResetContent();(6)获取总项数m_list.GetCount()(7)List Box的选项前面加复选框(Check Box)a.风格声明时用类CCheckListBox代替CListBox,即CCheckListBox m_list;而不是CListBox m_list;属性对话框->Styles->Owner draw设为Fixed属性对话框->Styles->勾选Has stringsb.设置选择void SetCheck( int nIndex, int nCheck );ParametersnIndexIndex of the item whose check box is to be set.nCheckState of the check box: 0 for clear, 1 for checked, and 2 for indeterminate.c.获取选择int GetCheck( int nIndex );ParametersnIndexIndex of the item whose check status is to be retrieved.Return ValueZero if the item is not checked, 1 if it is checked, and 2 if it is indeterminate.7、List Control----------列表框扩展控件--类CListCtrl(1)样式:属性对话框框->Styles->Format有4,分别是Icon/Small Icon/List/Report;(2)Report格式设置扩展风格DWORD dwStyle = m_list.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT; // 选中某行使整行高亮(只适用与report风格的listctrl)dwStyle |= LVS_EX_GRIDLINES; // 网格线(只适用与report风格的listctrl)m_list.SetExtendedStyle(dwStyle);(3)Report格式插入列m_list.InsertColumn(1, "列一", LVCFMT_RIGHT, 150);m_list.InsertColumn(2, "列二", LVCFMT_LEFT, 100);m_list.InsertColumn(3, "列三", LVCFMT_LEFT, 100);m_list.InsertColumn(4, "列四", LVCFMT_LEFT, 200);m_list.InsertColumn(5, "ID", LVCFMT_CENTER, 0);(4)Report格式插入一行数据int nIndex = m_list.GetItemCount();m_list.InsertItem(nIndex, s1);m_list.SetItemText(nIndex, 1, s2);m_list.SetItemText(nIndex, 2, s3);m_list.SetItemText(nIndex, 3, s4);m_list.SetItemText(nIndex, 4, s5);(5)Report格式删除所有行m_list.DeleteAllItems();(6)Report格式获取某行某列数据CString sID = m_list.GetItemText(行索引,列索引);(7)Report格式删除选择行,多选时可用循环。
VC6.0开发ocx插件
打开VC++ 6.0File -->New-->Projects-->MFC ActiveX ControlWizard点击ClassView视图右击_DTest -->Add Method方法名为ddd 参数为aTestCtl.cpp:short CTestCtrl::ddd(short a){// TODO: Add your dispatch handler code herereturn a;}Test.odl:点击build-->Rebuild All即可生成ocx文件注册ocx文件:cmd -->regsvr32 +ocx文件的路径解注册ocx文件:cmd -->regsvr32 /u +ocx文件的路径Test.html:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>无标题文档</title><script type="text/javascript" language="javascript">/***测试OCX*/function testOCX(){alert("进入");var ocx=document.getElementById("pos");alert(ocx);var t=ocx.ddd(14);alert(t);}</script></head><body><!--clsid : 如果控件成功注册到本机后,这个值在本机注册表中可以找到,js获取控件对象就是通过这个来找的。
VC++6.0介绍
Visual C++6.0 可以创建的文件类型 说明 文件类型 网页制作 Binary File 创建位图文件 C++ Source File 创 建 C/C++头 文 件 Cursor File 头 创 建 HTM L 文 件 Icon File 创建资源脚本文件 Text File 创建资源模板文件 SQL Script File
1. 创建新的项目工作区
创建新的空工作区步骤: 创建新的空工作区步骤: (a) File->New->Workspaces-> 输入工作区名字并指定工作区目录 输入工作区名字并指定工作区目录 工作区名字并指定
在工作区中添加项目: 在工作区中添加项目: 用File->Open选项可 选项可 打开已存在的项目; 打开已存在的项目;通 对话框的Projects 过New对话框的 对话框的 选项卡创建新的项目, 选项卡创建新的项目, 并选择Add to current 并选择 workspace复选框。 复选框。 复选框
2 可视化
• 指软件开发阶段的可视化 • 利用计算机图形技术和方法
2
3 开发环境
开发环境是程序员同 VC++的交互界面 的交互界面 通过 它, 可以
创 建 工 程 文 件
访 问 资 源 编 辑 器
使 用 内 部 调 试 器
访 问 程 序 源 代 码
3
4 菜单简介
File 菜单 View 菜单
Insert 菜单 Edit 菜单
说明 创建二进制文件 创 建 C++源 文 件 源 创建光标文件 创建图标文件 文本文件 6 创 建 SQL 脚 本 文 件
File->New->Projects
VC++6.0使用MFC创建应用程序框架操作步骤
图 为套接字类添加响应消息的事件处理成员函数
(3)为套接字类添加一般的成员函数和成员变量 •在VC++的界面中,在工作区窗口选择ClassView卡,用右键 单 击 CMySocket 类 , 会 弹 出 快 捷 菜 单 , 选 择 其 中 的 Add Member Function 可 以 为 该 类 添 加 成 员 函 数 ; 选 择 Add Member Variable可以为该类添加成员变量。
m_listRecetved
Control
CListBox
定义了一个枚举变量IDD,值 , 定义了一个枚举变量 为IDD_TALKC_DIALOG。 。 这个对话框类就是通过这个 IDD和对话框资源建立了联系。 和对话框资源建立了联系。 和对话框资源建立了联系
CTalkcDlg类的 类的 构造函数
类CMySocket的定义 的定义
CMySocket的构造函数 的构造函数 CMySocket的析构函数 的析构函数
(2)利用类向导ClassWizard为这个套接字类添加 响应消息的事件处理成员函数。 •点菜单View/ClassWizard...,进入类向导对话框, 选择Message Maps(消息映射)卡,确认Class name是CMySocket,从Messages(消息)栏中选 择事件消息,然后点击Add Function按钮,就会看 到在Member Function栏中添加了相应的事件处理 函数。 •如图所示,此程序中需要添加OnConnect, OnClose和OnReceive三个函数。这一步会在 CMySocket类的MySocket.h中自动生成这些函数的 声明,在MySocket.cpp中生成这些函数的框架,以 及消息映射的相关代码。可参看后面的程序清单。
VC6.0添加CMSComm控件的几个问题
当添加1不能添加时:
窗口----->右击鼠标----->Insert Active Controls------->Microsoft Communications Control,version 6.0------->之后手动添加.app及.h文件;
手动添加.app及.h文件: Ctrl+W 打开类项导---->Member Variables --->Add Variable --->OK。
>>> You should call it in your app's InitInstance function.
在其app::InitInstance()中加入AfxEnableControlContainer()
经过1or2后编译后按f5调试运行程运行不起来自动关闭并出现如下错误
VC6.0添加CMSComm控件的几个问题
1、添加1:
Project--->Add To project--->Components and Controls--------->Microsoft visual Studio/common/msdev98/gallery/Registered ActiveX Controls--------->Microsoft Communications Control,version 6.0------->之后自动添加.app及.h文件----->OK。
3、在app::InitInstance()中加入AfxEnableControlContainer()
经过1or2后,编译后,按F5调试运行,程序运行不起来,自动关闭并出现如下错误:
Com组件技术
COM组件技术1 COM组件概述 (3)2 COM组件实例 (3) (3)2.1.1 VC6.0 创建COM组件 (3) (7) (9)2.2.4 使用.Net(VB)调用 (11)2.2.5 使用.Net(C#)调用 (13)2.2 .NET(C#)创建的COM组件及调用过程 (15)2.1.1 C# 创建COM组件 (15) (20) (22)2.2.4 使用.Net(VB)调用 (23)2.2.5 使用.Net(C#)调用 (25)3 佳衡电力抄表Com组件.........................................................错误!未定义书签。
1 COM组件概述COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。
在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
COM组件的优点:①可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;②可以在多个应用系统中重复利用同一个组件;③可以方便的将应用系统扩展到网络环境下;④COM组件的特性是与语言无关和与平台无关。
因此,一经开发便可以使用不同的高级语言和开发工具调用。
并且,客源在此COM组件基础进行二次开发。
2 COM组件实例本部分将使用VC6.0创建COM组件。
并介绍如何在VC6.0、VB6.0、、C#中调用该COM组件。
2.1.1 VC6.0 创建COM组件1、在VC中新建“A TL COM AppWizard”工程,工程名称为“VCCOMTest”,并确认。
2、在服务器类型中,选择“动态链接库(DLL)”,完成3、选择菜单栏“插入”“A TL对象”,选择“Simple Object”,点击“Next”4、在上面C++“Short Name”后输入“COMTestInVC”,将会自动填充其余选项。
Attributes 部分按默认设置。
.net 6.0 开发winform实例
.net 6.0 开发winform实例当谈到 .NET 6.0 的 WinForms 开发实例时,以下是一个简单的示例来创建一个基本的 WinForms 应用程序:```csharpusing System;using System.Windows.Forms;namespace WinFormsApp{public class Program : Form{private Button myButton;public Program(){myButton = new Button();myButton.Text = "Click Me";myButton.Click += MyButton_Click;Controls.Add(myButton);}private void MyButton_Click(object sender, EventArgs e){MessageBox.Show("Hello, World!");}[STAThread]static void Main(){Application.Run(new Program());}}}```在这个示例中,我们创建了一个继承自 `Form` 的 `Program` 类,并在构造函数中创建了一个按钮,并将其添加到窗体中。
按钮单击时,会触发`MyButton_Click` 方法,弹出一个消息框显示 "Hello, World!"。
在 `Main` 方法中,我们使用 `Application.Run()` 来启动 WinForms 应用程序,并传入一个新的 `Program` 实例作为主窗体。
请注意,以上示例仅是一个基本的 WinForms 应用程序,你可以根据需要添加更多的控件和自定义逻辑。
另外,需要注意的是,.NET 6.0 目前还处于预览版,可能会有变化。
请在正式开发前查阅官方文档以获取最新的更新和指导。
COM 组件设计与应用
一、前言公元一九九五年某个夜黑风高的晚上,我的一位老师跟我说:“小杨呀,以后写程序就和搭积木一样啦。
你赶快学习一些OLE的技术吧......”,当时我心里就寻思:“开什么玩笑?搭积木方式写程序?再过100年吧......”,但作为一名听话的好学生,我开始在书店里“踅摸”(注1)有关OLE的书籍(注2)。
功夫不负有心人,终于买到了我的第一本COM书《OLE2 高级编程技术》,这本800多页的大布头花费了我1/5的月工资呀......于是开始日夜耕读.....功夫不负有心人,我坚持读完了全部著作,感想是:这本书,在说什么呐?功夫不负有心人,我又读完了一遍大布头,感想是:咳~~~,没懂!功夫不负有心人,我再,我再,我再读 ... 感想是:哦~~~,读懂了一点点啦,哈哈哈。
...... ......功夫不负有心人,我终于,我终于懂了。
800页的书对现在的我来说,其实也就10几页有用。
到这时候才体会出什么叫“书越读越薄”的道理了。
到后来,能买到的书也多了,上网也更方便更便宜了......为了让VCKBASE上的朋友,不再经历我曾经的痛苦、不再重蹈我“无头苍蝇”般探索的艰辛、为了VCKBASE的蓬勃发展、为了中国软件事业的腾飞(糟糕,吹的太也高了)......我打算节约一些在BBS 上赚分的时间,写个系列论文,就叫“COM组件设计与应用”吧。
今天是第一部分——起源。
二、文件的存储传说350年前,牛顿被苹果砸到了头,于是发现了万有引力。
但到了二十一世纪的现在,任何一个技术的发明和发展,已经不再依靠圣人灵光的一闪。
技术的进步转而是被社会的需求、商业的利益、竞争的压力、行业的渗透等推动的。
微软在Windows平台上的组件技术也不例外,它的发明,有其必然因素。
什么是这个因素那?答案是——文件的存储。
打开记事本程序,输入了一篇文章后,保存。
——这样的文件叫“非结构化文件”;打开电子表格程序,输入一个班的学生姓名和考试成绩,保存。
vc6.0工程的setting选项
在这个对话框 中,左上方的下拉列表框用于选择一种工程配置,包括有Win32 Debug、Win32 Release和All Configurations(指前两种配置一起),某些选项在不同的工程配置中有不同的缺省值。左边的树形视图给出了当前工程所有的文件及分类情况。如果我们把工程“Schedule”置为高亮显示(正如图9-1那样),对话框的右边就会出现总共十个选项卡,其中列出了与工程有关的各种选项,不少选项卡中有一个Reset按钮,按下它后可以把选项卡内的各项设置恢复到生成工程时的初始值。如果我们在树形视图中选择一个文件类或一个文件,那么对话框右边的选项卡会自动减少到一个或两个,其中列出的都是与选中的文件类或文件有关的选项。下面我们就以Win32 Debug为例来看看与工程有关的十个选项卡各自的功能与含义,与文件有关的选项卡则请大家自己琢磨一下。
Resources
Resources选项卡控制着VC6的资源编译器。如图9-5所示,我们可以指定编译后生成的资源文件的路径,资源的语言类型,以及额外的资源包含目录。
MIDL
这个选项卡与COM(组件对象模型)编程有关,我们不讨论它。
Browse Info
在Customize类别中,从上到下六个选项的含义分别为:是否禁止使用Microsoft对C++的扩 展;是否允许函数级别的连接;是否消除重复的字符串;是否允许进行最小化的重建;是否允许递增编译方式;是否允许编译器在开始运行时向Output窗口中 输出自己的版本信息。其中第二、三两项为灰色是因为它们与即编即调功能不兼容,如果在General类别中选择生成其它类型的调试信息,那么就可以更改这 两个选项。
ቤተ መጻሕፍቲ ባይዱ Debug
Debug选项卡中是一些与调试有关的选项,如图9-2所示,由于选项比较多,它们被分成了几个类,我们可以从Category中选择不同的类别,选项卡就会切换显示出相应的选项,后面的C/C++和Link选项卡也有这种情况。
RTX插件开发(一)--CsDemoClient(VC6.0)
RTX插件开发(一)CsDemoClient(VC6.0)一、前言我想实现客户端的插件与服务器端的应用进行通讯,采用RTX的通道进行通讯,而不是自已再写一条通道;我想在RTX客户端面版上增加一个属于我自己的面版,服务器端发过来的数据在该面版显示出来;我在自己的面版本点击某个按钮,可以把数据发送给服务器应用。
通过本章的学习,您将能实现以上的功能,实际上在RTX客户端添加一个面版,就是把自己做好的一个Activ eX控件嵌入进插件,插件加截时把Ocx显示出来;因此开发RTX插件需要对Activ eX控件及COM有一定的了解。
二、技术说明正如前言介绍,在客户端添加面版,需要把自己做好的一个Activ eX控件嵌入进插件,因此要创建两个工程,一个Activ eX控件工程(本文Activ eX为ocx),实现界面的功能;一个是RTX插件工程(插件简称dll);实现与RTX内核交互的功能。
即然是两个不同的模块,必须先解决ocx与dll之间数据传输,本文通过ATL 事件解决此问题,ATL事件是本文的主要难点。
注意:ocx向应用发送数据时,不需要先把数据发给dll,再由d ll发给应用,直接通过ocx在初始化时得到的IRTXCRootPtr指针获取IRTX ModulePtr发送数据;当dll收到从应用发过来消息时,激发ATL事件,ocx通过ATL事件接收器获取事件,并得到事件传过来的数据。
另外把ocx嵌入dll需要在ocx实现几个插件接口,否则它们无法关联在一起,这一点应该比较好理解。
插件与Activ eX控件主要技术要点和步骤如下:a)插件要点1.生成RTX插件工程2.A TL组件设计3.DLL事件激发设计b)ActiveX控件要点1. 创建ocx工程2. 实现插件接口3. 事件接收器设计4. ocx界面设计5. 收发数据c)插件打包1. 打包准备2. 打包步骤d)安装调试1. 安装插件2. 启动应用3. 插件发数据给应用2. 应用发数据给插件三、操作步骤a)插件开发步骤1.生成RTX插件工程先安装RTXCSDK安装包,在其安装目录下有三个文件夹我们必须了解;wizard文件夹:插件生成向导文件RTXCModuleAW.awx放在该目录下,开发前第一件事就是先把RTXCModuleAW.awx文件拷贝到VC安装目录Microsoft V isualStudio\COMMON\MSDev98\Template\ 文件下。
VC6创建ocx工程的步骤
1、新建工程。
选择MFC Activex ControlWizard。
默认点击完成。
2、按Ctrl+W,出现建立向导,点击automation选项卡,点击Add Method。
添加函数3、输入函数名,函数返回值,函数参数。
即完成函数添加。
4、在工程cpp类中,加入以下代码,确保页面调用能正常#include "comcat.h"//页面安全const CATID CATID_SafeForScripting ={0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};const CATID CATID_SafeForInitializing ={0x7dd95802,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};////////////////////////////////////////////////////////////////////////////// CV oiceApp::InitInstance - DLL initialization// 创建组件种类HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription){ICatRegister* pcr = NULL;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (FAILED(hr))return hr; // Make sure the HKCR\Component Categories\{..catid} // key is registered.CA TEGORYINFO catinfo;catinfo.catid = catid;catinfo.lcid = 0x0409 ; // english// Make sure the provided description is not too long.// Only copy the first 127 characters if it is.int len = wcslen(catDescription);if (len>127)len = 127;wcsncpy(catinfo.szDescription, catDescription, len);// Make sure the description is null terminated.catinfo.szDescription[len] = '\0';hr = pcr->RegisterCategories(1, &catinfo);pcr->Release();return hr;}// 注册组件种类HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CA TID catid){// Register your component categories information.ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (SUCCEEDED(hr)){// Register this category as being implemented by the class.CATID rgcatid[1] ;rgcatid[0] = catid;hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);}if (pcr != NULL)pcr->Release();return hr;}// 卸载组件种类HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CA TID catid){ICatRegister* pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (SUCCEEDED(hr)){// Unregister this category as being implemented by the class.CATID rgcatid[1] ;rgcatid[0] = catid;hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);}if (pcr != NULL)pcr->Release();return hr;}5.在cpp类中修改下面这两个函数:STDAPI DllRegisterServer(void){HRESULT hr = S_OK ;AFX_MANAGE_STATE(_afxModuleAddrThis);if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))return ResultFromScode(SELFREG_E_CLASS);// 标记控件初始化安全.// 创建初始化安全组件种类hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");if (FAILED(hr))return hr;// 注册初始化安全hr = RegisterCLSIDInCategory(_tlid, CATID_SafeForInitializing);if (FAILED(hr))return hr;// 标记控件脚本安全// 创建脚本安全组件种类hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");if (FAILED(hr))return hr;// 注册脚本安全组件种类hr = RegisterCLSIDInCategory(_tlid, CATID_SafeForScripting);if (FAILED(hr))return hr;return NOERROR;}/////////////////////////////////////////////////////////////////////////////// DllUnregisterServer - Removes entries from the system registrySTDAPI DllUnregisterServer(void){HRESULT hr = S_OK ;AFX_MANAGE_STATE(_afxModuleAddrThis);if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))return ResultFromScode(SELFREG_E_CLASS);// 删除控件初始化安全入口.hr=UnRegisterCLSIDInCategory(_tlid, CATID_SafeForInitializing);if (FAILED(hr))return hr;// 删除控件脚本安全入口hr=UnRegisterCLSIDInCategory(_tlid, CATID_SafeForScripting);if (FAILED(hr))return hr;return NOERROR;}6. 在ctrl.cpp类中加入如下代码(IMPLEMENT_OLECTLTYPE(CNetV oiceCtrl, IDS_NETVOICE, _dwNetV oiceOleMisc) 后面加入)////////////------------------------------------------------BEGIN_INTERFACE_MAP( CNetV oiceCtrl, COleControl )INTERFACE_PART(CNetV oiceCtrl, IID_IObjectSafety, ObjSafe)END_INTERFACE_MAP()//.............................................................................// IObjectSafety member functions// Delegate AddRef, Release, QueryInterfaceULONG FAR EXPORT CNetV oiceCtrl::XObjSafe::AddRef(){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)return pThis->ExternalAddRef();}ULONG FAR EXPORT CNetV oiceCtrl::XObjSafe::Release(){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)return pThis->ExternalRelease();}HRESULT FAR EXPORT CNetV oiceCtrl::XObjSafe::QueryInterface( REFIID iid, void FAR* FAR* ppvObj){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj); }const DWORD dwSupportedBits =INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;const DWORD dwNotSupportedBits = ~dwSupportedBits;//.............................................................................// CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions// Allows container to query what interfaces are safe for what. We're// optimizing significantly by ignoring which interface the caller is// asking for.HRESULT STDMETHODCALLTYPECNetV oiceCtrl::XObjSafe::GetInterfaceSafetyOptions(/* [in] */ REFIID riid,/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions) {METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)HRESULT retval = ResultFromScode(S_OK);// does interface exist?IUnknown FAR* punkInterface;retval = pThis->ExternalQueryInterface(&riid,(void * *)&punkInterface);if (retval != E_NOINTERFACE) { // interface exists punkInterface->Release(); // release it--just checking!}// we support both kinds of safety and have always both set,// regardless of interface*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;return retval; // E_NOINTERFACE if QI failed}/////////////////////////////////////////////////////////////////////////////// CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions// Since we're always safe, this is a no-brainer--but we do check to make // sure the interface requested exists and that the options we're asked to // set exist and are set on (we don't support unsafe mode).HRESULT STDMETHODCALLTYPECNetVoiceCtrl::XObjSafe::SetInterfaceSafetyOptions(/* [in] */ REFIID riid,/* [in] */ DWORD dwOptionSetMask,/* [in] */ DWORD dwEnabledOptions){METHOD_PROLOGUE(CNetV oiceCtrl, ObjSafe)// does interface exist?IUnknown FAR* punkInterface;pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);if (punkInterface) { // interface existspunkInterface->Release(); // release it--just checking!}else { // interface doesn't existreturn ResultFromScode(E_NOINTERFACE);}// can't set bits we don't supportif (dwOptionSetMask & dwNotSupportedBits) {return ResultFromScode(E_FAIL);}// can't set bits we do support to zerodwEnabledOptions &= dwSupportedBits;// (we already know there are no extra bits in mask )if ((dwOptionSetMask & dwEnabledOptions) !=dwOptionSetMask) {return ResultFromScode(E_FAIL);}// don't need to change anything since we're always safereturn ResultFromScode(S_OK);}7. 在ctrl.h中加入以下代码:#include <objsafe.h>DECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (/* [in] */ REFIID riid,/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions);STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (/* [in] */ REFIID riid,/* [in] */ DWORD dwOptionSetMask,/* [in] */ DWORD dwEnabledOptions);END_INTERFACE_PART(ObjSafe);8.页面代码中,添加如下代码:<objectid="NetV oice"codebase="NetV oice.ocx"classid="clsid:439A1200-A72F-48A5-970D-64EFD9192613"></object>。
COM 组件设计与应用(十五)——连接点(vc6.0)
COM 组件设计与应用(十五)——连接点(vc6.0)一、前言上回书介绍了回调接口,在此基础上,我们理解连接点就容易多了。
二、原理图一、连接点组件原理图。
左侧为客户端,右侧为服务端(组件对象)看着好复杂呀......呵呵,其实简单的紧:(注1)1、一个 COM 组件,允许有多个连接点对象(IConnectionPoint)。
也就是说可以有多个发生“事件”的源头。
上图就有3个连接点;2、管理这些连接点的接口叫“连接点容器”(IConnectionPointContainer)。
连接点容器接口特别简单,因为只有2个函数,一个是 FindConnectionPoint(),表示查找你想要的连接点;另一个是 EnumConnectionPoints(),表示列出所有的连接点,然后你去选择使用哪个。
在实际的应用中,查找法使用最多,占90%,而枚举法使用只占 10%,一般在支持第三方的插件(Plug in)时才使用。
(你想写个 IE 的插件吗?我们后面就要讲到啦)3、每一个连接点,可以被多个客户端的接收器(Sink)连接;这个我们已经熟悉啦,还记得我们在上回书中为了管理多个回调接口,使用了 cookie 的方式进行区别吗?!三、实现组件(一)1、建立一个工作区(WorkSpace)2、在工作区中,建立一个 ATL 工程(Project)。
示例程序中工程名称叫 Simple15,接受全部默认选项。
3、ClassView 中,执行鼠标右键菜单命令 New Atl Object...,添加 ALT 类。
4、左侧分类 Category 选择 Objects,右侧 Objects 选择 SimpleObject(其实就是默认项目)。
5、名称 Name 卡片中,输入组件名称。
示例程序中是 DispConnect。
6、属性 Attributes 卡片中,接口类型选 Dual 双接口。
注意一定要选择 Support Connection Points 来支持连接点。
vc6.0写xml案例
vc6.0写xml案例在VC6.0中编写XML的案例,可以通过使用MSXML库来实现。
下面我将从多个角度来介绍如何在VC6.0中编写一个简单的XML案例。
1. 包含头文件和初始化。
首先,在VC6.0中创建一个新的Win32控制台应用程序项目。
然后在代码中包含MSXML库的头文件,可以使用以下代码:c.#include <msxml2.h>。
接着,需要初始化COM组件,可以使用以下代码:c.CoInitialize(NULL);2. 创建XML文档。
接下来,我们可以创建一个XML文档对象并添加元素和属性。
以下是一个简单的示例代码:c.IXMLDOMDocument pXMLDom = NULL;HRESULT hr = CoCreateInstance(__uuidof(DOMDocument), NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument,(void)&pXMLDom);if (SUCCEEDED(hr))。
{。
IXMLDOMElement pRoot = NULL;pXMLDom->createElement(L"Root", &pRoot);pXMLDom->appendChild(pRoot, NULL);IXMLDOMElement pChild = NULL;pXMLDom->createElement(L"Child", &pChild);pRoot->appendChild(pChild, NULL);pChild->setAttribute(L"Attribute",_variant_t(L"Value"));}。
3. 保存和释放资源。
在完成XML文档的创建后,我们需要保存XML文档并释放资源。
图解VC++6.0中使用mscomm串口控件
m_ComPort.SetInputMode(1);//以二进制方式读写数据 m_ComPort.SetRThreshold(1);//接收缓冲区有大于等于 1 个字符时,将引发接收数据的 OnCommMscomm 事件 m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数 if(!m_ComPort.GetPortOpen()) //打开串口
safearray_inp.GetElement(&k,rxdata+k); //转换为 BYTE 型数组 BYT E bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量 strtemp 存放 m_receive+=strtemp; } break; default: // 传输事件出错 m_ComPort.SetOutBufferCount(0); break;
在 sportDlg.cpp 中增加: BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )
ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射 //ActiveX 控件事件
END_EVENTSINK_ M AP()
// TODO: Add your control notification handler code here UpdateData(TRUE); int len; CByteArray array; len=m_send.GetLength(); array.RemoveAll(); array.SetSize(len); for(int i=0;i<len;i++)
COM组件简介
COM组件简介⾯向对象的思想难以适应这种分布式软件模型,于是组件化程序设计思想得到了迅速的发展。
按照组件化的程序设计的思想,复杂的应⽤程序被设计成⼀些⼩的,功能单⼀的组件模块,这些组件模块可以运⾏在同⼀台机器上,也可以运⾏在不同的机器上。
为了实现这样的应⽤软件,组建程序和组建程序之间需要⼀些极为细致的规范,只有组件程序遵守了这些共同的规范,然间系统才能正常运⾏。
为此,OMG和Microsoft分别提出了CORBA(Common Object Request Breaker Architecture)和COM(Component Object model)标准,⽬前CORBA模型主要应⽤于UNIX操作系统平台上,⽽COM 则主要应⽤于Microsoft Windows操作系统平台上。
在COM标准中,⼀个组件程序也被称为⼀个模块,它可以是⼀个动态连接库(DLL), 被称为进程内组件(in-of-process component)也可以是⼀个可执⾏程序(EXE),被称为进程外组件(out-of-process component).COM对象是建⽴在⼆进制可执⾏代码级的基础上,⽽C++等语⾔中的对象是建⽴在源代码级基础上的,因此COM对象是语⾔⽆关的。
这⼀特性使⽤不同编程语⾔开发的组件对象进⾏交互成为可能。
在Microsoft Windows系统平台上,COM技术被应⽤于系统的各个层次,从底层的COM对象管理到上层的应⽤程序交互都⽤到了COM标准。
概述COM既提出了组件之间进⾏交互的规范,也提供了实现交互的环境,因为组件对象之间交互的规范不依赖于任何特定的语⾔,所以COM也可以是不同语⾔协作开发的⼀种标准。
OLE技术以COM规范为基础,OLE充分发挥了COM标准的优势,使Windows操作系统上的应⽤程序具有极强的可交互性。
如果没有OLE的⽀持,Windows操作系统则会逊⾊很多。
但是,COM规范并不局限于OLE技术,实际上,OLE技术只是COM的⼀个应⽤⽽已,这⼏年,OLE技术在进⾏⽹络互连是显⽰出了很⼤的局限性,⽽COM则表现出了极强的适应能⼒。
COM 组件设计与应用(十三)——事件和通知(VC6.0)
COM 组件设计与应用(十三)——事件和通知(VC6.0)一、前言我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者;我的 COM 组件用线程方式下载网络上的一个文件,当我完成任务后,需要通知调用者;我的 COM 组件完成一个钟表的功能,当预定时间到达的时候,我需要通知调用者;... ... ... ...本回书开始话说 COM 的事件、通知、连接点......这些内容比较多,我分两次(共四回)来介绍。
二、通知的方法当程序甲方内部发生了某个事件的时候,需要通知乙方,无非使用几个方组件是运行在分布式环境中的,地球另一边计算机上运行的组件,怎么可能给你的窗口发消息那?当然不能!(但话又说回来,对于 ActiveX 这样只能在本地运行的组件,当然也可以发送窗口消息的啦。
)回调函数的方式,是设计 COM 通知方法的基础。
回调函数,本质上是预先把某一函数的指针告诉我,当我有必要的时候,就直接呼叫该函数了,而这个回调函数做了什么,怎么做的,我是根本不关心的。
好了,问你个问题:啥是COM 的接口?接口其实就是一组相关函数的集合(这个定义不严谨,但你可以这么理解哈)。
因此,在COM中不使用“回调函数”而是使用“回调接口”(说的再清楚一些,就是使用一大堆包装好的“回调函数”集),回调接口,我们也叫“接收器接口”。
图一、客户端传递接收器接口指针给COM。
当发生事件时,COM调用接收器接口函数完成通知本回示例程序完成的功能是:客户端启动组件(Simple11.IEvent1.1)并得到接口指针 IEvent1 *;调用接口方法 IEvent1::Advise() 把客户端内部的一个接收器(sink)接口指针(ICallBack *)传递到组件服务器中;调用 IEvent1::Add() 去计算两个整数的和;但是计算结果并不通过该函数返回,而是通过 ICallBack::Fire_Result() 返回给客户端;当客户端不再需要接受事件的时候,调用 IEvent1::Unadvise() 断开和组件的联系。
VC++6.0控件使用方法大全
使用Windows标准控件我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。
在Visual C++中,可以使用的控件分成三类:(1) Windows标准控件Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。
所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。
Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。
表6.1 Windows标准控件控件 MFC类 描述动画 CAnimateCtrl 显示连续的AVI视频剪辑按钮 CButton 用来产生某种行为的按钮,以及复选框、单选钮和组框组合框 CComboBox 编辑框和列表框的组合编辑框 CEdit 用于键入文本标题头 CHeaderCtrl 位于某一行文本之上的按钮,可用来控制显示文件的宽度热键 CHotKeyCtrl 用于通过按下某一组合键来很快的执行某些常用的操作图象列表 CImageList 一系列图象(典型情况下是一系列图标或位图)的集合。
图象列表本身不是一种控件,它常常是和其它控件一起工作,为其它控件提供所用的图象列表列表 CListCtrl 显示文本及其图标列表的窗口列表框 CListBox 包括一系列字符串的列表进度 CProgressCtrl 用于在一较长操作中提示用户所完成的进度多格式文本编辑 CRichEditCtrl 提供可设置字符和段落格式的文本编辑的窗口滚动条 CScrollBar 为对话框提供控件形式的滚动条滑块 CSliderCtrl 包括一个有可选标记的滑块的窗口旋转按钮 CSpinButtonCtrl 提供一对可用于增减某个值的箭头静态文本 CStatic 常用于为其它控件提供标签状态条 CStatusBarCtrl 用于显示状态信息的窗口,同MFC类CStatusBar类似续表6.1 控件 MFC类 描述选项卡 CTabCtrl 在选项卡对话框或属性页中提供具有类似笔记本中使用的分隔标签的外观的选项卡工具条 CToolBarCtrl 具有一系列命令生成按钮的窗口,同MFC类CToolBar类似工具提示 CToolTipCtrl 一个小的弹出式窗口,用于提供对工具条按钮或其它控件功能的简单描述树 CTreeCtrl 用于显示一系列的项的继承结构前面提到过,在MFC中,类CWnd是所有窗口类的基类,很自然的,它也是所有控件类的基类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC6.0开发asp服务器COM组件
一、创建项目
首先打开VC IDE编辑器,新建ATL COM项目;
然后点击确定,其它选项保持默认即可,点击完成按钮。
完成新建项目。
二、添加asp组件
在菜单上点击“插入”——“ATL对象”;
选择ActiveX Server Component;
在Short Name 中输入名称,如“ASPCOM”,其它会自动生成。
三、添加方法
在ClassView的IASPCOM上点击右键,选择添加方法(Add Method…);
返回类型HRESULT,表示调用是否成功;
在方法名称中输入一个函数名,已show为例;
这里要注意的是参数的写法:
输入参数前加[in]、输出参数前加[out, retval],后面再跟参数类型及参数名,同一个方法最多只能有一个输出参数。
这里用一个输入参数一个输出参数为例;
四、添加代码及说明
在ASPCOM类中默认就添加了两个方法:OnStartPage和OnEndPage,从名字中我们不难看出:一个是页面加载前执行(主要是对一些对象或属性进行初始化操作),一个是页面完成加载时执行(主要是做一些释放内存空间的工作而不管asp脚步中是否包含Response.End()语句)。
方法show代码如下
实例工程svn:https:///svn/trunk/VC++/ASP服务器(COM)组件
五、组件在服务器的配置
将该dll(zhixin.dll)拷贝到服务器的system32目录下;
打开命令行输入regsvr32 zhixin.dll,注册该dll;
重启W3SVC服务;
六、测试
建一个asp脚步程序,内容如下:
<%
On Error Resume Next
Set obj1 = Server.CreateObject("zhixin.ASPCOM")
Response.writeobj1.show("a")
If Err.Number> 0 Then
Response.write "<center>error</center>"
End If
'Response.End()
%>。