error LNK2019: 无法解析的外部符号
1.是否引入Lib和Dll文件,如检查工程——》右键属性——》配置属性——》链接器——》输入中“附加依赖项”是否缺少Lib文件等等
如:
error LNK2019: 无法解析的外部符号 _GetFileVersionInfoA@16,该符号在函数 __catch$?GetOCXInfo@CAgentRestOCX@@AAEXAAV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@00@
在“工程——》右键属性——》配置属性——》链接器——》输入——》附加依赖项”上添加"Version.lib"即可。
fatal error LNK1120: 1 个无法解析的外部命令
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没有执行,hwnd为空
了解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控件导入工程。
OCX嵌套OCX,ocx中的窗体句柄为空
1.尝试在程序中的InitInstance()中添加AfxEnableControlContainer();
解释:要想在应用程序中使用ActiveX控件,必须使你的应用程序成为ActiveX控件包容器。ActiveX 控件包容器就是完全支持ActiveX控件,并能把控件组合进自己的窗口或对话框的父应用程序。利用MFC的AppWizard,你可以很方便地创建你的包容器程序。事实上,在用AppWizard创建新的应用程序时,你的应用程序就被缺省设置为控件包容器,即在第3步选中支持ActiveX Controls的复选框。如果你在创建过程中没有选择这项技术支持,以后也可以手动地加入这项支持。如果你手动添加这个函数,和APPWIZEARD添加效果是一样的
不支持无窗口的 ActiveX 控件的解决方法
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系统下二次开发往往会弹出: