You are not logged in.

  • Login

1

Thursday, November 23rd 2006, 2:51pm

Von Delphi in C/C++

Hi,

bin kein Delphi-Kenner..wer kann mit diesen Code funktionsfähig in C oder C++ umschreiben!??? Danke

Delphi Quellcode

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
function GetConsoleOutput(const Command: String; var Output, Errors: TStringList): Boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  PipeOutputRead: THandle;
  PipeOutputWrite: THandle;
  PipeErrorsRead: THandle;
  PipeErrorsWrite: THandle;
  Succeed: Boolean;
  Buffer: array [0..255] of Char;
  NumberOfBytesRead: DWORD;
  Stream: TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
 
  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := true;
  SecurityAttr.lpSecurityDescriptor := nil;
 
  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);
 
  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError := PipeErrorsWrite;
  StartupInfo.wShowWindow := sw_Hide;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
 
  if  CreateProcess(nil, PChar(command), nil, nil, true,
  CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
  StartupInfo, ProcessInfo) then begin
    result:=true;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);
 
    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Output.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);
 
    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while true do begin
        succeed := ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil);
        if not succeed then break;
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Errors.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);
 
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else begin
    result:=false;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;

2

Thursday, November 23rd 2006, 7:57pm

Hab ehrlichgesagt keine Lust dir deinen Code zu übersetzen. Auch wenn du kein Delphi kannst, verstehst du ja wohl was da passiert und wirst es in C++ umschreiben können oder?

3

Thursday, November 23rd 2006, 8:10pm

Ich denke das hier sollte dir weiterhelfen.
Geht zumindest in die gleiche Richtung.

Gruß void

4

Wednesday, December 20th 2006, 10:40am

C Quellcode

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
bool GetConsoleOutput(String sCommandLine, TStringList *Output, TStringList *Errors)
{
	STARTUPINFO  StartupInfo;
	PROCESS_INFORMATION ProcessInfo;
	SECURITY_ATTRIBUTES SecurityAttr;
	HANDLE PipeOutputRead, PipeOutputWrite, PipeErrorsRead, PipeErrorsWrite;
	bool bSucceed, bResult;
	char Buffer[255];
	DWORD dwNumberOfBytesRead;
	TMemoryStream *Stream;
 
	//Initialisierung ProcessInfo
	ZeroMemory( &ProcessInfo, sizeof(PROCESS_INFORMATION));
 
	//Initialisierung SecurityAttr
	ZeroMemory( &SecurityAttr, sizeof(SECURITY_ATTRIBUTES));
	SecurityAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
	SecurityAttr.bInheritHandle = TRUE;
	SecurityAttr.lpSecurityDescriptor = NULL;
 
	//Pipes erzeugen
	if (!CreatePipe(&PipeOutputRead, &PipeOutputWrite, &SecurityAttr, 0))
		return false;
	if (!CreatePipe(&PipeErrorsRead, &PipeErrorsWrite, &SecurityAttr, 0))
		return false;
 
	//Initialisierung StartupInfo
	ZeroMemory( &StartupInfo, sizeof(STARTUPINFO));
	StartupInfo.cb = sizeof(STARTUPINFO);
	StartupInfo.hStdInput = 0;
	StartupInfo.hStdOutput = PipeOutputWrite;
	StartupInfo.hStdError = PipeErrorsWrite;
	StartupInfo.wShowWindow = SW_HIDE;
	StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 
	if(CreateProcess(NULL, sCommandLine.c_str(), NULL, NULL,
	  TRUE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, NULL, NULL, &StartupInfo, &ProcessInfo))
	{
		bResult = true;
		//Write-Pipes schließen
		CloseHandle(PipeOutputWrite);
		CloseHandle(PipeErrorsWrite);
 
		//Ausgabe Read-Pipe auslesen
		Stream = new TMemoryStream;
		try
		{
		  while (true)
		  {
			bSucceed = ReadFile(PipeOutputRead, Buffer, 255, &dwNumberOfBytesRead, NULL);
			if (!bSucceed) break;
			Stream->Write(Buffer, dwNumberOfBytesRead);
		  }
		  Stream->Position = 0;
		  Output->LoadFromStream(Stream);
		}
		__finally
		{
		  delete Stream;
		}
		CloseHandle(PipeOutputRead);
 
		//Fehler Read-Pipe auslesen
		Stream = new TMemoryStream;
		try
		{
		  while (true)
		  {
			bSucceed = ReadFile(PipeErrorsRead, Buffer, 255, &dwNumberOfBytesRead, NULL);
			if (!bSucceed) break;
			Stream->Write(Buffer, dwNumberOfBytesRead);
		  }
		  Stream->Position = 0;
		  Errors->LoadFromStream(Stream);
		}
		__finally
		{
		  delete Stream;
		}
		CloseHandle(PipeErrorsRead);
 
		WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
		CloseHandle(ProcessInfo.hProcess);
	}
	else
	{
		bResult = false;
		CloseHandle(PipeOutputRead);
		CloseHandle(PipeOutputWrite);
		CloseHandle(PipeErrorsRead);
		CloseHandle(PipeErrorsWrite);
	}
	return bResult;
}

Social bookmarks