VC常见问题集锦

 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 控件的解决方法

SKYLINE3D控件在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、关闭该命令运行窗口,然后重新启动计算机即可生效SKYLINE3D控件在win7系统下二次开发往往会弹出:

猜你喜欢

转载自blog.csdn.net/wklnewlife/article/details/8203814