• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
一个喜欢踢球却不喜欢看球的人
博客园    首页    新随笔    联系   管理    订阅  订阅
ATL 开发 COM 过程中的一些经验、问题总结

ATLVC 6.0环境下,VS里面类似。

ATL项目名称:TestAtl

接口:ITestInterface

实现类:CTestInterface

方法名称:Myfun

Error:cannot instantiate abstract class due to following members

warning:pure virtual function was not defined

 

1、 Add method以后编译连接出现

以上Error 或者 Warning

   原因可能是参数类型不支持,例如用char* a可能会导致以上问题,换成BSTR a 就行了(有可能需要rebuild)。

2、1中的问题也可能真的是未实现必须的接口,一般是因为手动添加方法所致。

有方法声明的地方有这几处:

    (1)---- TestAtl.idl—

interface 接口名 : IUnknown

         {

                   [helpstring("method Myfun")] HRESULT Myfun (BSTR srcFile, BSTR desFolder);

             ……

         };

(2)---- ITestInterface.h----

STDMETHOD(Myfun)(BSTR srcFile,BSTR desFolder);

(3)---- ITestInterface.cpp----

STDMETHODIMP CTestInterface:: Myfun (BSTR srcFile, BSTR desFolder)

{return S_OK;}

(4)---- TestAtl.h---- 注意 此处是系统自动添加的,不需要手动写。

  ITestInterface: public IUnknown

  {

     public:

        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Myfun (

            BSTR srcFile,  BSTR desFolder) = 0;

……

}

如果你想手动添加批量方法的话,(1)(2)(3)处对应添加就可以了,不知道具体位置可以到class view 右击接口add method 自动加一个 仿照着来。

3、如果想用智能指针的话在“ITestInterface.h”的include下面加上_COM_SMARTPTR_TYPEDEF(ITestInterface, __uuidof(ITestInterface)); 就行了。 后面就可以 使用ITestInterfacePtr了。

4、假如你的接口实现类里面继承了其他接口,编译连接出现文章开始提到的error和waring,那么你要右击你继承的接口转到定义,然后看他定义里实现了什么方法, 在你实现的接口里面同样要声明并且实现,格式与你自己的接口的方法格式是一样的。例如

class ATL_NO_VTABLE CTestInterface:

         public CComObjectRootEx<CComSingleThreadModel>,

         public CComCoClass<CNMMarkerSymbol, &CLSID_NMMarkerSymbol>,

         public ITestInterface,//你自己的接口

public ISomeInterface//你继承的接口

{…………}

这时候你要右击ISomeInterface转到它定义的地方

struct __declspec(uuid("f3435802-5779-11d0-98bf-00805f7ced21"))

ISomeInterface: IUnknown

{

virtual HRESULT __stdcall FunA (BSTR a,BSTR b) = 0;//纯虚函数

    virtual HRESULT __stdcall FunB ( ) = 0;

};

你要在

(2)---- ITestInterface.h----

STDMETHOD(Myfun)(BSTR srcFile,BSTR desFolder); //模仿这个函数

STDMETHOD(FunA)( BSTR a,BSTR b);

STDMETHOD(FunB)();

并在cpp实现

 

(3)---- ITestInterface.cpp----

STDMETHODIMP CTestInterface:: Myfun (BSTR srcFile, BSTR desFolder)

{return S_OK;}

实现也是模仿

STDMETHODIMP CTestInterface:: FunA (BSTR a,BSTR b)

{return S_OK;}

STDMETHODIMP CTestInterface:: FunB()

{return S_OK;}

总结一下第4部分,这里Myfun是你的接口所实现的方法,你的接口需要继承ISomeInterface,这个接口一共有俩方法(funA funB),在你的接口里(.h,.cpp)面都需要声明并且实现。至于怎么继承ISomeInterface接口,还需要加些代码,找个例子看看就行了。

5、为什么智能指针还需要 Release呢,智能指针不是不需要进行管理引用计数了吗,为什么还需要程序员来release?

原因是,智能指针对象在对象销毁时释放所指向的接口,但如果没有在函数退出前,你销毁了com库,那就需要提前来Release它                                                                                       

 

用Visual C++编写DLL,如果在new project时选了MFC DLL,而后又想写成Regular DLL,即拥有自己的DllMain()入口函数,则在build时会遇到类似如下的link错误:

 

1>uafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in xxx.obj

 

此种连接错误在用DirectShow + MFC实现filter的时候必然会遇到:

 

"If you try to use MFC framework classes (CWinAapp-, CWnd- derived) in your AX filters, you end up with tons of error messages from the not-initialized MFC framework. To fix this several changes need to be done in the initialization functions (dllentry.cpp)."

 

要解决此类问题,有三种解决方案:

 

1)只需要在工程设置里面,把WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL中的_USRDLL,删除,就可以正确编译了。

一般第一种就能解决!

 

posted on 2012-05-19 11:34  脚会彈琴的人  阅读(1113)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3