大家帮忙看看是什么错误

fuan1981   2007-12-26 17:51 楼主
我自己写了一个驱动,代码如下:

BOOL WINAPI DllEntryPoint( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        switch(ul_reason_for_call)
        {
                case DLL_PROCESS_ATTACH:
                        DEBUGMSG(1,(TEXT("Call the DLL_PROCESS_ATTACH\n")));
                        break;
                case DLL_THREAD_ATTACH:
                        DEBUGMSG(1,(TEXT("Call the DLL_THREAD_ATTACH\n")));
                        break;
                case DLL_THREAD_DETACH:
                        DEBUGMSG(1,(TEXT("Call the DLL_THREAD_DETACH\n")));
                        break;
                case DLL_PROCESS_DETACH:
                        DEBUGMSG(1,(TEXT("Call the DLL_PROCESS_DETACH\n")));
                        break;
        }
        return TRUE;

}

DWORD TST_Init(DWORD dwContext)
{
        DWORD dwRet = 0;
        DEBUGMSG(1,(TEXT("Call the TST_Init\n")));

        memset(strBuf,0x00,BUFSIZE*sizeof(WCHAR));
        dwRet = 1;
        return dwRet;
}

BOOL TST_DeInit(DWORD hDeviceContext)
{
        DEBUGMSG(1,(TEXT("Call the TST_DeInit")));
        return TRUE;
}

...


然后把生成出来的DLL放入RELEASE目录,MAKEIMG后,在系统加载的时候出了这几句话:
DEVICE!CreateDevice: illegal entry point combination in driver DLL 'TstDrv.dll'
CreateDevice: creation of type 'TST', index 1, lib 'TstDrv.dll' returning 0x00000000, error code 1
DEVICE!I_ActivateDeviceEx: couldn't activate: prefix TST, index 1, dll TstDrv.dll, context 0x802e654

回复评论 (5)

在CE中,最简单的驱动程序莫过于一个内置(Built-in)设备的流接口驱动。对于一个不支持热拔插的设备,最方便的做法就是为其实现一个内置的流接口驱动。这种驱动只需要做以下工作:

1.实现一个动态库,其中实现以下函数:
    DWORD xxx_Init( LPCTSTR pContext, LPCVOID lpvBusContext);
    DWORD xxx_Deinit( DWORD hDeviceContext );
   
    DWORD xxx_Open(DWORD hDeviceContext,DWORD dwAccess, DWORD               dwShareMode);
    DWORD xxx_Close(  DWORD hDeviceContext );
   
    void XXX_PowerUp( DWORD hDeviceContext );
    void XXX_PowerDown(DWORD hDeviceContext );


    DWORD xxx_IOControl(
              DWORD hDeviceContext,
              DWORD dwCode,
              PBYTE pBufIn,
              DWORD dwLenIn,
              PBYTE pBufOut,
              DWORD dwLenOut,
              PDWORD pdwActualOut
              );

2.在注册表中添加如下项目。(一般放在Platform.reg)
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SampleDev]
  "Prefix"="XXX"
  "Dll"="MyDev.Dll"
  "Order"=dword:1
3.在BIB文件中添加项目,将所用到的文件加入BIN文件(一般放在Platform.bib)。
    MyDev.dll     $(_FLATRELEASEDIR)\MyDev.dll     NK SH
注:
SampleDev为任意与其它项目不重名的字符串.
每个函数名的前缀XXX可以是任意大写的字符串,只要保证与注册表中Prefix后面的值相同就行。

    现在,已经知道了需要实现那些东西,那你一定急不可待,想知道如何去实现它。好了,一个最直接的方法,在platform/your CPU’s folder/drivers 下新建一个目录,然后在drivers目录中的dirs文件中加入以你刚新建的目录名。
    在刚新建的目录下,新建你的C源代码文件,在其中实现上面所述的函数,及其功能。新建名称分别为sources, makefile, mydev.def的文件。其内容如下:
    makefile: 只需要这样一行
!INCLUDE $(_MAKEENVROOT)\makefile.def

mydriver.def文件定义需要输出的函数,这些函数能够被其它代码用动态加载的方法调用。格式:

LIBRARY     MyDev(这个字符串要和将要生成的动态库的文件名一样)

EXPORTS
    XXX_Init
    XXX_Deinit
    XXX_Open
    XXX_Close
    XXX_PowerOff
    XXX_Power_Down
    XXX_IOControl
Sources:这个文件很重要,内容也多,最基本的一个文件该有如下内容。

TARGETNAME=MyDev(指定要生成的动态库的名称)
TARGETTYPE=DYNLINK(指定要生成的是一个动态库)
(下面两项指定需要与哪些动态库链接,一般要第一项就足够了)
TARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \
              $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib

DEFFILE=MyDev.def (指定def文件)

DLLENTRY=DllEntry(指定动态库的入口函数)

SOURCES=(请在这写上你所有源文件的名字,它们将会被编译)


    好了,现在万事俱备,只剩编译啦。



参照仔细检查
点赞  2007-12-26 21:22
我也是这么做的呀,那编译的流程应该是怎么样的呀?
先运行什么命令,再运行命令,谢谢!
点赞  2007-12-27 14:51
顶一下
点赞  2007-12-27 14:56
在platformbuilder下的话,直接build
点赞  2007-12-27 20:37
谢谢ZTTZ,问题解决啦,由于流接口的函数名区分大小写,导致了我的驱动一直没有被系统所加载.
点赞  2007-12-28 09:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复