各位高手:
本人新手,所用设备是pocket pc 2003,在PB5.0下写完了一个测试驱动flashtest.dll,编辑注册表,注册表中Dll,Prefix,Order和Index字段都设置好了,DLL文件放在\windows目录下,重启后,pocket pc 2003中注册表字段都在,但device.exe的加载模块中没有flashtest.dll文件,也就是说我的流驱动没有被加载,请高手解答一下为什么,是不是还需要别的设置?不胜感激。
不是这么加载的吧。
我们用真实的环境下是不用拷贝到Windows目录的
这种情况一般是驱动写得有问题,比如你驱动初始化结束之后就调用退出了。你可以在退出的部分输出调试信息看看。
我的驱动不是真实的操作硬件的驱动,而是测试是否能加载
下面贴出代码
#include
BOOL WINAPI DllEntryPoint(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
return true;
}
DWORD TST_Init (LPCTSTR pContext, LPCVOID lpvBusContext) { return 0; }
BOOL TST_Deinit (DWORD hDeviceContext) { return true; }
DWORD TST_Open (DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { return 0; }
BOOL TST_Close (DWORD hOpenContext) { return true; }
DWORD TST_Read (DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { return 0; }
DWORD TST_Write (DWORD hOpenContext, LPCVOID pBuffer, DWORD Count) { return 0; }
DWORD TST_Seek (DWORD hOpenContext, long Amount, WORD Type) { return 0; }
void TST_PowerUp (DWORD hDeviceContext) {}
void TST_PowerDown (DWORD hDeviceContext) {}
BOOL TST_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,
DWORD dwLenOut, PDWORD pdwActualOut) { return true; }
这是我的驱动代码,非常简单,不做任何操作,请各位高手看看有问题吗?
不是我们看,而是你要在各个部分输出调试信息,device.exe首先调用TST_Init,这时你直接return 0,那不就是退出了吗,并且你的DLL文件要export 各个接口函数,.def文件必须link进来。
如果代码OK的话,我猜还是因为dll没有证书签名的问题。
我的接口函数都是导出的,我用dumpbin/exports看了,然后我在TST_Init函数中直接写了个while(true){}死循环,可是device.exe加载的模块中依然没有我的FlashTest.dll文件,弄得我的都烦死了
DllEntryPoint应当如何写?在DllEntryPoint里面调用TST_Init?
引用: 引用 5 楼 nbcool 的回复:
不是我们看,而是你要在各个部分输出调试信息,device.exe首先调用TST_Init,这时你直接return 0,那不就是退出了吗,并且你的DLL文件要export 各个接口函数,.def文件必须link进来。
你的Init函数返回0肯定是不行的。而且你的这些个函数在.def中是否导出了。
你把生成的Dll放在/Windows目录下重启,如果是ColdBoot的话也没有作用。
对,参考MS的流接口书写的标准去写,不要自己随便去改动,就算想改动也等自己对整个东西很熟悉后再说.
还要在platform.bib文件中加东西吗?
我是直接把DLL放在\windows下了,并修改了注册表,其余的没改动过
另外的话我是用PB5里面样例驱动程序的,就是Flash驱动,没有修改过,直接将FAL.lib链接到FMD层一起编译成一个DLL的
里面有注册表里面有个基地址的字段,我没设,不知道是不是这个原因。
顺便弱弱的问一句,FLASH是怎么编址的?直接编址在RAM后面?比如我的RAM是0x00000000到0X00000001,然后我的FLASH地址是不是从0X00000002开始?
如果不是,请教各位高手FLASH是如何编址的?
platform.bib文件中是需要加这样一句话的:
Driver.dll $(_FLATRELEASEDIR)\Driver.dll NK SHK
否则,即便你手动把文件拷贝到window根目录下也不会在生成的image文件中存在你的驱动
另外,在bib文件中添加语句不一定非要是platform.bib,也可以是project.bib中,最终的系统文件是根据他们一起生成的。还有,添加这个语句之前,把你的驱动拷贝到window目录下也是必须的,否则,编译生成imange文件时候会抱错,原因在于,无法在window目录下找到相应的驱动。
对于,你说的注册不成功的问题,原因是在于你的函数:
DWORD TST_Init (LPCTSTR pContext, LPCVOID lpvBusContext) { return 0; }
这个函数是由device.exe通过你的注册表信息Prefix的值来调用的,它必须返回一个非零的值,否则初始化不成功,注册失败
不是说流驱动只需要一个DLL文件和注册表配置吗?还需要BIB文件和SOURCE文件呢?
我是放在真实的设备上测试的。
……
要加的内容就是要把DLL这个文件给放到将要生成image中去,如果没有这些准备工作,设备起来时,注册表怎么找到要用的DLL
那比如说我现在有一台windows mobile的手持设备,我必须将该NK.EXE用新生成的NK.EXE去替换是吗?
你要么就按上面的回复说的,在.bib中加入你的Dll,这样把你的Dll Build进image。
或者你单独Build你的Dll,然后用这个Dll复制到/Windows目录替换原来的Dll,然后
Reset设备。