1.是否引入Lib和Dll文件,如检查工程——》右键属性——》配置属性——》链接器——》输入中“附加依赖项”是否缺少Lib文件等等
如:
error LNK2019: 无法解析的外部符号 _GetFileVersionInfoA@16,该符号在函数 __catch$?GetOCXInfo@CAgentRestOCX@@AAEXAAV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@00@
在“工程——》右键属性——》配置属性——》链接器——》输入——》附加依赖项”上添加"Version.lib"即可。
1.继承自基类的虚函数,只有声明没有定义,会出现此错误。
如:如继承自CObject中的AssertValid虚函数(详细实例参考《高级调试技术》ASSERT_VALID宏)。
头文件:
#pragma once #include "afx.h" class CPerson : public CObject { protected: CString m_strName; float m_salary; public: CPerson(void); CPerson(CString strName, float fSalary); ~CPerson(void); public: #ifdef _DEBUG virtual void AssertValid() const; // Override #endif };
源文件,定义已经注释掉,会出现此错误:
#include "StdAfx.h" #include "Person.h" CPerson::CPerson(CString strName, float fSalary):m_strName(strName), m_salary(fSalary) { } CPerson::CPerson(void) { } CPerson::~CPerson(void) { } #ifdef _DEBUG //void CPerson::AssertValid() const //{ // // call inherited AssertValid first // CObject::AssertValid(); // // // check CPerson members... // ASSERT( !m_strName.IsEmpty()); // Must have a name // ASSERT( m_salary > 0 ); // Must have an income //} #endif
以下错误:.
1>f:\wkl\agentsolution\agentsdk\restfulwebservice\cdispatch.h(729) : error C2143: 语法错误 : 缺少“;”(在“*”的前面) 1>f:\wkl\agentsolution\agentsdk\restfulwebservice\cdispatch.h(729) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>f:\wkl\agentsolution\agentsdk\restfulwebservice\cdispatch.h(729) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
可能原因:
1.头文件引用
2.不想使用默认构造函数的自定义类型:
如CDispatch* m_pDispatch;是CAgentSDKCtrl类的私有成员,在进入CAgentSDKCtrl构造函数之前m_pDispatch将会调用其自身默认构造函数,这时会出现上面编译错误。
protected: CDispatch(){m_bInitial = FALSE;}; //禁止缺省构造
如下加上class CDispatch;
class CDispatch; class CAgentSDKCtrl : public COleControl { DECLARE_DYNCREATE(CAgentSDKCtrl) ... }
了解OnCreate
OnCreate是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数调用的。
在view类中,Create 是虚函数由框架调用,是用来“生成一个窗口的子窗口”。 而OnCreate 函数是用来“表示一个窗口正在生成”。
此处hwnd为空,因为缺少ON_WM_CREATE()
BEGIN_MESSAGE_MAP(CAgentSDKCtrl, COleControl) ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) ON_WM_CREATE() ON_WM_DESTROY() END_MESSAGE_MAP()
int CAgentSDKCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CRect rect; m_pDispatch->Create(NULL, NULL, 0, rect, this, 123); return 0; }
ocx在类视图中添加接口,遇到“未能返回新元素代码,可能是语法错误”,这是因为vs2008对文件管理的混乱造成的。
解决:关闭工程,删除 *.ncb, *.suo 以及 *.aps 文件,然后打开工程,重新编译生成一下。
搜索网络,有众多解决方案,在开发控件遇到此问题的原因为,引用ActiveX控件不是新版本控件。
解决:新建一个测试容器的工程,将最新的ActiveX控件导入工程。
1.尝试在程序中的InitInstance()中添加AfxEnableControlContainer();
解释:要想在应用程序中使用ActiveX控件,必须使你的应用程序成为ActiveX控件包容器。ActiveX 控件包容器就是完全支持ActiveX控件,并能把控件组合进自己的窗口或对话框的父应用程序。利用MFC的AppWizard,你可以很方便地创建你的包容器程序。事实上,在用AppWizard创建新的应用程序时,你的应用程序就被缺省设置为控件包容器,即在第3步选中支持ActiveX Controls的复选框。如果你在创建过程中没有选择这项技术支持,以后也可以手动地加入这项支持。如果你手动添加这个函数,和APPWIZEARD添加效果是一样的
SKYLINE的3D控件在win7系统下二次开发往往会弹出:
“无法获取“AxTE3DWindow”控件的窗口句柄。不支持无窗口的 ActiveX 控件。”(5.1.3无此问题)
问题出在Win7系统的数据执行保护 (DEP)上,DEP通过监视程序以确保它们使用的系统内存是安全的,帮助防止操作系统受到病毒和其他安全威胁的破坏。
Win7关闭DEP的步骤如下:
1、新建一个文本文件mod.txt,然后输入:
bcdedit.exe/set {current} nx AlwaysOff
pause
2、保存后,再重命名为bat文件mod.bat;
3、然后在文件上鼠标右键以管理员身份运行即可,看到运行结果。
4、关闭该命令运行窗口,然后重新启动计算机即可生效SKYLINE的3D控件在win7系统下二次开发往往会弹出: