高分问个简单的调用DLL中函数问题。

Zhang_ZP 2008-05-27 10:09:37
我在VS2005中建了个工程,此工程中我在一个静态函数中调用一个DLL中的导出类的一个函数。该DLL是用VC6.0写的。结果编译通过,连接报错。
-------------------------------------------------------------------------------
1>SynchroDlg.obj : error LNK2019: 无法解析的外部符号 "public: unsigned long __thiscall CPhoneBook::GetPhoneBookMESingle(int,struct SPhoneBookME *)" (?GetPhoneBookMESingle@CPhoneBook@@QAEKHPAUSPhoneBookME@@@Z),该符号在函数 "public: static unsigned long __stdcall CSynchroDlg::DownloadPhonebookProc(void *)" (?DownloadPhonebookProc@CSynchroDlg@@SGKPAX@Z) 中被引用
1>SynchroDlg.obj : error LNK2019: 无法解析的外部符号 "public: unsigned long __thiscall CPhoneBook::SetPhoneBookStorage(enum PhoneBookStorage)" (?SetPhoneBookStorage@CPhoneBook@@QAEKW4PhoneBookStorage@@@Z),该符号在函数 "public: static unsigned long __stdcall CSynchroDlg::DownloadPhonebookProc(void *)" (?DownloadPhonebookProc@CSynchroDlg@@SGKPAX@Z) 中被引用
1>SynchroDlg.obj : error LNK2019: 无法解析的外部符号 "public: unsigned long __thiscall CPhoneBook::GetPhoneBookPara(struct SPhoneBookPara *)" (?GetPhoneBookPara@CPhoneBook@@QAEKPAUSPhoneBookPara@@@Z),该符号在函数 "public: static unsigned long __stdcall CSynchroDlg::DownloadPhonebookProc(void *)" (?DownloadPhonebookProc@CSynchroDlg@@SGKPAX@Z) 中被引用
1>..\debug\OPPO TEST.exe : fatal error LNK1120: 3 个无法解析的外部命令


在线等答案,我已经加入了lib和dll
...全文
160 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhang_ZP 2008-05-28
  • 打赏
  • 举报
回复
问题解决了。DLL中头文件的问题。
sad_4978 2008-05-27
  • 打赏
  • 举报
回复
用Dependency Walker工具看看DLL的输出和头文件里的定义是否相同。
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
不要在静态函数里调用dll的东西
向静态函数传入类的指针,然后静态函数调用类的成员函数
在这个成员函数里,再调用dll
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
线程回调函数。
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
修改静态函数的调用约定
静态函数是用来干嘛的?
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ouyh12345 的回复:]
引用 14 楼 Zhang_ZP 的回复:
恩,我早就考虑这问题了。C++默认是__thiscall,而静态函数中是__stdcall,难道是这问题?


可能是调用约定的问题,C++默认的是cdcel
[/Quote]
-------------------------------------------------------
怎么解决?
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Zhang_ZP 的回复:]
恩,我早就考虑这问题了。C++默认是__thiscall,而静态函数中是__stdcall,难道是这问题?
[/Quote]

可能是调用约定的问题,C++默认的是cdcel
scq2099yt 2008-05-27
  • 打赏
  • 举报
回复
包含好库文件和头文件
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
恩,我早就考虑这问题了。C++默认是__thiscall,而静态函数中是__stdcall,难道是这问题?
xiaomatian 2008-05-27
  • 打赏
  • 举报
回复
是不是因为VC6和VC2005的编译?DLL编译的时候会出现改名的,而不是你写的完整的函数名,一般在同一个编译器下是没问题的,拿给其他的编译器就不对了。你可以采用序号来调用。或者用def这样的文件来进行改名。

以上是我的一点点看法,不对别取消。谢谢
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
没有源码。。。就有.h,.lib,.dll 已经看过MSDN了,没什么有用信息。
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
恩。CPhoneBook是导出类,另外我还用了CPhoneBook的另一个成员函数没报错。汗,接过其他的三个报错了。我看了下,没报错的那个返回是BOOL型的,报错的那三个是DWORD型的。还有,别人写的一个项目里调用成功了。他去掉了UNICODE,而我使用默认的。还有,我是在静态函数中调用的,而他在全局函数中调用。是不是因为调用约定的关系?
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
如果自己有源码,则重新生成一下,然后使用新的头文件和lib文件
zhoujianhei 2008-05-27
  • 打赏
  • 举报
回复
那么确认
CPhoneBook类是否导出?
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
为什么刚才我回了帖,现在消失了?
ps:我只能看头文件,lib文件不能看,我怎么知道他们匹配不匹配呢?
  • 打赏
  • 举报
回复
你不用找答案了.

VS2005无法使用VC6编写的静态库.
palmax 2008-05-27
  • 打赏
  • 举报
回复
是否你vc6写的dll的导出函数命名有问题?
一般导出最好加 extern "C"
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
头文件和lib文件是否匹配?这个怎么看,我只能看看头文件。lib文件怎么看?
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
头文件和lib文件是否匹配?
Zhang_ZP 2008-05-27
  • 打赏
  • 举报
回复
我的表达确实有问题。。汗

我在项目属性里已经加入了lib,DLL文件我基本上能放的地方都放了。起码debug文件夹下是放了的。二楼的动态加LIB我早试过了。。
加载更多回复(2)

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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