lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:2126回复:12

关于delphi编写filedisk应用程序----help!

楼主#
更多 发布于:2004-06-04 23:13
openfileinformation中filename=array[0..0] of char,若文件名为e:\\temp\\file0.img,如何把此文件传入openfileinformation.filename呢?

恳请大老指点小弟!给分

被老板逼的,希望大侠同情小弟则个! :o :o :o
p2o5x
驱动牛犊
驱动牛犊
  • 注册日期2004-06-04
  • 最后登录2005-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-05 22:59
openfileinformation中filename=array[0..0] of char,若文件名为e:\temp\file0.img,如何把此文件传入openfileinformation.filename呢?

恳请大老指点小弟!给分

被老板逼的,希望大侠同情小弟则个! :o :o :o


对不起啊,我不知道有没有误导你了
array[0..0]of char 只能有一个字符,要想传入多个字符,那要用动态分配的
我对openfileinformation不熟悉,你试试
type
  chars=array[0..0]of char;

var
  a:^chars;
begin
  Getmem(a,10);这样a^就可放10个字符
end

lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-06 22:10
谢谢楼上的!
  POPEN_FILE_INFORMATION = ^OPEN_FILE_INFORMATION;
  OPEN_FILE_INFORMATION = RECORD
  Read_only : boolean;
  FileSize : int64;
  Filenamelength : word;
  filename : array[0..0] of char;
  end;
以上为结构定义
var pfile:pchar;

  volumename:='\\.\ :';
  volumename[5]:='j';
 device := createfile(pansichar(volumename),GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE
                        , NiL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
 if device<>INVALID_HANDLE_VALUE then
 begin
  MessageDlg('the disk is using!', mtWarning,[mbAbort], 0);
  exit;
 end ;
  devicename :='\device\filedisk\filedisk0';

 if DefineDosDevice(DDD_RAW_TARGET_PATH,@volumename[5],pchar(devicename)) then
 begin
   showmessage('ddddddddddddddddd');
 end;
  device := createfile(pansichar(volumename),GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE
                        , NiL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
 if device = INVALID_HANDLE_VALUE then
 begin
  MessageDlg('somthing is error!', mtWarning,[mbAbort], 0);
  exit;
 end ;

 allocmem(sizeof(OPEN_FILE_INFORMATION) + strlen('e:\temp\444.img') + 4);
 pfile:='\\.\e:\temp\444.img';
 strcopy(openfileinformation.Filename,pfile);

 openfileinformation.Read_only:=false;
 openfileinformation.FileSize:=2*1024*1024;
 openfileinformation.Filenamelength:=strlen(openfileinformation.filename);

 IF  DeviceIoControl(device,IOCTL_FILE_DISK_OPEN_FILE,@openfileinformation,
                sizeof(open_file_information)+openfileinformation.filenamelength-1,
                nil,0,bytesreturned,nil) then

  showmessage('fffffffffffffffff,ok');
// freemem(openFileInformation.filename[0]);
 closehandle(device);
 在执行DeviceIoControl老是出错或不成功,请指教!
lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-06 22:13
怪事,少了'\'了
中间两行:
 allocmem(sizeof(OPEN_FILE_INFORMATION) + strlen('e:\temp\444.img') + 4);
 pfile:='\\.\e:\temp\444.img';
lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-06 22:16
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
p2o5x
驱动牛犊
驱动牛犊
  • 注册日期2004-06-04
  • 最后登录2005-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-07 10:30
怪事,少了''了
中间两行:
 allocmem(sizeof(OPEN_FILE_INFORMATION) + strlen('e:temp444.img') + 4);
 pfile:='\.e:temp444.img';


什么问题?

typedef struct _OPEN_FILE_INFORMATION {
    LARGE_INTEGER   FileSize;
    BOOLEAN         ReadOnly;
    USHORT          FileNameLength;
    UCHAR           FileName[1];
} OPEN_FILE_INFORMATION, *POPEN_FILE_INFORMATION;

中的FileName只定义一个字符的数组,实际上他是存心要
数组超界使用(因为文件名不止一个字符)。
他分配空间的时候,是分配sizeof(open_file_information)+文件名长度-sizeof(UCHAR)

UCHAR FileName[1];对应FileName : Array[0..0]of char;没错。
但是FileName要超界使用delphi中不那么直观。
lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-07 10:43
谢谢!
delphi中该如何处理呢?
lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-07 16:34
delphi中数组也可越界吗?
拜托! :( :( :(
p2o5x
驱动牛犊
驱动牛犊
  • 注册日期2004-06-04
  • 最后登录2005-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-09 08:17
UCHAR FileName[1];对应FileName : Array[0..0]of char;没错。
但是FileName要超界使用delphi中不那么直观。

转成Pchar类型使用,如 PChar(FileName)

如果要将值传入FileName的话,首先内存空间要分配足
strcpy(PChar(FileName),a)

没有delphi调试


[编辑 -  6/9/04 by  p2o5x]
lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-09 15:45
定义filename array[0..0] of char好想不行吧?
应定义指针 pchar ?

能聊一下吗?QQ  50994497
p2o5x
驱动牛犊
驱动牛犊
  • 注册日期2004-06-04
  • 最后登录2005-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-06-10 22:04
定义filename array[0..0] of char好想不行吧?
应定义指针 pchar ?

能聊一下吗?QQ  50994497

我上qq了,给你发了信息加好友,没见回音。

C++中
filename :UCHAR[1];
死板地对到delphi中
就是
filename:array[0..0]of char;
我觉得没错。
但要在里面放一个文件名,要做特殊处理,
比如分配的时候,给filename分配n个字节空间,而在delphi中
实际上filename能访问的只能是头一个字节。
所以符值给filename的时候,要用内存拷贝的方法直接将数据
拷到filename所在内存为起点的n个字节。
同样要读出filename的值时,如果用filename直接读,在delphi中
就只能读头一个字节。因为是以0结尾的字符,所以可以将filename的地址给一个pchar类型的变量,则这个变量就可以读出该字符串。

可能说得不是很清楚,还请斟酌
lhzh114
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2008-12-27
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望37点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-06-17 09:44
多谢!

我终于完成了delphi编写filedisk应用程序! :D :D :D
fanshiyou
驱动牛犊
驱动牛犊
  • 注册日期2004-11-10
  • 最后登录2004-11-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-11-17 14:41
大哥能不能给我一份d版的filedisk啊
我的邮箱是fanshiyou@163.com
游客

返回顶部