阅读:1863回复:13
关于驱动程序与dll交互的问题,人都折腾疯了!!
小弟想在驱动程序编译的时候加入了一个由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); |
|
|
沙发#
发布于:2007-06-29 21:57
看看函数调用约定一致不?目标文件的函数名一致不?
|
|
板凳#
发布于:2007-06-30 00:11
目标文件的函数名就一个getlen这个没问题,函数的调用约定这个不大清楚了,不过我在应用程序里调用它是没问题的
|
|
地板#
发布于:2007-06-30 09:54
cpp文件,缺省按照c++编译的,会加上修饰名,前面加extern "c"再试试
|
|
地下室#
发布于:2007-06-30 23:28
我试了,在驱动的编译文件MyEasyDll.h里改为
extern "c" __declspec(dllimport) int getlen(int size); 结果一样呀,继续郁闷~~~~~~ |
|
5楼#
发布于:2007-07-05 00:54
郁闷,有那么复杂吗?
|
|
|
6楼#
发布于:2007-07-05 10:36
....什么原因没搞懂,也没能解决掉,所以不知道该不该算复杂
|
|
7楼#
发布于:2007-07-05 13:41
用.c的后缀
|
|
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 ; } |
|
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. |
|
10楼#
发布于:2007-07-06 09:04
我的源文件是用ddk编译的,参考http://bbs.driverdevelop.com/htm_data/16/0707/103328.html
|
|
11楼#
发布于:2007-07-07 15:03
简单的办法,所有函数都写明调用约定,C还是C++(我的同事中就有好多人弄不明白其中的区别),_stdcall还是_cdecl
永远不要写 int getlen()这样的,比如可以这样写 extern "C" int _stdcall getlen() 时间久了,或者多人共用代码时,好处妙不可言。 |
|
12楼#
发布于:2007-07-07 17:46
谢谢各位支持,谢谢Delphips给我的参考, 谢谢GNiDiA的代码规范,问题终于解决了!
但也有个问题,为什么非要ddk编译出的lib才行?vc的为什么就不行呢? |
|
13楼#
发布于:2007-07-09 14:29
请教一下,dllimport dllexport这种交互方式是不是必须把一个驱动的lib文件加到另一个驱动的编译中呢?如果是,这样好像跟同一个驱动的函数调用没什么区别啊。不知道是不是我理解有错误
好像EngLoadImag和EngFindImageProcAddress就可以让两个独立的dll互相调用,当然调用的函数应该还是需要export的。不过这两个函数只能装载dll驱动,如果是一个sys驱动,知道它的export函数和参数,但不把它作为lib加入编译,不知道有没有办法从另外一个驱动中得到它的export函数指针。 |
|