5490|15

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

写了一个最基本的流驱动,可是在DM里为什么无法激活呢? [复制链接]

代码如下
*********************GIO_DRV.h*************************************
#include "stdafx.h"
#include


__declspec(dllexport) extern DWORD        GIO_Init1(LPCTSTR pContext, LPCVOID lpvBusContext);
__declspec(dllexport) extern BOOL        GIO_Deinit(DWORD hDeviceContext);
__declspec(dllexport) extern DWORD        GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode);
__declspec(dllexport) extern BOOL        GIO_Close(DWORD hOpenContext);
__declspec(dllexport) extern BOOL        GIO_IOControl(DWORD hOpenContext, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn,
                                                                                                  PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut);
__declspec(dllexport) extern void        GIO_PowerUp(DWORD hDeviceContext);
__declspec(dllexport) extern void        GIO_PowerDown(DWORD hDeviceContext);
__declspec(dllexport) extern DWORD  GIO_Read(DWORD hOpenContext, PUCHAR pBuffer, ULONG Count);
__declspec(dllexport) extern DWORD  GIO_Write(DWORD hOpenContext, PUCHAR pBuffer, ULONG Count);
__declspec(dllexport) extern DWORD  GIO_Seek1(DWORD hOpenContext, long Amount, WORD Type);
****************************GIO_DRV.c*********************************************
#include "stdafx.h"
#include "GIO_DRV.h"

void DBGOut(DWORD dwValue);
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
        switch(ul_reason_for_call){
                case DLL_PROCESS_ATTACH:
                        OutputDebugString(L"GIO_DRIVER - DLL_PROCESS_ATTACH\n");
                        break;
                case DLL_PROCESS_DETACH:
                        OutputDebugString(L"GIO_DRIVER - DLL_PROCESS_DETACH\n");
                        break;
                case DLL_THREAD_ATTACH:
                        OutputDebugString(L"GIO_DRIVER - DLL_THREAD_ATTACH\n");
                        break;
                case DLL_THREAD_DETACH:
                        OutputDebugString(L"GIO_DRIVER - DLL_THREAD_DETACH\n");
                        break;
                default:
                        break;
        }
        return TRUE;
}
DWORD        GIO_Init(LPCTSTR pContext, LPCVOID lpvBusContext)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_Init - Context:\n");
        OutputDebugString(pContext);
        OutputDebugString(L"\n");
        return 0x1234;
}
BOOL GIO_Deinit(DWORD hDeviceContext)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_DeInit:\n");
        return true;
}
DWORD        GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_Open - Context:\n");
        OutputDebugString(L"hDeviceContext:\n");
        DBGOut(hDeviceContext);
        OutputDebugString(L"\n");
        return 0x5678;
}
BOOL  GIO_Close(DWORD hOpenContext)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_Close - Context:\n");
        OutputDebugString(L"hOpenContext:\n");
        DBGOut(hOpenContext);
        OutputDebugString(L"\n");
        return true;
}
BOOL        GIO_IOControl(DWORD hOpenContext, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn,
                                                                                                  PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_IOControl:\n");
        OutputDebugString(L"hOpenContext:\n");
        DBGOut(hOpenContext);
        OutputDebugString(L"\n");
        return true;
}
void GIO_PowerUp(DWORD hDeviceContext)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_PowerUp\n");
        OutputDebugString(L"hDeviceContext:\n");
        DBGOut(hDeviceContext);
        OutputDebugString(L"\n");       
}
void GIO_PowerDown(DWORD hDeviceContext)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_PowerDown\n");
        OutputDebugString(L"hDeviceContext:\n");
        DBGOut(hDeviceContext);
        OutputDebugString(L"\n");       
}

DWORD  GIO_Read(DWORD hOpenContext, PUCHAR pBuffer, ULONG Count)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_Read:\n");
        OutputDebugString(L"hOpenContext:\n");
        DBGOut(hOpenContext);
        OutputDebugString(L"\n");
        return 0;
}
DWORD  GIO_Write(DWORD hOpenContext, PUCHAR pBuffer, ULONG Count)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_Write\n");
        OutputDebugString(L"hOpenContext:\n");
        DBGOut(hOpenContext);
        OutputDebugString(L"\n");
        return 0;
}
DWORD  GIO_Seek(DWORD hOpenContext, long Amount, WORD Type)
{
        OutputDebugString(L"GIO_DRIVER ++ GIO_Seek\n");
        OutputDebugString(L"hOpenContext:\n");
        DBGOut(hOpenContext);
        OutputDebugString(L"\n");
        return 0;
}

void DBGOut(DWORD dwValue)
{
        TCHAR tcTemp[10];
        wsprintf(tcTemp,L"%d",dwValue);
        OutputDebugString(tcTemp);
}


用2种方法进行了驱动的加载:

1、在vs2005下创建DLL项目,build之后,用activesync把retail文件夹下的GIO_DRV.dll复制到开发板上,
然后用DM2.9加载这个dll,写入注册表后,始终无法激活,提示Error ID:1

2、在vs2005下在内核工程下建立了DLL子工程,build之后,用activesync把retail文件夹下的GIO_DRV.dll复制到开发板上,
然后用DM2.9加载这个dll,写入注册表后,始终无法激活,提示Error ID:1


以上2种方法,串口输出均为  
GIO_DRIVER - DLL_PROCESS_ATTACH
GIO_DRIVER - DLL_PROCESS_DETACH

请教各位,我哪里出了问题?(另外 我用WINCE教程里自带的驱动程序范例进行试验,也是这种现象)


















最新回复

代码如下 *********************GIO_DRV.h************************************* #include "stdafx.h" #include __declspec(dllexport) extern DWORD        GIO_Init1(LPCTSTR pContext, LPCVOID lpvBusContext); 楼主不是没有写def文件的原因吧,估计是GIO_Init1多写了一个1的缘故吧。 __declspec(dllexport)这个不就表明该函数为导出函数吗? 哪里还需要再写def文件呢?  详情 回复 发表于 2010-2-25 21:02
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
1. 注册表中flags的配置是多少?
2. 驱动放到windows下再重新尝试一下
3. Error ID 1意思是ERROR_INVALID_FUNCTION
用dumpbin工具查一下驱动的导出函数,方法是到pb或者vs的release目录下dumpbin /exports {驱动名}看一下导出函数是不是有***_Init
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
[url=http://download.eeworld.net/source/1985540][/url]
下载这个代码看看,如果也一样不行,就很有可能是系统的问题。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
NARK吗,学习下、
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
头文件中的函数声明如下,
extern "C" __declspec(dllexport) DWORD GIO_Init(LPCTSTR pContext, LPCVOID lpvBusContext);
注意函数名的大小写,一个字母都不能差!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
LZ是不是没有定义def文件
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 sunrain_hjb 的回复:
头文件中的函数声明如下,
extern "C" __declspec(dllexport) DWORD GIO_Init(LPCTSTR pContext, LPCVOID lpvBusContext);
注意函数名的大小写,一个字母都不能差!

这点确实也应该要看看,致敬
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

8
 
http://www.cnblogs.com/we-hjb/archive/2009/05/17/1458725.html
还是推荐这篇文章。
LZ可以学习一下高手的调试方法
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
DM的使用很考验一个人的经验的。呵呵,所以有时候要多做准备,很多问题的,尤其涉及中断的驱动。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

10
 
又看了一遍LZ的流驱动,怎么看的这么复杂。。。汗


  1. __declspec(dllexport) extern DWORD GIO_Init1(LPCTSTR pContext, LPCVOID lpvBusContext);
  2. __declspec(dllexport) extern BOOL GIO_Deinit(DWORD hDeviceContext);
  3. __declspec(dllexport) extern DWORD GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode);
  4. __declspec(dllexport) extern BOOL GIO_Close(DWORD hOpenContext);
  5. __declspec(dllexport) extern BOOL GIO_IOControl(DWORD hOpenContext, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn,
  6.   PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut);
  7. __declspec(dllexport) extern void GIO_PowerUp(DWORD hDeviceContext);
  8. __declspec(dllexport) extern void GIO_PowerDown(DWORD hDeviceContext);
  9. __declspec(dllexport) extern DWORD  GIO_Read(DWORD hOpenContext, PUCHAR pBuffer, ULONG Count);
  10. __declspec(dllexport) extern DWORD  GIO_Write(DWORD hOpenContext, PUCHAR pBuffer, ULONG Count);
  11. __declspec(dllexport) extern DWORD  GIO_Seek1(DWORD hOpenContext, long Amount, WORD Type);
复制代码

这些个人感觉没必要在说一次把。。你头文件里面有说了就可以了
另外。。。bib/reg这两个文件的都要修改的。
然后你查看下你的PB下到命令行状态,然后notepad一下你的regini.ini文件看看有没有写到注册表
如果用DM还没有出来就回头用原始的方法实验一次。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 1 楼 guopeixin 的回复:
1. 注册表中flags的配置是多少?
2. 驱动放到windows下再重新尝试一下
3. Error ID 1意思是ERROR_INVALID_FUNCTION
用dumpbin工具查一下驱动的导出函数,方法是到pb或者vs的release目录下dumpbin /exports {驱动名}看一下导出函数是不是有***_Init


请问注册表中flags的配置在哪里可以看到?   
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 
真的是感动啊,谢谢大家,只有eeworld里才有这么多热心人!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 1 楼 guopeixin 的回复:
1. 注册表中flags的配置是多少?
2. 驱动放到windows下再重新尝试一下
3. Error ID 1意思是ERROR_INVALID_FUNCTION
用dumpbin工具查一下驱动的导出函数,方法是到pb或者vs的release目录下dumpbin /exports {驱动名}看一下导出函数是不是有***_Init


我查了一下Init没有导出,是我拼写错误,改正之后,用dumpbin查看如下

Dump of file c:\gio_drv.dll

File Type: DLL

  Section contains the following exports for GIO_DRV.dll

    00000000 characteristics
    4B4BDBBC time date stamp Tue Jan 12 10:17:32 2010
        0.00 version
           1 ordinal base
          10 number of functions
          10 number of names

    ordinal hint RVA      name

          1    0 0000156C ?GIO_Close@@YAHK@Z
          2    1 000014BC ?GIO_Deinit@@YAHK@Z
          3    2 000015AC ?GIO_IOControl@@YAHKKPAEK0KPAK@Z
          4    3 00001484 ?GIO_Init@@YAKPBGPBX@Z
          5    4 00001528 ?GIO_Open@@YAKKKK@Z
          6    5 00001628 ?GIO_PowerDown@@YAXK@Z
          7    6 000015EC ?GIO_PowerUp@@YAXK@Z
          8    7 00001664 ?GIO_Read@@YAKKPAEK@Z
          9    8 000016E4 ?GIO_Seek@@YAKKJG@Z
         10    9 000016A4 ?GIO_Write@@YAKKPAEK@Z

  Summary

        1000 .data
        1000 .pdata
        1000 .reloc
        1000 .text

Init已经出来了,可是在DM里还是无法激活dll,还有哪里不对呢?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 squwal 的回复:
引用 1 楼 guopeixin 的回复:
1. 注册表中flags的配置是多少?
2. 驱动放到windows下再重新尝试一下
3. Error ID 1意思是ERROR_INVALID_FUNCTION
用dumpbin工具查一下驱动的导出函数,方法是到pb或者vs的release目录下dumpbin /exports {驱动名}看一下导出函数是不是有***_Init


我查了一下Init没有导出,是我拼写错误,改正之后,用dumpbin查看如下

Dump of file c:\gio_drv.dll

File Type: DLL

? Section contains the following exports for GIO_DRV.dll

? ? 00000000 characteristics
? ? 4B4BDBBC time date stamp Tue Jan 12 10:17:32 2010
? ? ? ? 0.00 version
? ? ? ? ?  1 ordinal base
? ? ? ? ? 10 number of functions
? ? ? ? ? 10 number of names

? ? ordinal hint RVA? ? ? name

? ? ? ? ? 1? ? 0 0000156C ?GIO_Close@@YAHK@Z
? ? ? ? ? 2? ? 1 000014BC ?GIO_Deinit@@YAHK@Z
? ? ? ? ? 3? ? 2 000015AC ?GIO_IOControl@@YAHKKPAEK0KPAK@Z
? ? ? ? ? 4? ? 3 00001484 ?GIO_Init@@YAKPBGPBX@Z
? ? ? ? ? 5? ? 4 00001528 ?GIO_Open@@YAKKKK@Z
? ? ? ? ? 6? ? 5 00001628 ?GIO_PowerDown@@YAXK@Z
? ? ? ? ? 7? ? 6 000015EC ?GIO_PowerUp@@YAXK@Z
? ? ? ? ? 8? ? 7 00001664 ?GIO_Read@@YAKKPAEK@Z
? ? ? ? ? 9? ? 8 000016E4 ?GIO_Seek@@YAKKJG@Z
? ? ? ?  10? ? 9 000016A4 ?GIO_Write@@YAKKPAEK@Z

? Summary

? ? ? ? 1000 .data
? ? ? ? 1000 .pdata
? ? ? ? 1000 .reloc
? ? ? ? 1000 .text

Init已经出来了,可是在DM里还是无法激活dll,还有哪里不对呢?


检查注册表
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

15
 
问题已经查清, 由于def文件没有写,结贴!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

16
 
代码如下
*********************GIO_DRV.h*************************************
#include "stdafx.h"
#include


__declspec(dllexport) extern DWORD        GIO_Init1(LPCTSTR pContext, LPCVOID lpvBusContext);

楼主不是没有写def文件的原因吧,估计是GIO_Init1多写了一个1的缘故吧。
__declspec(dllexport)这个不就表明该函数为导出函数吗?
哪里还需要再写def文件呢?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表