Консультация № 173617
23.10.2009, 23:15
0.00 руб.
0 4 2
Здравствуйте уважаемые эксперты! Есть такое задание, постараюсь объяснить...

Нужно создать редактор для компилятора MASM (assembler). За меня решать задание не нужно,
просто объясните пожалуйста как это сделать. Ведь если я не ошибаюсь, нужно это
делать посредством коммандной строки. Меня интересует как средствами
Delphi сделать следующее(скомпилировать и т.д.)

1. Перейти на диск, например выполнить команду D:\
2. Выполнить команду masm prog1.asm

т.е. выолнять такого рода команды... Также нужно фиксировать результат выполнения этих команд в программе,
т.е. чтобы например на Memo отображалось то, что и в cmd в результате выполнения команд.
Или есть другие варианты?

Обсуждение

Неизвестный
23.10.2009, 23:43
общий
это ответ
Здравствуйте, Николай // Programmator .
Не совсем понятен вопрос: Вам нужен редактор кода? Посмотрите в демках Делфи пример RichEdit.
1. Перейти на диск или директорию можно выполнив функцию function SetCurrentDir ( const Dir : string ) : Boolean;
2. Выполнить команду можно либо функцией ShellExecute(нужно добавить в uses ShellApi) либо CreateProcess
Как выводить в memo результат выполнения команд можно посмотреть по ссылке в приложении

Приложение:
CreateProcess, который возвращает консольный вывод: http://delphiworld.narod.ru/base/createprocess_console.html
Пример в ShellExecute:
s:='masm prog1.asm';
ShellExecute(Handle,nil,pchar(s),'','',SW_SHOWNORM AL);
5
Спасибо)))
Неизвестный
24.10.2009, 17:36
общий
это ответ
Здравствуйте, Николай // Programmator !

Пример командной строки в делфи:




procedure RunDosInMemo(CmdLine: string; AMemo: TMemo);
const
ReadBuffer = 2400;
var
Security: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: Pchar;
BytesRead: DWord;
Apprunning: DWord;
begin
Screen.Cursor := CrHourGlass;
Form1.Button1.Enabled := False;
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe(ReadPipe, WritePipe,
@Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;

if CreateProcess(nil,
PChar(CmdLine),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) then
begin
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess, 100);
ReadFile(ReadPipe, Buffer[0],
ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
AMemo.Text := AMemo.text + string(Buffer);

Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
Screen.Cursor := CrDefault;
Form1.Button1.Enabled := True;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
RunDosInMemo(edit1.Text, Memo1);
end;

Приложение:
procedure RunDosInMemo(CmdLine: string; AMemo: TMemo);
const
ReadBuffer = 2400;
var
Security: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: Pchar;
BytesRead: DWord;
Apprunning: DWord;
begin
Screen.Cursor := CrHourGlass;
Form1.Button1.Enabled := False;
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe(ReadPipe, WritePipe,
@Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;

if CreateProcess(nil,
PChar(CmdLine),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) then
begin
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess, 100);
ReadFile(ReadPipe, Buffer[0],
ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
AMemo.Text := AMemo.text + string(Buffer);

Application.ProcessMessages;
until (Apprunning <> WAIT_TIMEOUT);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
Screen.Cursor := CrDefault;
Form1.Button1.Enabled := True;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
RunDosInMemo(edit1.Text, Memo1);
end;
4
А весь проект можно?
Неизвестный
27.10.2009, 14:25
общий
Весь проект тут URL >>
Неизвестный
27.10.2009, 16:52
общий
Akahaos:
Cпасибо)
Форма ответа