我的COM为什么在VB中“ActiveX无法创建对象“。Com可真难学啊。

rober 2000-10-13 03:53:00
我用ATL做了一个有简单界面的COM ,文件是ComDialogProject.exe。
注册后在VB里面引用,然后在程序中这样写:

Private itf As COMDIALOGPROJECTLib.IComDialog
Private Sub Form_Load()
Set itf = New COMDIALOGPROJECTLib.ComDialog
End Sub

结果就是在New 操作时出错,错误是“ActiveX无法创建对象“。

请问高手,如何是好啊?
...全文
193 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrankZhang123 2000-11-22
  • 打赏
  • 举报
回复
VB 中 的com组件不是用New操作符生成的,而是用CreateObject函数获取的,应该用

Set itf = CreateObject("COMDIALOGPROJECT.ComDialog")
引号里的东西应该是你的控件在注册表里面的ProgID
FrankZhang123 2000-11-22
  • 打赏
  • 举报
回复
VB中的Co
zzh 2000-10-29
  • 打赏
  • 举报
回复
先检查是不是你的该没有注册,然后再检查一下是不是接口方法没有实现或参数不对。
dyw 2000-10-14
  • 打赏
  • 举报
回复
试试:
Private itf As COMDIALOGPROJECTLib.ComDialog
hUNt0 2000-10-14
  • 打赏
  • 举报
回复
试试:
Private itf As COMDIALOGPROJECTLib.IComDialog
Private Sub Form_Load()
Set itf = CreateObject("COMDIALOGPROJECT.ComDialog") '<-根据你在注册表中的键值
End Sub
你定义的是不是接口,有没有实现?
利用activeX实现matlab和vb的混合编程-vb_matlab_activeX.rar      想要在vb里面直接执行matlab的代码吗?想省去编译dll文件的代码吧?     好的,activeX帮你实现这样的功能.     activeX简介: ActiveX部件是Microsoft公司提供的一种用于模块集成的新的协议,它是Visual Basic工具箱的扩充部分。在程序加入ActiveX后,它将成为开发和运行环境的一部分。Matlab实现了ActiveX自动化服务支持,在Visual Basic下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用,实现VB与MATLAB间的无缝集成,该方式比较适合C/S模式,具有自动化程度高、效率高、占用资源少、数据交换能力强等优点,大大缩短了程序开发周期,优化了系统性能。 activeX运用: 使用ActiveX部件,首先必须获得Matlab ActiveX对象在系统注册表定义的名字─Matlab.Application。在VB创建ActiveX对象的代码如下: Dim Matlab as Object. Set Matlab = CreateObject Matlab.Application对象主要有3个函数,具体如下: (1) BSTR Execute([in]BSTR Command)方法 接受单一的字符串(Command), MATLAB将运行命令及结果作为一个字符串返回。用于执行一个合法的MATLAB命令; (2) PutFullMatrix方法 void PutFullMatrix pr, [in] SAFEARRAY pr, [in] SAFEARRAY pi ) 将一个指定变量名的一维或二维数组(mxArray)放入工作空间。 (3) GetFullMatrix方法 void GetFullMatrix pr, [in] SAFEARRAY pr, [in] SAFEARRAY pi ) 通过GetFullMatrix方法,从指定的工作空间检索一个完整的一维或二维的实型或虚型数组(mxArray),其实部和虚部分别存放到两个单独的Double型数组。[2] 通过这三种方法,可以方便地利用Matlab执行命令,从VB向Matlab输送数据或者从Matlab获取数据。 实例举例: 1.程序功能: 给出三个变量:x=0:0.05*pi:10*pi;y=sin;z=cos 并且做出x,y,z的三维图形,并在vb的image窗口显示,             下面是vb程序的界面,只有一个command按钮和image图片框    程序界面.jpg 下面是程序的运行结果: 程序运行结果.jpg 2.代码 Dim Matlab As Object Dim Result1 As String Dim Result2 As String Dim Result3 As String Private Sub Command1_Click() Result1 = Matlab.Execute;z=cos") Result2 = Matlab.Execute") Result3 = Matlab.Execute") Image1.Picture = Clipboard.GetData() Call Matlab.quit '退出Matlab End Sub Private Sub Form_Load() Set Matlab = CreateObject End Sub 3.程序源程序: vb_matlab_activeX.rar
VB6.0动态加载ActiveX控件漫谈 深圳 罗汉军 罗德昌 熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程, 但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。 VB6.0已能够解决该问题,只是帮助没有明确说明,并且没有描述到一些关键功 能,由于以前的版本可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语句用 New 关键字、CreateObject 或 GetObject 从部件外面将对象引用赋予变 量。 如果对象是从属对象,则需使用高层对象的方法,在 Set 语句指定一个对象引 用: Dim xlApp1 As Excel.Application Set xlApp1 = New Excel.Application 或 Dim xlApp As Object '定义存放引用对象的变量。 Set xlApp = CreateObject("excel.application") xlApp.Visible = True ---- 这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋 友也象我一样利用CreateObject尝试了无数次,却无功而返,不知微软公司是出于何种 考虑,动态加载ActiveX控件是扩展控件集合的方式实现,通过实际摸索,终于就如 何实现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说 明。 一、ActiveX控件 ---- ActiveX 控件是 Visual Basic 工具箱的扩充部分。使用 ActiveX 控件的方 法与使用其它标准内装的控件,如 CheckBox 控件,完全一样。在程序加入 ActiveX 控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。 ---- ActiveX 部件通过客户端/服务器关系与应用程序— 及与部件相互之间— 交 互作用。客户端是使用部件功能的应用程序代码或部件。服务器是部件及其关联的对象。 例如,假设应用程序使用 ActiveX 控件来提供一个标准的雇员窗体,供公司的多种 应用程序使用。提供雇员窗体的 ActiveX 控件就是服务器,使用这个控件的应用程序 就是服务器的客户端。 二、加载方法 ---- VB6.0对Controls 集合进行了扩展,以前版本Controls 集合在窗体上列 举出已加载的控件,这在迭代过程是很有用的。Controls 集合标识一个叫做 Controls的内在窗体级变量。如果忽略可选的 object 所在处的整数,则关键字 Controls 必须包括在内。我们通常在窗口使用如下代码: Text1.Text="Hello, world" 其实也可以使用如下代码达到同一目的: Controls(1).Text="Hello, world" ---- 在VB6.0除了原来的Clear、Remove 方法外(很奇怪,为什么微软在VB5.0 只提供这两种方法,而没有提供Add方法,因为没有Add,这两种方法也就没什么用处), 增加了Add方法,该方法就是用于动态加载控件的: Controls.Add(progid as String, Name as String); progid: ActiveX部件的ProgID,如:"VB.CheckBox"; Name:ActiveX部件加载后的名称,如: "MyCheckBox"; 若要在窗体上添加一个名为MyButton的按钮,可以使用: dim oControl as Object '窗体级变量 注意:这里声明为Object对象类型 Private Sub LoadControl() Set oControl = Controls.Add ("VB.CommandButton", "MyButton") oControl.Left = 10 oControl.Top = 10 oControl.Visible = True '使控件可见 End Sub ---- 这是VB6.0的标准语法,它在例程也是如此演示的,不过该方法虽然现实了 控件的动态加载,按钮显示在窗体上,可以象普通按钮一样按下去,但加载的控件不能 预先设计响应事件代码,如:事件Sub MyButton_Click()将是非法的,当然,可以将要 响应的事件封装在控件内部。就编程的观点来看该方法没什么大的用处,开发ActiveX 控件的目的是为了资源共享,为了被其他开发人员利用,所以要提供必要的事件接口, 显然利用该方法不行,通过分析VBControls等相关对象,找出VBControlExtender对象 与EventInfo相结合能提供事件陷井捕捉,VBControlExtender对象对动态添加控件特 别有用,它提供了一套通用的属性、方法、事件给开发人员,它的一个突出特点是能编 程设计控件的事件,熟习类编程的朋友对带事件的对象声明一定不会陌生: ---- Dim WithEvents objElemt as CElemtVBControlExtender也不例外,声明的 语法一样,只不过它有个特殊的事件ObjectEvent(Info As EventInfo),它能捕捉到对 象使用RaiseEvent产生的所有事件,EventInfo数据结构映射了事件的名称、参数个数 和参数的值。VBControlExtender和 EventInfo相结合,采用Select Case 就可以预先 将不同类对象的事件放置一起,各自独立运作。将上面的代码改写一下就能提供Click 事件了: ---- Dim WithEvents oControl As VBControlExtender '带事件声明声明之后您 就可以在代码窗口的左上角的对象下拉框发现该对象出现了,也就是说,该对象有了 事件或方法了,它的事件有DragDrop,DragOver ,LostFocus ,GotFocus , ObjectEvent和Validate,其ObjectEvent是通用的事件捕捉。 Private Sub LoadControl() Set oControl = Controls.Add ("VB. CommandButton", "MyButton") oControl.Visible = True End Sub Private Sub oControl_ObjectEvent(Info As EventInfo) Select Case Info.Name Case "Click" 'Click事件 '您可以添加处理Click事件代码 MsgBox "您按了MyButton!" Case Else ' 其他事件 ' Handle unknown events here. End Select End Sub ---- 当然对微软提供的标准控件能采用该方法添加,大家都不会怀疑,但自己开 发的控件也能吗?答案是肯定的,我们可以用一个实际的例子进行说明。 三、实例描述 ---- 假设一个本地网络的监控系统,需要在原理图与实物示意图间切换,原理图 包括组网结构、传输资源、监控主机等,而实物示意图包括路由器、设备、采集器等, 当然两种图的事件要一致,如双击某个设备图形将显示给设备的实时数据等,为了简化 维护,将原理图与实物示意图封装成ActiveX控件,由于每种图需要加载许多图形控 件,消耗资源较大,不能同时加载,需要将其分解为两个控件,在切换时首先卸载一个 控件,然后加载另一个控件,所以要实现动态加载ActiveX控件。 ---- 原理图控件为--Theory.ocx ,对应工程为CTheory; ---- 实物图控件为---Fact.ocx ,对应工程为CFact; ---- 注意:为了简化,在设计控件时不设置许可证关键字。 ---- 实物图控件上的图形对象可以被拖动,拖动后的位置信息通过事件 ChangePosition来通知拥有该控件的窗体,以便下次加载能显示在最后位置,实物 图和原理图控件都有双击事件完成的工作相同,其他事件此处忽略。 ---- 四、具体示例 ---- 1、准备工作 ---- 对控件Theory.ocx 、Fact.ocx 进行注册(利用Regsvr32.exe注册); ---- 建立窗体frmTest.frm ,在窗体上放置按钮cmdLoadOcx—“原理图” ---- 2、声明窗体级变量与加载函数LoadControl Dim WithEvents oControl As VBControlExtender '地图仿真控件对象 Dim mblnTheory As Boolean '是否显示原理图 Private Function LoadControl(intType As Integer) If Not oControl Is Nothing Then '首先判断对象是否存在,若存在则卸载 Controls.Remove("MapView") '卸载控件,此操作非常重要 End If If intType = 0 Then Set oControl = Controls.Add ("CTheory. Theory", "MapView") Else Set oControl = Controls.Add ("CFact.Fact", "MapView") End If oControl.Height = 3500 oControl.Width = 6500 oControl.Top = 100 oControl.Visible = True End Function Private Sub Form_Load() mblnTheory = True End Sub ---- 3、为按钮cmdLoadOcx编写代码 Private Sub cmdLoadOCX_Click() If mblnTheory Then Call LoadControl(0) mblnTheory = False cmdLoadOCX.Caption = "实物图" Else Call LoadControl(1) mblnTheory = True cmdLoadOCX.Caption = "原理图" End If End Sub ---- 4、为事件ChangePosition编写代码 Private Sub oControl_ObjectEvent (Info As EventInfo) Select Case Info.Name Case "ChangePosition" MsgBox CStr(Info.EventParamters.Item( 1).Value) + ":" + _ CStr(Info.EventParamters.Item(2).Value) Case "DbClick" '双击处理代码 Case Else ' End Select End Sub ---- 注意: EventInfo的参数EventParamters集合是以1开始的,一般来说,微 软新的集合一般是以1开始的,而旧的是以0开始的,如RdoErrors.Item(0)。 ---- 5、关闭窗口前卸载控件 Private Sub Form_Unload(Cancel As Integer) Controls.Remove("MapView") Set oControl = Nothing End Sub ---- 6、特别注意 ---- 通过Controls.Add方法添加的ActiveX控件一定不能在该工程有该控件的任 何引用,否则系统将出错。 四、小结 ---- 通过使用动态加载ActiveX控件使用庞大的应用程序变得很小,将不同的 ActiveX控件进行各种组合,使应用程序更加灵活多变,如您的应用系统要处理三十种门禁, 而某个具体的用户可能只有一种或两种门禁,根本没必要首先将所有门禁包含到应用 ,可将各个门禁独立封装,只安装注册需要的组件,就象Windows的自定义安装一样。 微软的未来技术基础是分布式的组件技术(DCOM),将会把代码的重用发挥得淋漓尽致。 您不妨试一试动态加载,也许会产生令您惊喜的效果! ---- 本代码在Win98、VB6.0(英文版)上编译、运行。
OLE 程序标识符请参阅特性 可使用 OLE 程序标识符(有时称作 ProgID)创建自动化对象。下表列出了 ActiveX 控件、Microsoft Office 应用程序和 Microsoft Office Web 组件的 OLE 程序标识符。 ActiveX 控件 Microsoft Access Microsoft Excel Microsoft Graph Microsoft Office Web 组件 Microsoft Outlook Microsoft PowerPoint Microsoft Word ActiveX 控件若要创建下表列出的 ActiveX 控件,请使用相应的 OLE 程序标识符。 若要创建此控件 请使用此标识符 CheckBox Forms.CheckBox ComboBox Forms.ComboBox CommandButton Forms.CommandButton Frame Forms.Frame Image Forms.Image Label Forms.Label ListBox Forms.ListBox MultiPage Forms.MultiPage OptionButton Forms.OptionButton ScrollBar Forms.ScrollBar SpinButton Forms.SpinButton TabStrip Forms.TabStrip TextBox Forms.TextBox ToggleButton Forms.ToggleButton Microsoft Access 若要创建下表列出的 Microsoft Access 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版本的 Access(运行宏的计算机上可用的 Access 版本)创建对象。 若要创建此对象 请使用这些标识符之一 Application Access.Application CurrentData Access.CodeData CurrentProject Access.CodeProject DefaultWebOptions Access.DefaultWebOptions Microsoft Excel 若要创建下表列出的 Microsoft Excel 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版本的 Excel(运行宏的计算机上可用的 Excel 版本)创建对象。 若要创建此对象 请使用这些标识符之一 备注 Application Excel.Application Workbook Excel.AddIn Workbook Excel.Chart 返回包含两张工作表的工作簿;其一个为图表,另一个为图表的数据。图表工作表为活动工作表。 Workbook Excel.Sheet 返回具有一张工作表的工作簿。 Microsoft Graph 若要创建下表列出的 Microsoft Graph 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版本的 Graph(运行宏的计算机上可用的 Graph 版本)创建对象。 若要创建此对象 请使用这些标识符之一 Application MSGraph.Application Chart MSGraph.Chart Microsoft Office Web 组件若要创建下表列出的 Microsoft Office Web 组件对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版本的 Microsoft Office Web 组件(运行宏的计算机上可用的 Microsoft Office Web 组件版本)创建对象。 若要创建此对象 请使用这些标识符之一 ChartSpace OWC.Chart DataSourceControl OWC.DataSourceControl ExpandControl OWC.ExpandControl PivotTable OWC.PivotTable RecordNavigationControl OWC.RecordNavigationControl Spreadsheet OWC.Spreadsheet Microsoft Outlook 若要创建下表列出的 Microsoft Outlook 对象,请使用相应的 OLE 程序标识符之一。如果使用不含版本号后缀的标识符,则会在可用的最近版本的 Outlook(运行该宏的计算机上的可用 Outlook 版本)创建对象。 若要创建此对象 请使用这些标识符之一 Application Outlook.Application Microsoft PowerPoint 若要创建下表列出的 Microsoft PowerPoint 对象,请使用相应的 OLE 程序标识符之一。如果使用不含版本号后缀的标识符,则会在可用的最近版本的 PowerPoint(运行该宏的计算机上的可用 PowerPoint 版本)创建对象。 若要创建此对象 请使用这些标识符之一 Application PowerPoint.Application Microsoft Word 若要创建下表列出的 Microsoft Word 对象,请使用相应的 OLE 程序标识符之一。如果使用不带版本号后缀的标识符,则会在最近版本的 Word(运行宏的计算机上可用的 Word 版本)创建对象。 若要创建此对象 请使用这些标识符之一 Application Word.Application Document Word.Document, Word.Template Global Word.Global
VB基础教程.doc 1.1 Visual Basic 概述 1.Visual Basic是什么      Visual Basic(简称VB)是Microsoft公司开发的一种通用的基于对象的程序设计语言。      “Visual” 指的是开发图形用户界面 (GUI) 的方法——不需编写大量代码去描述界面元素的外观和位置,而只要把预先建立的对象add到屏幕上的一点即可。      “Basic”指的是 BASIC (Beginners All-Purpose Symbolic Instruction Code) 语言,一种在计算技术发展历史上应用得最为广泛的语言。Visual Basic 在原有 BASIC 语言的基础上进一步发展,至今包含了数百条语句、函数及关键词,其很多和 Windows GUI 有直接关系。专业人员可以用 Visual Basic 实现其它任何 Windows 编程语言的功能,而初学者只要掌握几个关键词就可以建立实用的应用程序。Visual Basic Scripting Edition (VBScript) 是广泛使用的脚本语言,它是 Visual Basic 语言的子集,可嵌入HTML语言,用于网页设计,如ASP(Active Server Page)文件。      VB简单易学,通用性强,用途广泛。 2.VB的功能      VB可以用于可以开发多媒体、数据库、网络、图形等方面的应用程序。       数据访问特性允许对包括 Microsoft SQL Server 和其它企业数据库在内的大部分数据库格式建立数据库和前端应用程序,以及可调整的服务器端部件。       有了 ActiveX(TM) 技术就可使用其它应用程序提供的功能,例如 Microsoft Word 字处理器,Microsoft Excel 电子数据表及其它 Windows 应用程序。       Internet 能力强大,很容易在应用程序内通过 Internet 或 intranet访问文档和应用程序,或者创建 Internet 服务器应用程序。       已完成的应用程序是使用Visual Basic 虚拟机真正 .exe 文件,可以自由发布。 3.VB的发展      VB是伴随Windows操作系统而发展的,在国使用较广的版本有VB4.0、VB5.0、VB6.0。      VB4.0是为配合WIN95的问世于1995年推出的,既可用于编写WIN3.X平台的16位应用程序也可编写WIN95平台的32位应用程序;VB5.0主要用于编写WIN95平台的32位应用程序,较之VB4.0主要扩展了数据库、ActiveX和Internet方面的功能;VB6.0是与WIN98配合于1998年推出的,进一步加强了数据库、Internet和创建控件方面的功能。 4.VB的几个常用术语   工程(Project):是指用于创建一个应用程序的文件的集合。   对象(object):可控制的某个东西,VB主要有

3,245

社区成员

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

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