VC6中使用VC2005编译的DLL问题

 在VC6的工程中,使用VC2005编译的DLL的一个解决办法。

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问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值