class ATL_NO_VTABLE CFinalCal:
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CFinalCal, &CLSID_FinalCal>,
public IDispatchImpl<IFinalCal, &IID_IFinalCal, &LIBID_FinalCom>
{
public:
CFinalCal()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_FinalCal)
DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CFinalCal)
COM_INTERFACE_ENTRY(IFinalCal)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()public:
STDMETHOD(Add)(/*[in]*/ int nOp1,/*[in]*/ int nOp2,/*[out,retval]*/ int *pret);
STDMETHOD(Sub)(/*[in]*/ int nOp1,/*[in]*/ int nOp2,/*[out,retval]*/ int *pret);
};#endif 上面这个类 编译时出现错误
c:\work\project\EX5\FinalCom\FinalCom\FinalCal.h(14): error C2970: 'ATL::IDispatchImpl' : template parameter 'plibid' : 'LIBID_FinalCom' : an expression involving objects with internal linkage cannot be used as a non-type argument
c:\work\project\EX5\FinalCom\FinalCom\FinalCal.h(14): error C2970: 'ATL::IDispatchImpl' : template parameter 'piid' : 'IID_IFinalCal' : an expression involving objects with internal linkage cannot be used as a non-type argument
c:\work\project\EX5\FinalCom\FinalCom\FinalCal.h(13): error C2970: 'ATL::CComCoClass' : template parameter 'pclsid' : 'CLSID_FinalCal' : an expression involving objects with internal linkage cannot be used as a non-type argument
而CLSID_FinalCal的定义是通过.idl文件MIDl编译出来的一个.c文件来定义的。
如下:#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}#endif !_MIDL_USE_GUIDDEF_MIDL_DEFINE_GUID(IID, IID_IFinalCal,0x63c830b3,0x0340,0x4f92,0xa7,0xb9,0xdf,0xa5,0xd7,0x9e,0xe9,0x4f);
MIDL_DEFINE_GUID(IID, LIBID_FinalCom,0xDC823CBF,0xD3EF,0x4F3C,0x83,0xE5,0x27,0x89,0x57,0x1A,0xCF,0x8A);
MIDL_DEFINE_GUID(CLSID, CLSID_FinalCal,0xd714ac8a,0xab2f,0x4faa,0xa6,0x85,0x53,0x78,0xc6,0xf1,0x91,0xd3);
请问有什么办法解决这个参数的问题吗?
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CFinalCal, &CLSID_FinalCal>,
public IDispatchImpl<IFinalCal, &IID_IFinalCal, &LIBID_FinalCom>
{
public:
CFinalCal()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_FinalCal)
DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CFinalCal)
COM_INTERFACE_ENTRY(IFinalCal)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()public:
STDMETHOD(Add)(/*[in]*/ int nOp1,/*[in]*/ int nOp2,/*[out,retval]*/ int *pret);
STDMETHOD(Sub)(/*[in]*/ int nOp1,/*[in]*/ int nOp2,/*[out,retval]*/ int *pret);
};#endif 上面这个类 编译时出现错误
c:\work\project\EX5\FinalCom\FinalCom\FinalCal.h(14): error C2970: 'ATL::IDispatchImpl' : template parameter 'plibid' : 'LIBID_FinalCom' : an expression involving objects with internal linkage cannot be used as a non-type argument
c:\work\project\EX5\FinalCom\FinalCom\FinalCal.h(14): error C2970: 'ATL::IDispatchImpl' : template parameter 'piid' : 'IID_IFinalCal' : an expression involving objects with internal linkage cannot be used as a non-type argument
c:\work\project\EX5\FinalCom\FinalCom\FinalCal.h(13): error C2970: 'ATL::CComCoClass' : template parameter 'pclsid' : 'CLSID_FinalCal' : an expression involving objects with internal linkage cannot be used as a non-type argument
而CLSID_FinalCal的定义是通过.idl文件MIDl编译出来的一个.c文件来定义的。
如下:#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}#endif !_MIDL_USE_GUIDDEF_MIDL_DEFINE_GUID(IID, IID_IFinalCal,0x63c830b3,0x0340,0x4f92,0xa7,0xb9,0xdf,0xa5,0xd7,0x9e,0xe9,0x4f);
MIDL_DEFINE_GUID(IID, LIBID_FinalCom,0xDC823CBF,0xD3EF,0x4F3C,0x83,0xE5,0x27,0x89,0x57,0x1A,0xCF,0x8A);
MIDL_DEFINE_GUID(CLSID, CLSID_FinalCal,0xd714ac8a,0xab2f,0x4faa,0xa6,0x85,0x53,0x78,0xc6,0xf1,0x91,0xd3);
请问有什么办法解决这个参数的问题吗?
解决方案 »
- VC++ Excel 操作 编译错误
- 求助:加载一个位图,如何获取某个部分的位图
- 德安进销存1.0.2计划概要
- 见过这种情况没有,CTreeCtrl的加号居然变小了。。。
- 求助一个非常怪异的崩溃问题,请高手回答,在线等。。。
- *COM技术: 对外提供一个接口, 聚合 和 函数GetMyInterface(IUnkown *ppI) 有什么区别吗?
- 急!!!高手请进!!!有关使用Winsock之TCP协议的问题。。。
- 析构函数报错
- 获取Adobe Reader窗口的文本?
- C++与C++ Builder 有什么不同?
- 谁用过NTgraph控件,如何添加一个滚动条来控制图象?
- 请问那位有《图像模式识别--VC++技术实现》(作者:杨淑莹)的配套光盘
我查了下MSDN,这个错误是
'class' : template parameter 'param' : 'arg' : an expression involving objects with internal linkage cannot be used as a non-type argumentYou cannot use the name or address of a static variable as a template argument. The template class expects a const value that can be evaluated at compile time.The following sample generates C2970:意思就是模板参数不能使用静态变量。
而'CLSID_FinalCal'在 _i.c文件中定义的就是如上。而这个文件是MIDL自动生成的。是不是编译器设置问题啊?-----
------------------------------------------------------------------------
是你ide问题
能具体说明一下吗?
找到 CLSID_FinalCal,和 IID_FinalCal 的定义,在前面加入extern "C"
找到 CLSID_FinalCal,和 IID_FinalCal 的定义,在前面加入extern "C"------------------------------------------------------------------在你的提示下,我修改了我的include 文件;
出现了下面的问题,这个问题我不知道是什么么问题?FinalCom error PRJ0019: A tool returned an error code from "Performing registration"
FinalCom warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
看了 error log
如下:
@echo off
regsvr32 /s /c "c:\work\project\Ex5\FinalCom\FinalCom\Debug\FinalCom.dll"
if errorlevel 1 goto VCReportError
goto VCEnd
:VCReportError
echo Project : error PRJ0019: A tool returned an error code from "Performing registration"
exit 1
:VCEnd
]
Creating command line "c:\work\project\Ex5\FinalCom\FinalCom\Debug\BAT000038.bat"