WINCE驱动dll加载问题

jqq850226   2009-7-8 10:24 楼主
我在移植SC2440驱动cdev.dll,它在注册表里的项如下。但是它的入口函数DllEntry在process attach之后立刻就process detach了,初始化函数DEV_Init没有执行,DEV_Init函数在开头用RETAILMSG打印一串信息,在串口上没看到输出。
在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下确实已经看到了这个cdev.dll,
但在在[HKEY_LOCAL_MACHINE\Drivers\Active]下没看到这个DLL。
设备管理器是不是在启动时加载[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下的所有DLL吗?
网上看到有人也遇到过类似的问题,但没有说是怎样解决的

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\cdev]
   "Prefix"="DEV"
   "Dll"="cdev.dll"
   "Index"=dword:1
   "Order"=dword:1

回复评论 (19)

可能是驱动提供的接口函数不规范或者不全吧,设备管理器不认为你的驱动是一个标准流驱动.
不过我做驱动很少加DllEntry入口.
点赞  2009-7-8 11:26
def 文件导出流接口函数了吗?
点赞  2009-7-8 12:03
def文件已经导出:
cdev.def文件:

LIBRARY CDEV
EXPORTS
        DEV_Close
        DEV_Deinit
        DEV_Init
        DEV_IOControl
        DEV_Open
        DEV_PowerDown
        DEV_PowerUp
        DEV_Read
        DEV_Seek
        DEV_Write
点赞  2009-7-8 12:47
流接口函数是:
BOOL DEV_Close(DWORD hOpenContext);
BOOL DEV_Deinit(DWORD hDeviceContext);
DWORD DEV_Init(DWORD dwContext);
DWORD DEV_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode);
void DEV_PowerUp(DWORD hDeviceContext);
void DEV_PowerDown(DWORD hDeviceContext);
DWORD DEV_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
DWORD DEV_Seek(DWORD hOpenContext, long Amount, DWORD Type);
DWORD DEV_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes);

BOOL DEV_IOControl(DWORD hOpenContext,
                                   DWORD dwCode,
                                   PBYTE pBufIn,
                                   DWORD dwLenIn,
                                   PBYTE pBufOut,
                                   DWORD dwLenOut,
                                   PDWORD pdwActualO);
流接口函数的内部实现已经被我改为非常简单的打印信息,返回值,可是还是不能调用DEV_Init函数,启动后cdev.dll显示没有Active;
点赞  2009-7-8 12:51
DEV_Init


这个函数不要返回 0,返回 0 就不会加载驱动,你看看。
点赞  2009-7-8 13:59
我已经吧我的init函数改掉了,不进行任何操作,return 1,可是串口看不到打印信息,应该是没有调用这个函数就进入到 dllentry函数detach了
DWORD DEV_Init(DWORD dwContext)
{

  RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
  RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
  RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
  RETAILMSG(1,(TEXT("CDEV: TESTDEV_Init----\r\n")));
  return 1;
}
点赞  2009-7-8 14:46
这个问题困扰了2天了,郁闷
点赞  2009-7-8 15:33
自己顶
点赞  2009-7-8 19:06
init函数参数不对 应该有两个参数 LPCTSTR pContext,LPCVOID lpvBusContext
点赞  2009-7-8 20:02
我看到的资料init函数的原型都是一个参数啊
点赞  2009-7-8 20:14
会不会是开发板的BSP有问题。
点赞  2009-7-8 20:47
用 Depends 查看流函数到底导出了没有?


如果不会看,那么把 dll 文件发给我


zaodt.ms@gmail.com
点赞  2009-7-8 20:51
已经发到你的邮箱;感觉是有问题的。
点赞  2009-7-9 09:09
看到了,可能问题已经找到了,如下:


我用 Depend 看了你的 dll 文件,内容如下:

======================

TEST_Close
TEST_Deinit
TEST_IOControl
TEST_Init
TEST_Open
TEST_PowerDown
TEST_PowerUp
TEST_Read
TEST_Seek
TEST_Write

======================

而你在注册表的前缀为:

"Prefix"="DEV"


可能就是这个问题引起的!
点赞  2009-7-9 10:07
现在都已经改成TEST了,昨天刚刚改的啊
点赞  2009-7-9 10:29
现在的def文件我已经改了,昨天晚上重写的驱动

LIBRARY CDEV
EXPORTS
TEST_Close
TEST_Deinit
TEST_Init
TEST_IOControl
TEST_Open
TEST_PowerDown
TEST_PowerUp
TEST_Read
TEST_Seek
TEST_Write
点赞  2009-7-9 10:31
前缀使用 3 个大写字母,你改为 TES_Init 试试看;

记着注册表前缀也要改成一样的。
点赞  2009-7-9 10:55
果然是这个问题,试了一下,结贴了
点赞  2009-7-9 12:29
我也遇到这个问题了,微软还真搞笑,前缀非要3个字符,要不是看了这个帖子不知道又要被折磨多久呢,
谢谢啊!
点赞  2009-10-20 18:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复