阅读:4459回复:22
请问大侠:怎样把 CreateFile 等封装到 DLL 中
我使用 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 话题都没有找到类似 的,这个帖子在初学者论坛中我也发过,可没人回答。 |
|
沙发#
发布于:2003-10-15 08:42
能不能,把你的代码写的完整些
|
|
板凳#
发布于: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; 问题是无法打开啊!!!! |
|
地板#
发布于:2003-10-15 20:41
在顶一下! :( :mad:
|
|
地下室#
发布于:2003-10-15 22:29
错误信息是什么都没有说。
|
|
5楼#
发布于:2003-10-16 08:41
你单步调试看看设备、句柄、通道打开正确了吗?
|
|
6楼#
发布于:2003-10-16 16:17
编译器没有任何错误提示信息;
就是使用 CreateFile 后直接返回,因为我检测到句柄无效。 |
|
7楼#
发布于:2003-10-16 17:34
在顶一下!!!
我自己觉得好像是动态库调用 CreateFile 函数需要什么特殊约定 之类问题,或者加一个什么头文件或连接一个库。 这样吧:是不是 MFC 中使用这个函数和 DLL 中方法不一样呢? 它们的区别到底在哪里? 高人指点迷津啊!!!! :( |
|
8楼#
发布于:2003-10-16 21:00
GetLastError
:mad: |
|
9楼#
发布于:2003-10-16 22:31
错误号 137 !!!,在 MSDN 中没有找到,DDK 中说是什么 BIOS 键盘
输入输出 :( ,其余的乱码。 顺便提一下:我只在 Win2k 操作,一个简单的通用端口输入输出驱动。 |
|
10楼#
发布于:2003-10-17 08:43
既然你都检测到句柄无效,继续看creatfile前的程序,看句柄为什么不正确。
|
|
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; } |
|
|
12楼#
发布于:2003-10-17 17:29
多谢 xyyln 大老,我试试看。还不知道怎样给分呢! :D
|
|
13楼#
发布于:2003-10-17 18:21
痛苦!!!问题依旧! :( :( :( :( :( :(
我的代码就这些,上面 clementzhao 兄让我看前面的代码,那就是一个简单的函数调用。所有代码到 MFC 中是正确的,我也用过从外部打开然后把句柄传入动态库中。 |
|
14楼#
发布于:2003-10-17 23:25
137是“系统试图解除未替代驱动器的 SUBST。”
[编辑 - 10/17/03 by arthurtu] |
|
15楼#
发布于:2003-10-17 23:38
是不是在工程定义了UNICODE?
|
|
16楼#
发布于:2003-10-18 08:59
如果是你外部传入句柄没问题,应该是dll设置有问题了。#include <setupapi.h>,#include <initguid.h>加了没有?改成extern \"C\" _declspec(dllexport)试试.
|
|
17楼#
发布于:2003-10-18 10:34
感谢
clementzhao 的动态库设置提示 arthurtu 的错误解释,和 UNICODE 提醒思路(在库中我没用) 我再去试试。 有一个过分的要求:希望能教我怎样给分。 :) |
|
18楼#
发布于:2003-10-18 13:03
再次感谢
clementzhao 和 arthurtu 动态库打开设备问题已经解决: #include <setupapi.h> //添加 //#include <initguid.h> 不需要 如何给分问题尚在求教中…… |
|
19楼#
发布于:2003-10-18 14:36
第一贴有个“给分”
|
|
上一页
下一页