Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
deeller
38 / 38 / 4
Регистрация: 20.04.2011
Сообщений: 779
Записей в блоге: 1
#1

Не работает код в Delphi 2010

15.12.2011, 13:00. Просмотров 2115. Ответов 14
Метки нет (Все метки)

нашел функцию в сети, возращающую в мемо результат выполнения команды из консоли,
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
 const 
    ReadBuffer = 2400; 
 var 
  Security            : TSecurityAttributes; 
  ReadPipe,WritePipe  : THandle; 
  start               : TStartUpInfo; 
  ProcessInfo         : TProcessInformation;
  Buffer              : Pchar; 
  BytesRead           : DWord; 
  Apprunning          : DWord; 
 begin 
  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(DosApp), 
          @Security, 
          @Security, 
          true, 
          NORMAL_PRIORITY_CLASS, 
          nil, 
          nil, 
          start, 
          ProcessInfo) 
   then 
   begin 
    repeat 
     Apprunning := WaitForSingleObject 
                  (ProcessInfo.hProcess,100); 
     Application.ProcessMessages; 
    until (Apprunning <> WAIT_TIMEOUT); 
     Repeat 
       BytesRead := 0; 
       ReadFile(ReadPipe,Buffer[0], 
               ReadBuffer,BytesRead,nil); 
       Buffer[BytesRead]:= #0; 
       OemToAnsi(Buffer,Buffer); 
       AMemo.Text := AMemo.text + String(Buffer); 
     until (BytesRead < ReadBuffer); 
  end; 
  FreeMem(Buffer); 
  CloseHandle(ProcessInfo.hProcess); 
  CloseHandle(ProcessInfo.hThread); 
  CloseHandle(ReadPipe); 
  CloseHandle(WritePipe); 
  end; 
 end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  RunDosInMemo('route print',Memo1);
end;
в delphi 7 работает в 2010 ругается на
Delphi
1
oemtoansi(buffer,buffer);
пишет [DCC Error] Unit1.pas(83): E2010 Incompatible types: 'Char' and 'AnsiChar' может кто подскажет как решить?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2011, 13:00
Ответы с готовыми решениями:

JPEG error # 53 В Delphi 7 всё работает, а в 2010 нет. Где я туплю?
Здравствуйте! Вот кусок программы, который работает, как нужно в delphi 7. ...

Не работает код в Delphi
unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

Не работает код в Delphi
Пишу в Button1 код, для того чтобы при нажатии кнопки текст из edt1 шифровался...

Не работает код Delphi...
Ошибка возникает после: case key &quot; case key &quot;0&quot;..&quot;9&quot;,chr(8); ...

Почему не работает код в Delphi 6?!
Хочу сделать так, чтобы из dll в исполняемый файл загружать строки, которые в...

14
igoriy
871 / 542 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
15.12.2011, 15:00 #2
Delphi
1
2
3
4
5
6
 var 
  Security            : TSecurityAttributes; 
  ReadPipe,WritePipe  : THandle; 
  start               : TStartUpInfo; 
  ProcessInfo         : TProcessInformation;
  Buffer              : PAnsichar;//допиши вот так
Добавлено через 1 минуту
Что самое интересное что у меня сейчас этот же код- да только ругается на
Delphi
1
 if CreateProcess
не может найти точку входа
0
deeller
38 / 38 / 4
Регистрация: 20.04.2011
Сообщений: 779
Записей в блоге: 1
15.12.2011, 15:02  [ТС] #3
Цитата Сообщение от igoriy Посмотреть сообщение
не может найти точку входа
такая же ошибка, на делфи 7 этот код работает исправно.
0
igoriy
871 / 542 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
15.12.2011, 16:06 #4
ну тогда давай вдвоем ждать совета умных людей

Добавлено через 1 час 3 минуты
Держи рабочий код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
procedure RunDosInMemo(DosApp:String;AMemo:TMemo);
 const
    ReadBuffer = 2400;
 var
  Security            : TSecurityAttributes;
  ReadPipe,WritePipe  : THandle;
  start               : TStartUpInfo;
  ProcessInfo         : TProcessInformation;
  Buffer              : PAnsichar;
  BytesRead           : DWord;
  Apprunning          : DWord;
  Fil                : string;
 begin
  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_SHOWNORMAL;
        Fil := 'cmd';
        Fil := Fil + '.exe';
   if CreateProcess(nil,
          PChar(Fil),
          @Security,
          @Security,
          true,
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          start,
          ProcessInfo)
   then
   begin
    repeat
     Apprunning := WaitForSingleObject
                  (ProcessInfo.hProcess,100);
 
    until (Apprunning <> WAIT_TIMEOUT);
     Repeat
       BytesRead := 0;
       ReadFile(ReadPipe,Buffer[0],
               ReadBuffer,BytesRead,nil);
       Buffer[BytesRead]:= #0;
       OemToAnsi(Buffer,Buffer);
       AMemo.Text := AMemo.text + String(Buffer);
     until (BytesRead < ReadBuffer);
  end;
  FreeMem(Buffer);
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ReadPipe);
  CloseHandle(WritePipe);
  end;
 end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  RunDosInMemo('route print',Memo1);
end;
1
deeller
38 / 38 / 4
Регистрация: 20.04.2011
Сообщений: 779
Записей в блоге: 1
15.12.2011, 16:07  [ТС] #5
спасибо буквально минут 15-20 назад тоже самое сделал=)
0
igoriy
871 / 542 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
15.12.2011, 16:07 #6
ну пока не совсем рабочий но уже похоже
0
deeller
38 / 38 / 4
Регистрация: 20.04.2011
Сообщений: 779
Записей в блоге: 1
15.12.2011, 16:08  [ТС] #7
только в первом параметре..
0
БогДелфей
422 / 330 / 36
Регистрация: 31.05.2011
Сообщений: 1,156
15.12.2011, 16:34 #8
с CreateProcess бывают грабли, может как то так?
Delphi
1
CreateProcess(PChar(Fil), nil,
0
igoriy
871 / 542 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
15.12.2011, 16:40 #9
есть хорошая статья на эту тему - но ссылки на другие ресурсы запрещены
0
deeller
38 / 38 / 4
Регистрация: 20.04.2011
Сообщений: 779
Записей в блоге: 1
15.12.2011, 16:41  [ТС] #10
ссылки в личку, только у меня достаточно много рабочих проектов на 2010 с CreateProcess, не пому почему тут ругается
0
igoriy
871 / 542 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
15.12.2011, 20:33 #11
вышел из положения
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sEdit, sMemo, sButton, sSkinManager, sLabel;
 
type
  TForm1 = class(TForm)
    sSkinManager1: TsSkinManager;
    Button1: TsButton;
    Memo1: TsMemo;
    Edit1: TsEdit;
    sLabel1: TsLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
 
 
 
 
 
procedure RunDosInMemo( DosApp, dd:String;AMemo:TMemo);
 const
    ReadBuffer = 2400;
 var
  Security            : TSecurityAttributes;
  ReadPipe,WritePipe  : THandle;
  start               : TStartUpInfo;
  ProcessInfo         : TProcessInformation;
  Buffer              : PAnsichar;
  BytesRead           : DWord;
  Apprunning          : DWord;
  Fil                : string;
 begin
  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;
      Fil := DosApp;
      Fil := Fil + dd;
   if CreateProcess(nil,
          PChar(Fil),
          @Security,
          @Security,
          true,
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          start,
          ProcessInfo)
   then
   begin
    repeat
     Apprunning := WaitForSingleObject
                  (ProcessInfo.hProcess,100);
 
    until (Apprunning <> WAIT_TIMEOUT);
     Repeat
       BytesRead := 0;
       ReadFile(ReadPipe,Buffer[0],
               ReadBuffer,BytesRead,nil);
       Buffer[BytesRead]:= #0;
       OemToAnsi(Buffer,Buffer);
       AMemo.Text := AMemo.text + String(Buffer);
     until (BytesRead < ReadBuffer);
  end;
  FreeMem(Buffer);
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ReadPipe);
  CloseHandle(WritePipe);
  end;
 end;
procedure TForm1.Button1Click(Sender: TObject);
var
onepart,twopart: string;
 
begin
  Memo1.Clear;
  onepart:= Copy(Edit1.Text,1,1);
  twopart:= Copy(Edit1.Text,2,Length(Edit1.Text)-1);
  RunDosInMemo(onepart,twopart,Memo1);
end;
 
end.
Добавлено через 2 часа 36 минут
обнаружил какую то странность : половина команд нормальный вывод на русском а другая половина абракадабра .
0
deeller
38 / 38 / 4
Регистрация: 20.04.2011
Сообщений: 779
Записей в блоге: 1
16.12.2011, 08:38  [ТС] #12
времени на ковыряние не было, благо что стоит delphi 7. исходный код на нем работает отлично
0
deathNC
17.12.2011, 09:54
  #13
 Комментарий модератора 
igoriy, ссылки только на форумы запрещены, а на статьи можешь постить
0
igoriy
17.12.2011, 10:22
  #14

Не по теме:

Привет deathNC спасибо за консультацию а то я как обычно в танке :)

0
bdfaa
0 / 0 / 0
Регистрация: 04.12.2012
Сообщений: 10
04.12.2012, 16:46 #15
Чтож такое в 10, кто знает, схожая проблема с абсолютно другой прогой, в 7 всё работало
0
04.12.2012, 16:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 16:46

Не работает код на Delphi XE8,10
Создавал мини-сервис для моей проги(Unlocker'a) в Delphi 7 Lite fill. Потом...

Delphi 2010 (RAD Studio 2010) критическая область
Подскажите, пожалуйста, как в Делфи 2010 создать критическую область? Делал...

Код на delphi10 работает не так, как в delphi 7
Здравствуйте. Подскажите, пожалуйста, как сделать так, чтобы код работал верно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru