如何将光盘内容制作成.iso文件,大家多加指点! 最好有些代码/谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 easy.ISO文件就是严格对应光盘每个扇区上的每个字节.直接CreateFile方式打开光盘的磁盘设备,然后一个字节一个字节的读出来,写到文件中就可以了. 用这个软件不就得啦1UltraISO 我的意思是在delphi开发的程序里有个功能是“镜像制作”然后将*.iso文件上传到数据库以供调阅,所以说是在delphi 里实现而不是用其他专用iso制作软件 我已经实现了阿.就是一个字节一个字节的读出来,保存到文件就行了.CreateFile方式打开设备,把光盘设备读出来就行了. unit UnitMain;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Gauges;type //回调函数类型 TCallBackProc = procedure(const Pos:Int64) of object; TFormMain = class(TForm) cbCDROM: TComboBox; Label1: TLabel; ggProgress: TGauge; sDlg: TSaveDialog; btnSaveToFile: TButton; procedure btnSaveToFileClick(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } procedure GetCDROMs(List : TStrings); procedure CallBack(const Pos:Int64); public { Public declarations } end;var FormMain: TFormMain;implementation{$R *.dfm}//读取光盘扇区的每个字节到虚拟光盘文件的每个字节procedure CDROMToFile(const hFile, hDriver: THandle; const DriverSize:Int64; const CallbackProc:TCallBackProc; const CallBackoften:Integer = 10);const BufSize = 4096;var hCDROM : THandle; Pos : Int64; Buf : array[0..BufSize-1] of Byte; LastSize: Integer;begin //hCDROM := FileOpen(); LastSize := DriverSize mod BufSize; FileSeek(hFile, 0, FILE_BEGIN); FileSeek(hDriver, 0, FILE_BEGIN); Pos := 0; while Pos <(DriverSize - LastSize) do begin FileRead (hDriver,Buf,BufSize); FileWrite(hFile, Buf,BufSize); Inc(Pos, BufSize); if Pos mod CallBackoften = 0 then callbackProc(Pos); end; FileRead (hDriver,Buf,LastSize); FileWrite(hFile, Buf,LastSize); Inc(Pos, LastSize); callbackProc(Pos);end;//检测光盘是否准备好function CDROMReady(ADriver : String;var Vol:String):Boolean;var i:dword; buf:array[0..MAX_PATH] of char; pd:DWORD;begin pd:=0; ZeroMemory(@buf, MAX_PATH); GetVolumeInformation(PChar(ADriver),buf,i,@pd,i,i,buf,i); Result := pd<>0; Vol := Buf;end;//获取光盘内容的大小function GetCDROMSize(ADriver:String):Int64;var sector,byte,free, total:DWORD;begin GetDiskFreeSpace(PChar(ADriver), sector, byte, free, total); Result := total *sector * byte;end;{ TFormMain }procedure TFormMain.btnSaveToFileClick(Sender: TObject);var hFile, hDriver: THandle; Vol : String; CDROMSize : LARGE_INTEGER;begin if not CDROMReady(cbCDROM.Text + '\', Vol) then begin MessageBox(Self.Handle,'请放入光盘!','',MB_OK or MB_ICONERROR); Exit; end; //ShowMessage(Vol); if Vol<>'' then sDlg.FileName := Vol + '.ISO'; if not sDlg.Execute() then Exit; hFile := FileCreate(sDlg.FileName); if hFile = INVALID_HANDLE_VALUE then begin MessageBox(Self.Handle,'创建虚拟光驱文件出错!','',MB_OK or MB_ICONERROR); Exit; end; hDriver := CreateFile (PChar('\\.\'+cbCDROM.Text), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if hDriver = INVALID_HANDLE_VALUE then begin FileClose(hFile); MessageBox(Self.Handle,'读取光驱出错!','',MB_OK or MB_ICONERROR); Exit; end; //获取光盘占用的大小.并且设置进度条 CDROMSize.QuadPart := GetCDROMSize(cbCDROM.Text); ggProgress.MinValue := 0; ggProgress.MaxValue := CDROMSize.QuadPart-1; ggProgress.Progress := 0; //写到文件 CDROMToFile(hFile, hDriver, CDROMSize.QuadPart, CallBack, 100); FileClose(hDriver); FileClose(hFile); MessageBox(Self.Handle,'虚拟光驱文件制作完成!','恭喜',MB_OK or MB_ICONINFORMATION);end;procedure TFormMain.CallBack(const Pos: Int64);begin ggProgress.Progress := Pos; Application.ProcessMessages;end;procedure TFormMain.FormShow(Sender: TObject);begin GetCDROMs(cbCDROM.Items); if cbCDROM.Items.Count >0 then begin cbCDROM.ItemIndex := 0; end;end;procedure TFormMain.GetCDROMs(List: TStrings);var I : Char; Driver : String;begin for I := 'A' to 'Z' do begin Driver := I+':'; if GetDriveType(PChar(Driver)) = DRIVE_CDROM then begin List.Add(Driver); end; end;end;end. 程序提示遇到问题,需要关闭...... 阿泰来吧 初学delphi,想问问delphi要不要虚拟机之类的东西支持? 最左面出现一个绿色的标记,就是在断点的位置。怎么去掉啊? 关于服务 Delphi有没有与SQL中的dateadd(day,int,date)相似的函数,可以做时间运算? 模糊查询 如何做超链接?? 如何用SQL语句来创建一个表中的id字段是自动编号的??? 怎样在离开StringGrid的Cells时,检查该Cells的输入数据的有效性? 招聘DELPHI和PB程序员 请问:怎样实现这样的功能?
ISO文件就是严格对应光盘每个扇区上的每个字节.
直接CreateFile方式打开光盘的磁盘设备,然后一个字节一个字节的读出来,写到文件中就可以了.
UltraISO
然后将*.iso文件上传到数据库以供调阅,所以说是在delphi 里实现
而不是用其他专用iso制作软件
CreateFile方式打开设备,把光盘设备读出来就行了.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Gauges;type
//回调函数类型
TCallBackProc = procedure(const Pos:Int64) of object; TFormMain = class(TForm)
cbCDROM: TComboBox;
Label1: TLabel;
ggProgress: TGauge;
sDlg: TSaveDialog;
btnSaveToFile: TButton;
procedure btnSaveToFileClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
procedure GetCDROMs(List : TStrings);
procedure CallBack(const Pos:Int64);
public
{ Public declarations }
end;var
FormMain: TFormMain;implementation{$R *.dfm}//读取光盘扇区的每个字节到虚拟光盘文件的每个字节
procedure CDROMToFile(const hFile, hDriver: THandle;
const DriverSize:Int64;
const CallbackProc:TCallBackProc;
const CallBackoften:Integer = 10);
const
BufSize = 4096;
var
hCDROM : THandle;
Pos : Int64;
Buf : array[0..BufSize-1] of Byte;
LastSize: Integer;
begin
//hCDROM := FileOpen();
LastSize := DriverSize mod BufSize;
FileSeek(hFile, 0, FILE_BEGIN);
FileSeek(hDriver, 0, FILE_BEGIN);
Pos := 0;
while Pos <(DriverSize - LastSize) do
begin
FileRead (hDriver,Buf,BufSize);
FileWrite(hFile, Buf,BufSize);
Inc(Pos, BufSize);
if Pos mod CallBackoften = 0 then
callbackProc(Pos);
end;
FileRead (hDriver,Buf,LastSize);
FileWrite(hFile, Buf,LastSize);
Inc(Pos, LastSize);
callbackProc(Pos);
end;//检测光盘是否准备好
function CDROMReady(ADriver : String;var Vol:String):Boolean;
var
i:dword;
buf:array[0..MAX_PATH] of char;
pd:DWORD;
begin
pd:=0;
ZeroMemory(@buf, MAX_PATH);
GetVolumeInformation(PChar(ADriver),buf,i,@pd,i,i,buf,i);
Result := pd<>0;
Vol := Buf;
end;//获取光盘内容的大小
function GetCDROMSize(ADriver:String):Int64;
var
sector,byte,free, total:DWORD;
begin
GetDiskFreeSpace(PChar(ADriver),
sector,
byte,
free,
total);
Result := total *sector * byte;
end;{ TFormMain }procedure TFormMain.btnSaveToFileClick(Sender: TObject);
var
hFile, hDriver: THandle;
Vol : String;
CDROMSize : LARGE_INTEGER;
begin
if not CDROMReady(cbCDROM.Text + '\', Vol) then
begin
MessageBox(Self.Handle,'请放入光盘!','',MB_OK or MB_ICONERROR);
Exit;
end; //ShowMessage(Vol);
if Vol<>'' then
sDlg.FileName := Vol + '.ISO';
if not sDlg.Execute() then
Exit;
hFile := FileCreate(sDlg.FileName);
if hFile = INVALID_HANDLE_VALUE then
begin
MessageBox(Self.Handle,'创建虚拟光驱文件出错!','',MB_OK or MB_ICONERROR);
Exit;
end;
hDriver := CreateFile (PChar('\\.\'+cbCDROM.Text),
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
0,
0);
if hDriver = INVALID_HANDLE_VALUE then
begin
FileClose(hFile);
MessageBox(Self.Handle,'读取光驱出错!','',MB_OK or MB_ICONERROR);
Exit;
end;
//获取光盘占用的大小.并且设置进度条
CDROMSize.QuadPart := GetCDROMSize(cbCDROM.Text);
ggProgress.MinValue := 0;
ggProgress.MaxValue := CDROMSize.QuadPart-1;
ggProgress.Progress := 0;
//写到文件
CDROMToFile(hFile, hDriver, CDROMSize.QuadPart, CallBack, 100);
FileClose(hDriver);
FileClose(hFile);
MessageBox(Self.Handle,'虚拟光驱文件制作完成!','恭喜',MB_OK or MB_ICONINFORMATION);
end;procedure TFormMain.CallBack(const Pos: Int64);
begin
ggProgress.Progress := Pos;
Application.ProcessMessages;
end;procedure TFormMain.FormShow(Sender: TObject);
begin
GetCDROMs(cbCDROM.Items);
if cbCDROM.Items.Count >0 then
begin
cbCDROM.ItemIndex := 0;
end;
end;procedure TFormMain.GetCDROMs(List: TStrings);
var
I : Char;
Driver : String;
begin
for I := 'A' to 'Z' do
begin
Driver := I+':';
if GetDriveType(PChar(Driver)) = DRIVE_CDROM then
begin
List.Add(Driver);
end;
end;
end;end.