VB 写 com 的简单问题,可能就一句话(顶者有分)

helloqiner 2005-04-10 06:25:09
我看有的人写的 COM 调用时可以只使用 COM 名即可调用,
而我写的 COM 却都是必须采用 COM名.模块名 的方式调用。

用什么方法写出的 COM 客户端可以只使用 COM名 的方式调用呢?

顶者有分。
...全文
404 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
mysq 2005-05-17
  • 打赏
  • 举报
回复
学艺中.......
degeshi 2005-05-16
  • 打赏
  • 举报
回复
那我还是来顶一下
学习
qjzrd 2005-05-16
  • 打赏
  • 举报
回复
学习
qq78 2005-05-12
  • 打赏
  • 举报
回复
另外,楼主的代码风格不是很好
dim aa
aa =...

最好定义时即指明变量类型,像这样的格式
Dim aa AS ADODB.Connection
Set aa = NEW ADODB.Connection

qq78 2005-05-12
  • 打赏
  • 举报
回复
不是,我想实现的目的跟各位说的方法还是有些差别的。
比如我想写出的 Com 在客户端调用时只需用
dim aa
aa = new ComComponent
的方式创建Com对象,而不是采用
dim aa
aa = new ComComponent.ClassName
的方式。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我想楼主可能是理解错了,他要达到的是
dim aa
aa = new A.B

而实际上他写了
dim aa
aa = new B这样的代码,而他认为他写的代码的意义是:
dim aa
aa = new A

就像 Dim cn AS NEW AdoDB.Connection
也可以写做 Dim cn AS NEW Connection 一样,
却不能写做 Dim cn AS NEW AdoDB





qjzrd 2005-05-10
  • 打赏
  • 举报
回复
关注
ciby 2005-04-20
  • 打赏
  • 举报
回复
我想别人是用的一个常量吧
XunBaian 2005-04-15
  • 打赏
  • 举报
回复
不是,我想实现的目的跟各位说的方法还是有些差别的。
比如我想写出的 Com 在客户端调用时只需用
dim aa
aa = new ComComponent
的方式创建Com对象,而不是采用
dim aa
aa = new ComComponent.ClassName
的方式。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ComComponent 不是一个对象,是不能 New 的,在C++中也是,你一定弄错了。
viena 2005-04-15
  • 打赏
  • 举报
回复
不会吧,我记得只要没有名字冲突,就不用写库名吧
helloqiner 2005-04-15
  • 打赏
  • 举报
回复
不是,我想实现的目的跟各位说的方法还是有些差别的。
比如我想写出的 Com 在客户端调用时只需用
dim aa
aa = new ComComponent
的方式创建Com对象,而不是采用
dim aa
aa = new ComComponent.ClassName
的方式。
XunBaian 2005-04-12
  • 打赏
  • 举报
回复
设置接口类的 Instancing 属性为“6 - GlobalMultiUse”即可。

该类的所有Public成员不用点操作符可直接调用,如同使用本工程标准模块中的Public成员一样
faib920 2005-04-12
  • 打赏
  • 举报
回复
是不是.net里的
xjb_netboy 2005-04-12
  • 打赏
  • 举报
回复
这个我也不清楚
VBDN 2005-04-12
  • 打赏
  • 举报
回复
看看MSDN中的精彩解释:
如果类的 Instancing 属性的值设为 GlobalMultiUse,那么在该工程完成了之后,在使用类的属性和方法时不必显式地创建该类的实例。

GlobalMultiUse 对象(或全局对象)的属性和方法被添加到使用该对象的任何工程的全程命名空间中。也就是说,可以在别的工程中引用该部件,而且该全局对象的属性和方法的名称是可全程识别的,如同 Visual Basic 的一部分。


VBDN 2005-04-12
  • 打赏
  • 举报
回复
发慢了,我支持的是XunBaian(蓝水晶)!
XunBaian 2005-04-12
  • 打赏
  • 举报
回复
Instancing 属性


设置一个值,确定能否在工程之外创建公共类的实例。如果可以,如何实现。运行时无效。

设置值

Instancing 属性设置如下:

设置 描述
1 (缺省)私有。不允许其它应用程序访问关于类的类型库信息,也不能创建该类的实例。私有对象只能在自己的部件中使用。
工程类型不同,实例属性缺省也不同。只有对于Standard Exe工程中的类模块,私有才是缺省的。

当在 ActiveX Exe 工程或ActiveX DLL工程中插入一个新的类模块时,Instancing 属性的缺省值是 MultiUse。当在 ActiveX 控件工程中插入一个新的类模块时,Instancing 属性的缺省值是 PublicNotCreatable。

2 PublicNotCreatable。只有在自己的部件首先创建了对象的前提下,其它应用程序才能应用此类的对象。不能用 CreateObject 函数或 New 操作符来创建类对象。
3 SingleUse。允许其它应用程序从这个类创建对象,但客户创建的该类的每个对象都启动部件的一个新的实例。在 ActiveX DLL 工程中是不允许的。
4 GlobalSingleUse。类似于 SingleUse ,除了此类的各种属性和方法可以象简单的全局函数那样被调用。在 ActiveX DLL 工程中是不允许的。
5 MultiUse。允许其它应用程序从这个类创建对象。部件的一个实例可提供按此方式创建的任意数目的对象。
6 GlobalMultiUse。类似于 MultiUse,只附加了一点:这个类的各种属性和方法可以象简单的全局函数那样被调用。该类的实例不需要显式创建,因为它会自动创建。

设置 应用的工程类型
ActiveX Exe ActiveX DLL ActiveX Contol Std. Exe
Private X X X X
PublicNotCreatable X X X
SingleUse X
GlobalSingleUse X
MultiUse X X
GlobalMultiUse X X


说明

在 Visual Basic 5.0 里,Instancing 属性应用于 Class 模块,并得到扩展,以便与 Visual Basic 4.0 Public 属性的功能合并在一起。

如果类是可创建的,从其它应用程序创建该类的实例,可用下面的任何一种技术:

用 CreateObject 函数,如:
Set MyInstance = CreateObject("MyProject.MyClass")

在同一工程里(或当 Public 属性设为 True 时,在工程之外)用 Dim 语句,如:
Dim MyInstance As New MyClass

关键字 New 表明 MyInstance 被声明为 MyClass 的一个新实例。

如果 Public 属性为 False,则 Instancing 属性被忽略。总可以在定义该类的工程内创建类实例。如果 Public 属性为 True,则此类可视。因此一旦该类的实例存在,那么它是能受控于其它应用程序的。

注意 GlobalMultiUse 对象的各种属性和方法,不是提供对象的部件的全局名空间的一部分。例如,在包含 GlobalUtility 类模块的工程内部,为了使用这个对象的各种属性和方法,必须显式创建 GlobalUtility 的实例。全局对象的其它限制,列在“部件工具指南”的“编译代码部件”的“全局对象和代码库”中。
XunBaian 2005-04-12
  • 打赏
  • 举报
回复
如下为我刚刚的测试:

新建一个ActiveX DLL工程,将自动加入的类的Instancing 属性改为“6 - GlobalMultiUse”,添加一个Public方法:
Public Function GetMyName() As String
GetMyName = "helloqiner(小勤)"
End Function

新建一标准工程,引用刚才的DLL,代码如下:

Private Sub Form_Load()
MsgBox GetMyName
End Sub

启动后弹出MsgBox内容为:“helloqiner(小勤)”
VBDN 2005-04-12
  • 打赏
  • 举报
回复
支持楼上的!
helloqiner 2005-04-12
  • 打赏
  • 举报
回复
to XunBaian(蓝水晶):
我试过了,我写的程序就是 GlobalMultiUse 的,不行。

那个 com 好像是用 C++ 写的,因为源码已经丢失,现在想重写一个 com 替换掉它,可怎么也达不到只用 com名 调用的方式。
郁闷中…
SetMeFree 2005-04-11
  • 打赏
  • 举报
回复
你在哪里看到的?把那些代码弄过来看一下
加载更多回复(3)

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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