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,删除,就可以正确编译了。
一般第一种就能解决!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理