C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите перевести прогу с Delfi на Си, Помогите перевести прогу с Delfi на Си
-av-
Отправлено: 20.02.2005, 20:09


Ученик-кочегар

Группа: Участник
Сообщений: 3



type Info = record //Объявляем запись с информацией о файлах
File1Size : Int64; //Размер первого файла
File2Size : Int64; //Размер второго файла
File1ext : string[6]; //Расширение первого файла
File2ext : string[6]; //Расширение второго файла
end;

var Infos : Info;

//Этот код открывает первый файл
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then Edit1.Text:=OpenDialog1.FileName;
end;

//Этот код открывает второй файл
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute then Edit2.Text:=OpenDialog1.FileName;
end;

//По нажатию этой кнопки мы будем выходить из программы smile.gif
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;

//Сдесь будет находиться весь основной код, который
//осуществляет склеивание файлов
procedure TForm1.Button4Click(Sender: TObject);
var
F1, //Первый файл
F2, //Второй файл
F4, //Загрузчик
F5, //Результат
F6 : TFileStream; //Файл с инфой
F3 : File of Info;
begin
//Если файлы не заданы, то выйти из процедуры
if Edit1.text='' then Exit;
if Edit2.text='' then Exit;
//Открываем склеиваемые файлы
F1:=TFileStream.Сreate(Edit1.Text,fmOpenRead);
F2:=TFileStream.Сreate(Edit2.Text,fmOpenRead);
//Открываем загрузчик
F4:=TFileStream.Сreate(ExtractFilePath(Application.ExeName)+'Loader.exe',fmOpenRead);
//Создаем результирующий файл
F5:=TFileStream.Сreate(ExtractFilePath(Application.ExeName)+'result.exe',fmOpenWrite or fmCreate);
//Заносим в запись инфу о наших файлах
Infos.File1Size:=F1.Size;
Infos.File2Size:=F2.Size;
Infos.File1Ext:=ExtractFileExt(Edit1.Text);
Infos.File2Ext:=ExtractFileExt(Edit2.Text);
//Заносим в запись инфу о наших файлах
AssignFile(F3,ExtractFilePath(Application.ExeName)+'info.dat');
Rewrite(F3);
Write(F3, Infos);
CloseFile(F3);
//Открываем этот файл
F6:=TFileStream.create(ExtractFilePath(Application.ExeName)+'info.dat', fmOpenRead);
//Копируем в исходный файл загрузчик
F5.CopyFrom(F4,F4.Size);
//Копируем iервый файл
F5.CopyFrom(F1,F1.Size);
//Копируем второй файл
F5.CopyFrom(F2,F2.Size);
//Копируем файл с информацией
F5.CopyFrom(F6,F6.Size);
//Закрываем все открытые файлы
F1.Free;
F2.Free;
F4.Free;
F5.Free;
F6.Free;
//Удаляем файл с информациией, т.к. он нам больше ненужен
DeleteFile(PChar(ExtractFilePath(Application.ExeName)+'Info.dat'));
end;
Это весь код! Правда несложно! Если же ты че-то непонял смотри коментарии и исходник. Теперь нам нужно сделать Загрузчик который будет извлекать и запускать склеенные файлы. Принцим его работы также прост: сначала он переписывает себя во временный каталог. Потом мы извлекаем из конца файла инфу. Потом читаем размеры файлов из заголовка. Переходим в позицию после Загрузчика и читаем первый файл длиной, которая записана в заголовке, и сохраняем его на диск, потом переходим в позицию длина Загрузчика+длина первого файла и читаем оотуда второй файл, который также сохраняем на диск. Остается просто запустить эти файлы, предварительно удалив ненужный мусор, который мы создали wink.gif Вот код Загрузчика:

program Loader;

uses Windows, Classes, SysUtils, ShellAPI;

type
dm = record
File1Size : Int64;
File2Size : Int64;
File1Ext : String[6];
File2Ext : String[6];
end;

{$R *.res}

const
LoaderSize = 53248; //размер упаковщика (После компиляции проверь и измени!!!)
HeaderSize = 32; //размер заголовка

var
F1, //Первый файл
F2, //Второй файл
F3, //Заголовочный файл
F4 : TFileStream; //Главный файл
d : Dm;
f : file of dm;

//---------- Вырезано из Avl ----------//
function TempDir:String;
var
Buf:array[0..MAX_PATH] of Char;
begin
GetTempPath(MAX_PATH+1, @buf);
Result := buf;
end;
//---------- Вырезано из Avl ----------//

begin
//Копируем наш файл в другое место
CopyFile(PChar(ParamStr(0)), PChar(TempDir+'temp.dat'), True);
//Открываем наш файл
F4:=TFileStream.Create(TempDir+'temp.dat',fmOpenRead);
F4.Seek(F4.Size-HeaderSize,0);
//извлекаем заголовочный файл с размерами файлов в нутри нашего файла %)
F3:=TFileStream.Create(TempDir+'Header.dat',fmOpenWrite or fmCreate);
F3.CopyFrom(F4,HeaderSize);
F3.Free;

AssignFile(f,TempDir+'Header.dat');//Открываем файл
reset(f); //заголовка
Read(F,d); //и читаем из него
Closefile(F); //наши данные
F4.Seek(LoaderSize,0); //переходим в позицию после упаковщика
//сохраняем 1-ый файл на диске
F1:=TFileStream.Create(TempDir+'file1'+d.File1Ext,fmOpenWrite or fmCreate);
F1.CopyFrom(F4,d.File1Size);
F1.Free;
//переходим в позицию после упаковщика + размер первого файла
F4.Seek(LoaderSize+d.File1Size,0);
//сохраняем 2-ой файл на диске
F2:=TFileStream.create(TempDir+'file2'+d.File1Ext,fmOpenWrite or fmCreate);
F2.CopyFrom(F4,d.File2Size);
F2.Free;
//Закоываем конечный файл
F4.Free;
//Удаляем мусор
DeleteFile(PChar(TempDir+'temp.dat'));
DeleteFile(PChar(TempDir+'Header.dat'));
//Запускаем файлы
ShellExecute(0,'open',PChar(TempDir+'file1'+d.File1Ext),'','',SW_NORMAL);
ShellExecute(0,'open',PChar(TempDir+'file2'+d.File1Ext),'','',SW_NORMAL);
end.
.piero
  Отправлено: 20.02.2005, 23:00


Дежурный стрелочник

Группа: Участник
Сообщений: 62



Уважаемый -av-, вашу работу за вас здесь делать никто не собирается. В сети есть много учебников по обоим языкам, так что вперёд, к Гуглю))

Зададите конкретный вопрос, возможен будет ответ.
Aptem
Отправлено: 21.02.2005, 04:13


Мастер участка

Группа: Участник
Сообщений: 349



Да здесь и переводить-то нечего, практически один в один как на C++

Вернуться в Вопросы программирования в C++Builder