如何不用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%,最后程序访问了不该访问的内存,程序被关闭。

解决方案 »

  1.   

    <<com 深入编程>> 和 <<com 本质论>>其中讲到了,实现com,不在于具体语言,如果你理解的深入用asm实现也没问题。
    com是一种思想,实现并不受限。只是用c++比较容易实现(原因其中有说明),
    用 mfc 的话就...
      

  2.   

    下载COM与COM+从入门到精通这本书看,第二章有http://www.infoxa.com/asp/book_file/xxnr_book_633.htm
      

  3.   

    IUnknown vb不认识,最少还要实现自动化接口。
      

  4.   

    我不道知自己修改了那里,现在终于成功了,太过隐了。
    不过还有个编译的问题,在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接口,除了这个还要那些接口?
      

  5.   

    我知道是什么问题了。
    是类型转换时有二义性,每本讲com的书都有讲到的,唉,这样我都会忘了。