happyhhhh2
驱动牛犊
驱动牛犊
  • 注册日期2006-04-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分423分
  • 威望66点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
阅读:1861回复:13

关于驱动程序与dll交互的问题,人都折腾疯了!!

楼主#
更多 发布于:2007-06-29 21:51
小弟想在驱动程序编译的时候加入了一个由dll引出的函数一起编译想让其共同完成驱动的生成,仅在passive_level上调用,于是写了下面的两个简单的驱动跟函数验证下行否,结果郁闷了,按照正常的应用程序+连接库的渠道未能通过编译,显示下面信息,还请各位指教为何会如此呀?实在不明白,已经晕了无数次了.
unresolved external symbol "__declspec(dllimport) int __stdcall getlen(int)" (__imp_?getlen@@YGHH@Z) referenced in function "long __stdcall Wdm1Pnp(struct _DEVICE_OBJECT *,struct _IRP *)" (?Wdm1Pnp@@YGJPAU_DEVICE_OBJECT@@PAU

dll里函数极其简单:
int getlen(int size)
{
int b = 2;
b += size;
return b;
}
在驱动里调用地点是pnp中
    int c = getlen(4);
附件名称/大小 下载次数 最后更新
wdmtest.rar (53KB)  17 2007-06-29 21:51
bamu1984z
驱动牛犊
驱动牛犊
  • 注册日期2006-09-18
  • 最后登录2008-07-24
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望78点
  • 贡献值0点
  • 好评度76点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-06-29 21:57
看看函数调用约定一致不?目标文件的函数名一致不?
happyhhhh2
驱动牛犊
驱动牛犊
  • 注册日期2006-04-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分423分
  • 威望66点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-30 00:11
目标文件的函数名就一个getlen这个没问题,函数的调用约定这个不大清楚了,不过我在应用程序里调用它是没问题的
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-06-30 09:54
cpp文件,缺省按照c++编译的,会加上修饰名,前面加extern "c"再试试
happyhhhh2
驱动牛犊
驱动牛犊
  • 注册日期2006-04-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分423分
  • 威望66点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-30 23:28
我试了,在驱动的编译文件MyEasyDll.h里改为
extern "c"
__declspec(dllimport) int getlen(int size);
结果一样呀,继续郁闷~~~~~~
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-07-05 00:54
郁闷,有那么复杂吗?
人不靓仔心灵美,版头不正红花仔!
happyhhhh2
驱动牛犊
驱动牛犊
  • 注册日期2006-04-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分423分
  • 威望66点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-05 10:36
....什么原因没搞懂,也没能解决掉,所以不知道该不该算复杂
dfbb1980
驱动牛犊
驱动牛犊
  • 注册日期2006-07-05
  • 最后登录2007-07-30
  • 粉丝0
  • 关注0
  • 积分820分
  • 威望83点
  • 贡献值0点
  • 好评度82点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-07-05 13:41
用.c的后缀
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-07-05 14:51
我的就可以啊,不过是静态裤

KernelLib.h

#define AVEOCamSDK_EXPORTS

#ifdef AVEOCamSDK_EXPORTS
#define AVEOCamSDK_API  __declspec(dllexport)  
#else
#define AVEOCamSDK_API  __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C" {
#endif

AVEOCamSDK_API void Test(int a, int b,int *pTest);

#ifdef __cplusplus
}
#endif // __cplusplus

KernelLib.c文件


#include "wdm.h"
#include "KernelLib.h"


AVEOCamSDK_API void Test(int a, int b,int *pTest)
{
    *pTest = a+b;
    return ;
}
happyhhhh2
驱动牛犊
驱动牛犊
  • 注册日期2006-04-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分423分
  • 威望66点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-07-06 00:24
请问下Delphips ,你在驱动里怎么调用你的KernelLib库的啊?我也编译了一个c的lib,然后把驱动程序MyEasyDll.h改为:
#define AVEOCamSDK_EXPORTS

#ifdef AVEOCamSDK_EXPORTS
#define AVEOCamSDK_API  __declspec(dllexport)  
#else
#define AVEOCamSDK_API  __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C" {
#endif

AVEOCamSDK_API void Test(int a, int b,int *pTest);

#ifdef __cplusplus
}
#endif // __cplusplus
结果我都还没用那函数就报编译错误:
Error translating  wdmtest\objchk\i386\wdm1.sys: Matching PDB file not found.
Error executing c:\winnt\system32\cmd.exe.
Delphips
驱动小牛
驱动小牛
  • 注册日期2003-11-10
  • 最后登录2011-02-21
  • 粉丝1
  • 关注1
  • 积分-363分
  • 威望168点
  • 贡献值0点
  • 好评度151点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-07-06 09:04
我的源文件是用ddk编译的,参考http://bbs.driverdevelop.com/htm_data/16/0707/103328.html
GNiDiA
驱动小牛
驱动小牛
  • 注册日期2006-10-11
  • 最后登录2017-10-09
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望145点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-07-07 15:03
简单的办法,所有函数都写明调用约定,C还是C++(我的同事中就有好多人弄不明白其中的区别),_stdcall还是_cdecl

永远不要写 int getlen()这样的,比如可以这样写

extern "C" int _stdcall getlen()

时间久了,或者多人共用代码时,好处妙不可言。
happyhhhh2
驱动牛犊
驱动牛犊
  • 注册日期2006-04-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分423分
  • 威望66点
  • 贡献值0点
  • 好评度45点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-07-07 17:46
谢谢各位支持,谢谢Delphips给我的参考, 谢谢GNiDiA的代码规范,问题终于解决了!
但也有个问题,为什么非要ddk编译出的lib才行?vc的为什么就不行呢?
jelyon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-04
  • 最后登录2007-07-24
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-07-09 14:29
请教一下,dllimport dllexport这种交互方式是不是必须把一个驱动的lib文件加到另一个驱动的编译中呢?如果是,这样好像跟同一个驱动的函数调用没什么区别啊。不知道是不是我理解有错误
好像EngLoadImag和EngFindImageProcAddress就可以让两个独立的dll互相调用,当然调用的函数应该还是需要export的。不过这两个函数只能装载dll驱动,如果是一个sys驱动,知道它的export函数和参数,但不把它作为lib加入编译,不知道有没有办法从另外一个驱动中得到它的export函数指针。
游客

返回顶部