VS2010调用dll失败

kevinlock 2014-04-13 12:00:26
环境:win7 64位 旗舰版 VS2010
1、创建Win32 Application dll 空 工程,添加相应文件(.h/.cpp);
2、需要引用第三方.dll文件,于是在某头文件中加如下代码并在相应Debug文件夹中放置miniupnpc.dll,在源码同级目录下Lib放置miniupnpc.lib:
#include <Windows.h>
#include <vector>
#include "p2pInstance.h"
#include "defType.h"
#include "../Inc/miniwget.h"
#include "../Inc/miniupnpc.h"
#include "../Inc/upnpcommands.h"
#include "../Inc/upnperrors.h"

using namespace std;

#pragma comment(lib, "../Lib/miniupnpc.lib")


编译通过。
3、在对应源文件某函数中使用miniupnpc.dll函数UPNP_AddPortMapping如下:
int Cupnp::addPortMapping(const char *intAddr, const char *intPort
, const char *extPort, const char *proto)
{
if (0 == intAddr || 0 == intPort || 0 == extPort || 0 == proto)
return UPNPCOMMAND_INVALID_ARGS;

proto = ProtoFix(proto);
if (0 == proto)
return UPNPCOMMAND_NOTSUPPORTED_PROTOCOL;

printf("add port mapping: intAddr-%s, intPort-%s, extPort-%s, proto-%s.\n"
, intAddr, intPort, extPort, proto);

UPNPUrls upnpUrls;
IGDdatas upnpIGDDatas;

return UPNP_AddPortMapping(upnpUrls.controlURL, upnpIGDDatas.first.servicetype
, extPort, intPort, intAddr, 0, proto, 0, 0);
}


addPortMapping为私有函数,但个人认为错不在这儿。报错如下:

1>Link:
1> Creating library G:\Code\P2P穿透\p2pLib\Debug\p2pLib.lib and object G:\Code\P2P穿透\p2pLib\Debug\p2pLib.exp
1>upnp.obj : error LNK2019: unresolved external symbol __imp__UPNP_AddPortMapping referenced in function "public: int __thiscall Cupnp::upnpAddPortMapping(char const *,char const *,char const *,char const *)" (?upnpAddPortMapping@Cupnp@@QAEHPBD000@Z)
1>G:\Code\P2P穿透\p2pLib\Debug\p2pLib.dll : fatal error LNK1120: 1 unresolved externals

1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:02.65
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

意思是无法链接到对应的UPNP_AddPortMapping函数,由此分析可能是dll导入不正确。google半天发现大部分都是通过工程设置来引用dll的。之前在VC6的例子均是通过上面提到的方式进行dll调用(也可以通过工程设置),在VS2010中为什么不行?一定要通过工程设置来实现吗?
...全文
188 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevinlock 2014-04-13
  • 打赏
  • 举报
回复
好吧,我自己回答吧。折腾到现在,终于搞定。事实证明这种方式是没有问题的。之所以出现这种问题是因为:miniupnpc.lib有问题所以编译不过。换完以后编译通过了。另外要注意:.lib与.dll版本一定要对应,否则运行时还会有问题。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧