如何不用ATL、MFC写一个能在VB中使用的COM,就像VB中Reference里那些,要现实那些接口?
我现在已经写了一些:写了idl
写了个接口IHelloWorld继承IUnknown
写了个类CHelloWorld现实了IHelloWorld
写了个类厂CHelloWorldFactory现实IClassFactory
做了4个DLL导出函数
写了def文件
写资源文件现在我的类型库可以在VB的Reference中找到,问题是创建对象时出错,具体是这样
Dim hw as HelloWorld
Set hw = New HelloWorld我在组件的代码中放了很多MessageBox来看看组件被调用的过程:
类厂返回HelloWorld对象后,HelloWorld对象的AddRef和Release会被调用一次,接着类厂的Release被调用,这样类厂对象就delete了,接着,HelloWorld对象的QueryInterface被调用三次,分别查了三个接口,IUnknown、IHelloWorld、IPersistStreamInit,之后CPU占用100%,最后程序访问了不该访问的内存,程序被关闭。
我现在已经写了一些:写了idl
写了个接口IHelloWorld继承IUnknown
写了个类CHelloWorld现实了IHelloWorld
写了个类厂CHelloWorldFactory现实IClassFactory
做了4个DLL导出函数
写了def文件
写资源文件现在我的类型库可以在VB的Reference中找到,问题是创建对象时出错,具体是这样
Dim hw as HelloWorld
Set hw = New HelloWorld我在组件的代码中放了很多MessageBox来看看组件被调用的过程:
类厂返回HelloWorld对象后,HelloWorld对象的AddRef和Release会被调用一次,接着类厂的Release被调用,这样类厂对象就delete了,接着,HelloWorld对象的QueryInterface被调用三次,分别查了三个接口,IUnknown、IHelloWorld、IPersistStreamInit,之后CPU占用100%,最后程序访问了不该访问的内存,程序被关闭。
解决方案 »
- Connection->Excute执行删除语句没报错,数据库里这条记录还是存在?这是什么原因呢?
- 求真心的你分析下下面50行代码是哪引起程序崩溃,怎么报答都行!!
- 一个简单问题,散分,在线等待ing...
- N多VC QQ群,欢迎大家加入及补充
- 请问如果用钩子修改应用程序的界面,有哪些地方需要注意的?
- 关于updatedata
- 这是什么意思呀?
- 尝试了三种方法无法隐藏一个应用程序,请问还有其他方法么
- RE:为什么CTypedPtrList<CObject,CStroke*> m_strokeList编译通不过?
- 使用PostMessage()发送WM_PAINT消息的问题?
- 如何使用Skincrafter??? 在线等!!!
- 请教文件包含问题(新手)
com是一种思想,实现并不受限。只是用c++比较容易实现(原因其中有说明),
用 mfc 的话就...
不过还有个编译的问题,在HelloWorld的QueryInterface里,
if (riid == IID_IUnknown)
{
*ppv = /*(IUnknown*)*/this;
AddRef();
return S_OK;
}
如果要了(IUnknown*)会有错
HelloWorld.cpp(49) : error C2594: 'type cast' : ambiguous conversions from 'clas
s CHelloWorld *const ' to 'struct IUnknown *'
但我在类厂里也是这样做的,又没错接下也我想这个组件能在VBScript和JScript里用,是不是要实现IDispatch接口,除了这个还要那些接口?
是类型转换时有二义性,每本讲com的书都有讲到的,唉,这样我都会忘了。