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,删除,就可以正确编译了。
一般第一种就能解决!
转载于:https://www.cnblogs.com/sxw_cug/archive/2012/05/19/2508752.html
ATL 开发 COM 过程中的一些经验、问题总结相关推荐
- 【无标题】研究过程中的一些经验感悟
基础研究过程中的一些经验感悟-- 关于"金字塔结构逻辑运用二值脉冲对简单图形处理"相关知识和方法的介绍 首先作者写这篇介绍还是感觉底气有点不足,毕竟知识储备有限.但是对于作者自己的 ...
- 在顶级游戏开发的过程中需要怎样的编程实力?
做游戏技术主要讲究的是套路,以及对套路的掌握程度.比如说你要搞个体积光,那么从用mesh+uv动画,到volumetric scattering你都得知道,而且要知道这些方案的优缺点,以及具体的实现细 ...
- 关于用DELPHI开发服务器软件中的一些经验
保存 评价 游戏规则 免费注册 资料下载 关于本站 问题分类 编程问题 非技术题 富翁列表 我的信息 提出问题 在线富翁 富翁日历 笔记列表 我的笔记 写作笔记 全文检索 <专家门诊> / ...
- uniapp开发app过程中集成友盟统计
uniapp在开发app过程中,需要集成友盟统计,可参考以下流程进行配置 友盟统计官网注册并获取appkey 单独创建安卓跟ios的应用,获取到appkey(这里以安卓为例) 配置manifest.j ...
- 软件开发的过程中, 一定需要简单设计?
2017.7.4, 深圳, Ken Fang 前言: 简单设计只是写文档, 而不能指导开发, 这样的简单设计, 就只是在瞎折腾. 但是, 软件开发的过程中, 不做简单设计, 软件开发就永远做不好. 简 ...
- Eclipse开发调试过程中经常使用到的常见按钮
在项目过程中一些刚刚入行的同学经常出现一些类似于"刚刚那个窗口怎么不见了"."我的控制台呢"这样的问题,总的来说就是对eclipse这个工具使用不熟练.于是我就 ...
- 大数据在开发的过程中,主要会遇到哪些难点?
大数据开发的难点主要是监控,怎么样规划开发人员的工作?开发人员随随便便采集了一堆垃圾数据,并且直连数据库.短期来看,这些问题比较小,可以矫正.但是在资产的量不断增加的时候,这就是一颗定时炸弹,随时会引 ...
- 软件开发的过程中,这些文档你都用到了吗?
导读: 做软件的目的就是要满足客户的需求,这个需求包括功能.外观.操作.时间及性能等各方面.那么,在软件开发过程中那部分最重要呢,程序员说"毋庸置疑,我编写的程序实现了客户提出的功能以及业务 ...
- 网站开发建设过程中所涉及到的技术问题应当如何面对?
随着当下网络信息技术的迅速发展,几乎当下大部分国内企业都有属于自家的官方网站,也正是在网站如此普及的程度下,让我们意识到网站建设技术的重要性.那么在网站建设中所涉及到的技术上问题也有很多,下面我们可以 ...
最新文章
- win mysql 最大连接_常用的三种修改mysql最大连接数的方法
- CRLB Case Practice ( No.1 )
- H5视频之video.js播放rtmp直播源和hls直播源
- java mail urlname_javamail收发信件时,服务器,收发方的名称应该怎样设置才有效呢
- android webview js 交互框架,自定义android混合框架开发实践1:实现基础andorid和webview交互...
- 数据科学家必会的六大 NLP 技术!
- 别再瞎学 Python 了!
- 微信机器人开发SDK使用教程--删除朋友圈
- paip java.net.SocketException No buffer space available的解决办法及总结
- nxlog收集linux日志,Nxlog——日志采集神器简介
- C#System.Text.RegularExpressions.Regex使用
- dell云存储服务器,dell云存储服务器(戴尔存储服务器)
- dell笔记本屏幕进水有水印
- Java面向对象设计
- 5个方法助设计师保持创造力
- request无法获取到前端发送的form表单数据
- 【Windows批处理】常用命令解析
- Android SQLite 简单的使用步骤
- Java版的双色球买彩票程序
- javascript trim方法