Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2008, 14:50   #1
emperio
Новичок
Джуниор
 
Регистрация: 21.04.2008
Сообщений: 1
По умолчанию Надстройка над Си

Хочу сделать в Delphi надстройку над компилятором Тurbo C. В идеале программа должна работать так:
После нажатия кнопки Run запускается программа, написанная на языке Си++ в Memo1 и сохраненная в файле.
После нажатия кнопки Comp программа, написанная на языке Си++ компилируется в exe-файл.
Сообщения Си компилятора об ошибках и т. д. должны отображаться в ListBox3.

Вот код функции RunCaptured:
Код:
function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;
var
  start: TStartupInfo;
  procInfo: TProcessInformation;
  tmpName: string;
  tmp: Windows.THandle;
  tmpSec: TSecurityAttributes;
  res: TStringList;
  return: Cardinal;
begin
  Result := False;
  try
    { Setze ein Temporares File }
    { Set a temporary file }
    tmpName := 'Test.tmp';
    FillChar(tmpSec, SizeOf(tmpSec), #0);
    tmpSec.nLength := SizeOf(tmpSec);
    tmpSec.bInheritHandle := True;
    tmp := Windows.CreateFile(PChar(tmpName),
           Generic_Write, File_Share_Write,
           @tmpSec, Create_Always, File_Attribute_Normal, 0);
    try
      FillChar(start, SizeOf(start), #0);
      start.cb          := SizeOf(start);
      start.hStdOutput  := tmp;
      start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;
      start.wShowWindow := SW_Minimize;
      { Starte das Programm }
      { Start the program }
      if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,
                       0, nil, PChar(_dirName), start, procInfo) then
      begin
        SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
        WaitForSingleObject(procInfo.hProcess, Infinite);
        GetExitCodeProcess(procInfo.hProcess, return);
        Result := (return = 0);
        CloseHandle(procInfo.hThread);
        CloseHandle(procInfo.hProcess);
        Windows.CloseHandle(tmp);
        { Die Ausgaben hinzufugen }
        { Add the output }
        res := TStringList.Create;
        try
          res.LoadFromFile(tmpName);
          ListBox3.Items.AddStrings(res);
        finally
          res.Free;
        end;
        Windows.DeleteFile(PChar(tmpName));
      end
      else
      begin
        Application.MessageBox(PChar(SysErrorMessage(GetLastError())),
          'RunCaptured Error', MB_OK);
      end;
    except
      Windows.CloseHandle(tmp);
      Windows.DeleteFile(PChar(tmpName));
      raise;
    end;
  finally
  end;
end;
Вот код процедуры запуска программы:
Код:
procedure TForm1.RunClick(Sender: TObject);
 var
  FileName:string;
 s:array[0..300] of char;
 o:word;
 i:word;
begin
  if SaveDialog1.FileName<>'' then
    begin
      FileName:=SaveDialog1.FileName;
      memo1.Lines.SaveToFile(FileName);
    end
  else
    FileName:=extractfilepath(Application.ExeName)+'tmp\temp.cpp';

 memo1.Lines.SaveToFile(extractfilepath(Application.ExeName)+'tmp\temp.cpp');
 ListBox3.Clear;

  RunCaptured(tc, 'tc.exe', FileName);


  for i:=0 to 300 do
  s[i]:=FileName[i+1];
  i:=0;
  while s[i]+s[i+1]+s[i+2]+s[i+3]<>'.cpp' do
  begin
    inc(i);
  end;
  o:=i;
  s[o+1]:='e';
  s[o+2]:='x';
  s[o+3]:='e';
  ShellExecute(Handle, 'open', s, nil, nil, SW_SHOWNORMAL);
end;
После её выполнения появляется сообщение об ошибке RunCaptured Error, затем запускается компилятор Си с текстом программы без её выполнения.


Это процедура компиляции программы:
Код:
procedure TForm1.CompClick(Sender: TObject);
var
  FileName:string;
begin
  Memo1.Lines.SaveToFile(extractfilepath(Application.ExeName)+'tmp\temp.cpp');
    if SaveDialog1.FileName<>'' then
    begin
      FileName:=SaveDialog1.FileName;
      Memo1.Lines.SaveToFile(FileName);
    end
  else
    FileName:=extractfilepath(Application.ExeName)+'tmp\temp.cpp';
  ListBox3.Clear;

  RunCaptured(tc, 'tc.exe', FileName); 
end;
После её выполнения появляется сообщение об ошибке RunCaptured Error.

Переменная tc задается с помощью InputBox и хранится в ini-файлах. Так что не так с кодом? Жду ответа.

Последний раз редактировалось rpy3uH; 23.04.2008 в 19:11.
emperio вне форума Ответить с цитированием
Старый 24.04.2008, 21:39   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

А разве tx.exe? Вроде компилятор - это tcc.exe.
Somebody вне форума Ответить с цитированием
Старый 26.04.2008, 12:58   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Так для общего просвещения:
я бы изменил
Код:
while s[i]+s[i+1]+s[i+2]+s[i+3]<>'.cpp' do
на
Код:
while LowerCase(Copy(s, i, 4)) <> '.cpp' do
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Надстройка PLEX для Microsoft Excel PLEX for free Microsoft Office Excel 0 28.05.2008 17:19