4546|5

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

ActivateDeviceEx如何加载指定目录下的dll ? [复制链接]


ActivateDeviceEx加载驱动时是默认的windows\目录下的DLL,这样需要DLL与内核一块打包成NK。 如何加载我应用程序目录下的dll ?这样可以使驱动程序和应用程序一块打包。

最新回复

RegisterDevice也可以,不用写注册表的  详情 回复 发表于 2009-9-11 13:05
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
对,ActivateDeviceEx操作注册表的,配置注册表相应的项就OK了。
"Dll"="\\ResidentFlash\\myDriver.dll"
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
ActivateDeviceEx()是操作注册表的,只要LZ将自己目录下的DLL正常正常即可
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 

  1. HANDLE HandleDriver = INVALID_HANDLE_VALUE;                /* 驱动程序句柄     */
  2. HANDLE hFile = INVALID_HANDLE_VALUE;                        /* 设备文件操作句柄 */
  3. HKEY hDrvKey = NULL;                                                        /* 注册表操作句柄   */

  4. // Simple Driver 注册表信息
  5. WCHAR *szRegKey = L"Drivers\\BuiltIn\\SPL";
  6. WCHAR *szPrefix = L"SPL";
  7. WCHAR *szDLL = L"\\SimpleDriver.dll";
  8. WCHAR *szFriendlyName = L"Simple Driver";
  9. DWORD DrvIndex = 1;
  10. DWORD DrvOrder = 0;

  11. /*
  12. ; Simple Driver 注册表信息
  13. [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPL]
  14.         "Prefix"="SPL"
  15.         "Dll"="\\SimpleDriver.dll"
  16.         "FriendlyName"="Simple Driver"
  17.         "Index"=dword:0
  18.         "Order"=dword:0
  19. */

  20. // 向注册表写入一个字符串
  21. #define WRITE_REG_SZ(Name, Value) RegSetValueEx(hDrvKey, Name, 0, REG_SZ, (LPBYTE)Value, \
  22.                                                                   (wcslen(Value)+1)*sizeof(WCHAR))

  23. // 向注册表写入一个 DWORD 型的值
  24. #define WRITE_REG_DWORD(Name, Value) {DWORD dwValue = Value; RegSetValueEx( hDrvKey, Name, \
  25.                                                                           0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD)); }


  26. // "加载驱动"按键单击事件代码
  27. void CSPLLoaderDlg::OnLoadDriver()
  28. {
  29.         LONG nErr;
  30.         DWORD dwDisp;

  31.         // 创建注册表键HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPL
  32.     nErr = RegCreateKeyEx(HKEY_LOCAL_MACHINE, szRegKey, 0, L"", 0, 0, NULL, &hDrvKey, &dwDisp);
  33.         if (nErr != ERROR_SUCCESS)
  34.         {
  35.                 MessageBox(_T("创建驱动注册表子键失败!"));       
  36.                 return;
  37.         }
  38.         else
  39.         {       
  40.                 // 往注册表添加内容
  41.         WRITE_REG_SZ( L"Prefix", szPrefix);                                                /* 写入 "Prefix"="SPL" */
  42.         WRITE_REG_SZ( L"Dll", szDLL);                                                        /* 写入 "Dll"="\\SimpleDriver.dll" */
  43.         WRITE_REG_SZ( L"FriendlyName", szFriendlyName);                        /* 写入 "FriendlyName"="Simple Driver" */
  44.         WRITE_REG_DWORD( L"Order", DrvOrder);                                        /* 写入 "Index"=dword:0 */
  45.         WRITE_REG_DWORD( L"Index", DrvIndex);                                        /* 写入 "Order"=dword:0 */
  46.         }

  47.         HandleDriver = ActivateDeviceEx(szRegKey, NULL, 0, NULL);        /* 加载 SimpleDriver 驱动 */
  48.         if (HandleDriver == INVALID_HANDLE_VALUE)
  49.                 MessageBox(_T("加载SimpleDriver失败."));
  50.         else
  51.                 MessageBox(_T("加载SimpleDriver成功."));
  52. }


  53. // "卸载驱动"按键单击事件代码
  54. void CSPLLoaderDlg::OnUnloadDriver()
  55. {
  56.         if (HandleDriver != INVALID_HANDLE_VALUE)
  57.         {
  58.                 OnCloseDriver();                                                                                        /* 关闭驱动 */
  59.                 BOOL ret = DeactivateDevice(HandleDriver);                                        /* 卸载 SimpleDriver 驱动 */
  60.                 if (ret == TRUE)
  61.                 {       
  62.                         RegCloseKey(hDrvKey);                                                                        /* 关闭注册表键                  */
  63.                         RegDeleteKey(HKEY_LOCAL_MACHINE, szRegKey);                                /* 删除注册表键的内容 */
  64.                         HandleDriver = INVALID_HANDLE_VALUE;
  65.                         MessageBox(_T("卸载SimpleDriver成功."));
  66.                 }
  67.                 else
  68.                 {
  69.                         MessageBox(_T("卸载SimpleDriver失败."));
  70.                 }
  71.         }
  72. }


  73. // "打开驱动" 按键单击事件代码
  74. void CSPLLoaderDlg::OnOpenDriver()
  75. {
  76.         // 打开 SimpleDriver 驱动
  77.         hFile = CreateFile(TEXT("SPL1:"), GENERIC_READ | GENERIC_WRITE, 0,
  78.                                            NULL, OPEN_EXISTING, 0, 0);
  79.        
  80.         if (hFile == INVALID_HANDLE_VALUE)
  81.                 MessageBox(_T("不能打开 SPL1!"));
  82.         else
  83.                 MessageBox(_T("打开 SPL1 成功!"));       
  84. }


  85. // "关闭驱动" 按键单击事件代码
  86. void CSPLLoaderDlg::OnCloseDriver()
  87. {
  88.         if (hFile != INVALID_HANDLE_VALUE)
  89.         {
  90.                 CloseHandle(hFile);
  91.                 hFile = INVALID_HANDLE_VALUE;
  92.         }
  93. }


  94. // "写入" 按键单击事件代码
  95. void CSPLLoaderDlg::OnWrite()
  96. {
  97.         DWORD tmp, actlen;

  98.         if (hFile == INVALID_HANDLE_VALUE)                                                        /* 检查驱动是否已打开 */
  99.         {
  100.                 MessageBox(_T("SimpleDriver 驱动未打开!"));
  101.                 return;
  102.         }

  103.         UpdateData(TRUE);
  104.         if ((m_WriteByte.GetLength() != 2) ||
  105.                 (_stscanf(m_WriteByte, _T("%x"), &tmp) != 1))                    /* 检查输入参数是否正确 */
  106.         {
  107.                 MessageBox(_T("写入字节必须是1个字节的16进制数!"));
  108.                 return;
  109.         }

  110.         BYTE writebyte = (BYTE)tmp;
  111.         BOOL ret = WriteFile(hFile, &writebyte, 1, &actlen, NULL);        /* 将字节写入驱动 */
  112.         if ((ret == FALSE) || (actlen != 1))
  113.                 MessageBox(_T("写入数据失败!"));
  114.         else
  115.                 MessageBox(_T("写入数据成功!"));       
  116. }


  117. // "读出" 按键单击事件代码
  118. void CSPLLoaderDlg::OnRead()
  119. {
  120.         BYTE recbuff;
  121.         DWORD actlen;

  122.         if (hFile == INVALID_HANDLE_VALUE)                                                        /* 检查驱动是否已打开 */
  123.         {
  124.                 MessageBox(_T("SimpleDriver 驱动未打开!"));
  125.                 return;
  126.         }

  127.         BOOL ret = ReadFile(hFile, &recbuff, 1, &actlen, NULL);                /* 从驱动中读取一个字节 */
  128.         if ((ret == FALSE) || (actlen != 1))
  129.         {
  130.                 MessageBox(_T("读出数据失败!"));
  131.                 return;
  132.         }       
  133.         else
  134.                 MessageBox(_T("读出数据成功!"));       

  135.         CString strTmp;
  136.         strTmp.Format(_T("%x"), recbuff);

  137.         CEdit *pDispEdit = (CEdit*)GetDlgItem(IDC_READ_DISP);                /* 取得控件指针 */
  138.         pDispEdit->SetWindowText(strTmp);                                                        /* 读取内容在窗口显示出来 */
  139. }
复制代码
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
WCHAR *szDLL = L"\\SimpleDriver.dll";
这个改下就行了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
RegisterDevice也可以,不用写注册表的
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表