好久没用过win98了,大家来帮我看看98下CreateFile怎么回事

captainwh 2003-12-09 05:25:56
win2000中写的代码:
HANDLE hFile = CreateFile(szDestFileName, FILE_WRITE_DATA, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}

DWORD dwBytesToWrite, dwBytesWrited;
dwBytesToWrite = SizeofResource(NULL, hRes);
if (WriteFile(hFile, pData, dwBytesToWrite, &dwBytesWrited,
NULL) == 0)
{
return FALSE;
}
CloseHandle(hFile);

在98下调试发现CreateFile失败, 返回错误信息是参数错误(没看出哪里有不对)

最后实在是不行,换成c io函数,搞定了:
FILE *f = fopen(szDestFileName, "wb");
if (f == NULL)
{
return FALSE;
}

DWORD dwBytesToWrite = SizeofResource(NULL, hRes);
fwrite(pData, 1, dwBytesToWrite, f);
fclose(f);

哪位帮我看看是什么毛病呢
...全文
33 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
captainwh 2003-12-24
  • 打赏
  • 举报
回复
to topwork(日光):
我想我没有中伤哪个人的意思吧,倒是有人号称拣到我的眼球两只。
不错,这个的确不是CreateFile的标准用法,我并不是说大家都应该这样用CreateFile。我前面说的很清楚了,一次偶然的笔误发现这样在2000下也可以用,正是因为这用法不寻常,所以我提出来大家讨论一下。可是总有人回帖怀疑我的智商?!!

你说"站在巨人的肩旁上可以看的远些"我没看出和这个问题有什么关系。

runner111(runner111)和chehw(chehw)回答的比较清楚了,这应该只是2000中的一种特殊用法,并不通用,也不推荐使用这种参数。
chehw 2003-12-23
  • 打赏
  • 举报
回复
to captainwh(wh) :

1、你所说的上述宏不能用于CreateFile中第二个参数。
2、这是设置安全属性(SECURITY_ATTRIBUTES)时需用到的参数。2000或NT下有时会用(也可使用默认的安全属性)。
3、98下不能设置文件的安全属性。

建议仔细阅读MSDN的有关说明。
Runner111 2003-12-23
  • 打赏
  • 举报
回复
第二位只能用GENERIC_READ和GENERIC_WRITE或者0 其它的98不支持,这问题过去我也遇到过。
topwork 2003-12-23
  • 打赏
  • 举报
回复
首先,请你不要中伤回帖的任何人,大家都是在帮助你,而且这些人我都认识,如果你中伤了他们就等于中伤了我;其次,对于你CreateFile的这种用法我确实没有见过,请不要犯了太时髦的错误,我看的是2000年10月的MSDN,至少编写的程序还可以在98上面跑,即使你看最新版本的MSDN也要分清楚2k系统和9x系统的不同使用方法;
其次,关于您的这个帖子,我以后不想再讨论了,没有任何意义,记住一句话——“站在巨人的肩旁上可以看的远些”;
captainwh 2003-12-23
  • 打赏
  • 举报
回复
我不知道你们用的多少版msdn,我的platform sdk(Windows Server 2003 Family)关于
CreateFile的访问控制是这样描述的:

The valid access rights for files and directories include the DELETE, READ_CONTROL, WRITE_DAC, and WRITE_OWNER standard. The following table lists the access rights that are specific to files and directories.

Access right Description
FILE_ADD_FILE For a directory, the right to create a file in the
directory.
FILE_ADD_SUBDIRECTORY For a directory, the right to create a subdirectory.
FILE_ALL_ACCESS All possible access rights for a file.
FILE_APPEND_DATA For a file object, the right to append data to the file.
For a directory object, the right to create a
subdirectory.
FILE_CREATE_PIPE_INSTANCE For a named pipe, the right to create a pipe.
FILE_DELETE_CHILD For a directory, the right to delete a directory and
all the files it contains, including read-only files.
FILE_EXECUTE For a native code file, the right to execute the
file. This access right given to scripts may cause
the script to be executable, depending on the script
interpreter.
FILE_LIST_DIRECTORY For a directory, the right to list the contents of
the directory.
FILE_READ_ATTRIBUTES The right to read file attributes.
FILE_READ_DATA For a file object, the right to read the
corresponding file data. For a directory object, the
right to read the corresponding directory data.
FILE_READ_EA The right to read extended file attributes.
FILE_TRAVERSE For a directory, the right to traverse the directory.
By default, users are assigned the BYPASS_TRAVERSE_CHECKING privilege, which ignores the FILE_TRAVERSE access
right. See the remarks later in this section for more
information.
FILE_WRITE_ATTRIBUTES The right to write file attributes.
FILE_WRITE_DATA For a file object, the right to write data to the
file. For a directory object, the right to create a
file in the directory.
FILE_WRITE_EA The right to write extended file attributes.
STANDARD_RIGHTS_READ Includes READ_CONTROL, which is the right to read the
information in the file or directory object's
security descriptor. This does not include the
information in the SACL.
STANDARD_RIGHTS_WRITE Includes WRITE_CONTROL, which is the right to write
to the directory object's security descriptor. This
does not include the information in the SACL.
SYNCHRONIZE The right to specify a file handle in one of the wait
functions. However, for asynchronous file I/O
operations, you should wait on the event handle in an
OVERLAPPED structure rather than using the file
handle for synchronization.

The following are the generic access rights for files and directories.

Access right Description
GENERIC_EXECUTE FILE_READ_ATTRIBUTES
STANDARD_RIGHTS_EXECUTE
SYNCHRONIZE
GENERIC_READ FILE_READ_ATTRIBUTES
FILE_READ_DATA
FILE_READ_EA
STANDARD_RIGHTS_READ
SYNCHRONIZE
GENERIC_WRITE FILE_APPEND_DATA
FILE_WRITE_ATTRIBUTES
FILE_WRITE_DATA
FILE_WRITE_EA
STANDARD_RIGHTS_WRITE
SYNCHRONIZE

也就是说:
GENERIC_WRITE == FILE_APPEND_DATA |
FILE_WRITE_ATTRIBUTES |
FILE_WRITE_DATA |
FILE_WRITE_EA |
STANDARD_RIGHTS_WRITE |
SYNCHRONIZE

访问控制只使用一个FILE_WRITE_DATA这种用法我也只在windows 2000中使用成功过,没有任何问题。
其实这个问题我也是偶然发现的,有天写程序也没看清楚直接从帮助文档里拷来的参数,在2000下用的好好的,后来弄到98里就不能用了,当时很奇怪,一检查才发现参数写成了FILE_WRITE_DATA而不是通常用的GENERIC_WRITE。
但这个的确可以在win2000中正确运行,正是因为觉得奇怪,才来这里请教各位。希望大家都试一试。

至于ISteven(ISteven)这种人我不想多说, 一口否认事实不是讨论问题的态度吧(还带人身攻击,我鄙视) 感谢 topwork(日光) 的讨论。
至于Hyrut(Hyrut)说我不懂c++,呵呵可笑,CreateFile的一个参数问题关c++什么事了。
ISteven 2003-12-12
  • 打赏
  • 举报
回复
楼主,请找到眼睛后仔细看看MSND吧,CreateFile哪有FILE_WRITE_DATA这种东西。请自己先把问题搞清楚再提问,不要浪费大家的时间。

ps:捡到楼主眼球两个,速来认领
topwork 2003-12-11
  • 打赏
  • 举报
回复
还有一件事情忘记说了,在2K下面第二个参数就是填0,CreateFile也会成功,只不过不能写数据罢了;
Hyrut 2003-12-11
  • 打赏
  • 举报
回复
...
topwork还真有闲心。
你也不看看搂主的信誉。
这种人的帖子也回。
哦~~~!
泡坛子去了~~~!
topwork 2003-12-11
  • 打赏
  • 举报
回复
遵照楼主的指示,我精心查询了MSDN,发现您说的这个宏确实存在,这个宏在一些DDK函数中倒是用到,例如:IoCreateFile;ZwCreateFile;IoGetDeviceObjectPointer;但是CreateFile中绝对没有这个宏,第二个参数能够用到的宏我在上边说了,有十几个吧,我绝对没说只有三个;也许是我的MSDN太老了,您自己看看吧;
Hyrut 2003-12-11
  • 打赏
  • 举报
回复
楼上的不懂C++。
Topwork你就不要跟这种人着急了。
captainwh 2003-12-11
  • 打赏
  • 举报
回复
To topwork(日光):
拜托好好看看msdn关于CraeteFile的介绍好吗?
access rights that are specific to files and directories:
FILE_ADD_FILE
FILE_ADD_SUBDIRECTORY
FILE_ALL_ACCESS
FILE_APPEND_DATA
...
FILE_WRITE_DATA
...

generic access rights for files and directories:
GENERIC_EXECUTE
GENERIC_READ
GENERIC_WRITE


HANDLE hFile = CreateFile(szDestFileName, FILE_WRITE_DATA, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
在windows2000中我就是这么用的, 效果和
HANDLE hFile = CreateFile(szDestFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
一样, 但98中不行。
topwork 2003-12-09
  • 打赏
  • 举报
回复
第二个参数FILE_WRITE_DATA是什么东东?哪里定义的宏?
这里只能填写如下内容:
0
GENERIC_READ
GENERIC_WRITE


DELETE
READ_CONTROL
WRITE_DAC
WRITE_OWNER
SYNCHRONIZE
STANDARD_RIGHTS_REQUIRED
STANDARD_RIGHTS_READ
STANDARD_RIGHTS_WRITE
STANDARD_RIGHTS_EXECUTE
STANDARD_RIGHTS_ALL
SPECIFIC_RIGHTS_ALL
ACCESS_SYSTEM_SECURITY
MAXIMUM_ALLOWED
GENERIC_READ
GENERIC_WRITE
GENERIC_EXECUTE
GENERIC_ALL

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧