xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:4461回复:22

请问大侠:怎样把 CreateFile 等封装到 DLL 中

楼主#
更多 发布于:2003-10-14 22:06
我使用 CreateFile 打开设备:

1. 在 MFC 下直接使用一切正常;

2. 在 Win32 控制台程序中直接使用也正常;

3. 在 DLL 中使用时打不开设备(或没有找到),代码同以上环境
   一样的编写,包含的头文件:
         #include <windows.h>
         #include <stdio.h>
         #include <string.h> //处理字符用

HANDLE h = CreateFile( \"\\\\\\\\.\\\\MyDrv1\",
                       GENERIC_READ | GENERIC_WRITE,
                       FILE_SHARE_READ | FILE_SHARE_WRITE,
                       NULL,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,
                       NULL
                      };
第三个参数也用过 0,其它没有变。

今天在驱动网上搜索了所有关于 CreateFile 话题都没有找到类似
的,这个帖子在初学者论坛中我也发过,可没人回答。
friendmjz
驱动牛犊
驱动牛犊
  • 注册日期2001-10-26
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分52分
  • 威望15点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-10-15 08:42
能不能,把你的代码写的完整些
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-15 09:22
还有几句:

动态库入口函数:
BOOL APIENTRY DllMain( HANDLE hModule,
                       ULONG  callType,
                       LPVOID lpReserved
)
{
switch (callType)
{
case DLL_PROCESS_ATTACH://在进程中启动
case DLL_THREAD_ATTACH://在线程中启动
         // Perform any DLL initialization here
//这里打开设备或在外部调用时打开
          break;
case DLL_PROCESS_DETACH://退出
case DLL_THREAD_DETACH:
//这里关闭设备或外部调用关闭
break;
}
    return TRUE;
}

当然,句柄的保存使用过模块全局变量方式也用过函数内部临时
方式。

输出动态库使用过:

1.单一  WINPAI 关键字和 def 文件;

2.extern \"C\" void WINAPI 关键字和 def 文件;

3.单一 extern \"C\" 关键字和 def 文件;

4.用以上方式在应用程序中使用 LoadLibrary 方式;

5.用以上方式在应用程序中加入头文件和 Lib 文件;

6.把 Dll 文件放到 system32 或 winnt 或 应用程序目录都试过;

关闭设备函数:

if (h == INVALID_HANDLE_VALUE)
{
    return;
}//end if

CloseHandle( h );
h = INVALID_HANDLE_VALUE;

问题是无法打开啊!!!!
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-15 20:41
在顶一下! :( :mad:
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2003-10-15 22:29
错误信息是什么都没有说。
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-16 08:41
你单步调试看看设备、句柄、通道打开正确了吗?
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-16 16:17
编译器没有任何错误提示信息;
就是使用 CreateFile 后直接返回,因为我检测到句柄无效。
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-16 17:34
在顶一下!!!
我自己觉得好像是动态库调用 CreateFile 函数需要什么特殊约定
之类问题,或者加一个什么头文件或连接一个库。

这样吧:是不是 MFC 中使用这个函数和 DLL 中方法不一样呢?
它们的区别到底在哪里?

高人指点迷津啊!!!! :(
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-10-16 21:00
GetLastError
 :mad:
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-10-16 22:31
错误号 137 !!!,在 MSDN 中没有找到,DDK 中说是什么 BIOS 键盘
输入输出 :( ,其余的乱码。
顺便提一下:我只在 Win2k 操作,一个简单的通用端口输入输出驱动。
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-10-17 08:43
既然你都检测到句柄无效,继续看creatfile前的程序,看句柄为什么不正确。
xyyln
驱动老牛
驱动老牛
  • 注册日期2003-01-02
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-10-17 10:36
我的DLL里面就可以,不过我没用MFC, :D

bool OpenDevice( LPCTSTR DriverName, HANDLE * lphDevice )
{
    TCHAR    completeDeviceName[64];
    HANDLE   hDevice;

    wsprintf( completeDeviceName, TEXT(\"\\\\\\\\.\\\\%s\"), DriverName );

    hDevice = CreateFile( completeDeviceName,
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL
                          );
    if ( hDevice == ((HANDLE)-1) )
{
printf(\"open device error\\n\");
        return FALSE;
}
if ( lphDevice )
*lphDevice = hDevice;
else
   CloseHandle( hDevice );

    return TRUE;
}
[img]http://www.jt99.com/zjbbs/UploadFile/2003113018513643830.gif[/img]
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-10-17 17:29
多谢 xyyln 大老,我试试看。还不知道怎样给分呢! :D
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-10-17 18:21
痛苦!!!问题依旧! :( :( :( :( :( :(

我的代码就这些,上面 clementzhao 兄让我看前面的代码,那就是一个简单的函数调用。所有代码到 MFC 中是正确的,我也用过从外部打开然后把句柄传入动态库中。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2003-10-17 23:25
137是“系统试图解除未替代驱动器的 SUBST。”



[编辑 -  10/17/03 by  arthurtu]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2003-10-17 23:38
是不是在工程定义了UNICODE?
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-10-18 08:59
如果是你外部传入句柄没问题,应该是dll设置有问题了。#include <setupapi.h>,#include <initguid.h>加了没有?改成extern \"C\" _declspec(dllexport)试试.
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-10-18 10:34
感谢
 clementzhao 的动态库设置提示
 arthurtu  的错误解释,和 UNICODE 提醒思路(在库中我没用)

我再去试试。

有一个过分的要求:希望能教我怎样给分。 :)
xx_focus
驱动中牛
驱动中牛
  • 注册日期2003-08-06
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望10点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-10-18 13:03
再次感谢
clementzhao 和 arthurtu

动态库打开设备问题已经解决:
#include <setupapi.h> //添加
//#include <initguid.h> 不需要

如何给分问题尚在求教中……
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
19楼#
发布于:2003-10-18 14:36
第一贴有个“给分”
上一页
游客

返回顶部