VC6中支持MFC的工程中直接链接VC2005的库时,会出现编译错误。
原因在于VC6工程中的stdafx.h文件中包含了 afx.h 文件,VC6与VC2005中都有afx.h文件,但是内容却有区别
VC6的 afx.h 文件中有以下的定义:
#ifndef _AFXDLL
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "nafxcwd.lib")
#else
#pragma comment(lib, "nafxcw.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "uafxcwd.lib")
#else
#pragma comment(lib, "uafxcw.lib")
#endif
#endif
#else
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "mfc42d.lib")
#pragma comment(lib, "mfcs42d.lib")
#else
#pragma comment(lib, "mfc42.lib")
#pragma comment(lib, "mfcs42.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "mfc42ud.lib")
#pragma comment(lib, "mfcs42ud.lib")
#else
#pragma comment(lib, "mfc42u.lib")
#pragma comment(lib, "mfcs42u.lib")
#endif
#endif
#endif
VC2005中的 afx.h 文件中有以下的定义:
#ifndef _AFXDLL
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "nafxcwd.lib")
#else
#pragma comment(lib, "nafxcw.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "uafxcwd.lib")
#else
#pragma comment(lib, "uafxcw.lib")
#endif
#endif
#else
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "mfc80d.lib")
#pragma comment(lib, "mfcs80d.lib")
#else
#pragma comment(lib, "mfc80.lib")
#pragma comment(lib, "mfcs80.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "mfc80ud.lib")
#pragma comment(lib, "mfcs80ud.lib")
#else
#pragma comment(lib, "mfc80u.lib")
#pragma comment(lib, "mfcs80u.lib")
#endif
#endif
#endif
由于引用的MFC版本不同,编译时没办法通过。(也许还有别的办法,时间问题,没有继续调查)
既然静态编译不能通过,转而考虑到动态加载,使用LoadLibrary函数加载VC2005编译的DLL时,如果不是使用静态MFC链接,DLL的加载会失败,反回一个14001的错误信息。具体参照MSDN
当VC2005中使用静态链接MFC时,加载可以成功。并可以正常调用函数。但是在Debug遇到了一个下面的错误信息
Debug Error!
Program:...
Module;
File;i386/chkesp.c
Line:42
The value of ESP was not properly saved...
Debug模式下调试时,一调用DLL里的函数就会出现上面的错误,Release时没有问题。
解决办法:
在调用DLL的函数时,加上WINAPI关键字,具体作法如下:
VC2005中的函数定义:
INT FunctionName( comBuf *pBuff );
VC6中调用方法:
typedef int (WINAPI*FunctionNameFunc)(comBuf *pBuff _buff);
FunctionNameFunc FunctionNameFuncPoints = (FunctionNameFunc ) GetProcAddress(m_hLibInstance, "Trans_FunctionName");
以上办法可以解决,VC6中调用VC2005编译的DLL问题。
VC6中使用VC2005编译的DLL问题
最新推荐文章于 2017-05-09 17:01:00 发布