| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 769 人关注过本帖
标题:【求助】打开设备总是失败
只看楼主 加入收藏
gpp6025
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2010-7-8
结帖率:84.62%
收藏
已结贴  问题点数:20 回复次数:3 
【求助】打开设备总是失败
CreateFile执行总是失败!~各位路过的大大们帮忙看看吧~~小弟不胜感激~~
#include "stdafx.h"
#include <string.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE devicehdle;
    void* dlinkname=malloc(sizeof(LPCTSTR));
    memcpy(dlinkname,"\\\\.\\A_safe",13);
    devicehdle=CreateFile((LPCTSTR)dlinkname,
        GENERIC_READ|GENERIC_WRITE,0,0,
        OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);
    if(devicehdle==INVALID_HANDLE_VALUE)
    {
        printf("the device open fail!!");
    }else{
        printf("the device open ok !!");
    }
    CloseHandle(devicehdle);
    return 0;
}
生成的设备和符号链接名都没有问题,~就是上面的代码有问题~~
那应该就是    void* dlinkname=malloc(sizeof(LPCTSTR));
    memcpy(dlinkname,"\\\\.\\A_safe",13);这两句的问题了~CreateFile函数要求的(LPCTSTR)类型要怎么写啊?

[ 本帖最后由 gpp6025 于 2011-5-10 22:07 编辑 ]
搜索更多相关主题的帖子: 不胜感激 
2011-05-10 17:52
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:20 
1:   \\\\.\\A_safe 看起来是13个,当你忘记了字符串还有一个结束符,被转义后,实际长度为11,你可以使用C++标准库里的std::string来得到字符长度
#include <string>
...
 std::string strFileName = "\\\\.\\A_safe";
 int iSize = strFileName.length();
void* dlinkname=malloc(iSize+1);
memcpy(dlinkname,strFileName.c_str() ,iSize+1);

不过我会用 char* dlinkname = new char[iSize+1];

话说回来,字符串已经放到strFileName里了,没必要再拷到dlinkname里,这样不用使用指针,CreateFile函数里直接使用strFileName.c_str()就好了。

2:    void* dlinkname=malloc(sizeof(LPCTSTR));LPCTSTR是字符指针,它的sizeof为4(32位机上),也就是说你只分配了四个字符的长度,如何去装下11个字符长度的东西呢,这必然内存溢出,虽然在本例中这样少的代码,内存溢出点没太大问题,但必尽习惯不好,以后会吃苦头的。所以要 malloc( 11*sizeof(char) );给出足够的空间来放你想要的东西。

3:   CreateFile函数需要的是绝对路径,而不是相对路径,所以你使用相对路径去访问该文件是得不到结果的,使用GetCurrentDirectory函数得到当前本地工作目录路径,然后在后面加上"\\文件名",使用这个字符串去访问文件。
2011-05-11 22:54
gpp6025
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2010-7-8
收藏
得分:0 
回复 2楼 debroa723
我将代码改成下面的,
我是用CreateFile来打开一个设备~,在MSDN上打开Communication Device设备必须设置第五个参数为OPEN_EXISTING和最后一个参数为NULL,
对filename这个参数设备的话是一个符号链接名吧,而且是一个空结尾字符串?
但是通过getlasterror得到错误号是2也就是找不到指定文件,也就是filename有问题吧?我不知道我下面的这个用字符组来写错在了哪~~

#include "stdafx.h"
#include <string.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE devicehdle;
    char dlinkname[11]=“\\\\.\\A_safe”;
    devicehdle=CreateFile((LPCTSTR)dlinkname,
        GENERIC_READ|GENERIC_WRITE,0,0,
        OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM,0);
    if(devicehdle==INVALID_HANDLE_VALUE)
    {
        printf("the device open fail!!");
    }else{
        printf("the device open ok !!");
    }
    CloseHandle(devicehdle);
    return 0;
}
2011-05-12 22:21
gpp6025
Rank: 1
等 级:新手上路
帖 子:57
专家分:0
注 册:2010-7-8
收藏
得分:0 
回复 2楼 debroa723
你说的要绝对路劲是不是要把“\\\\.\\A_safe” 改成"DosDevice\\\\.\\A_safe" 吗??
2011-05-12 22:24
快速回复:【求助】打开设备总是失败
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019780 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved