Ĺadny brzuch
Witam.
Przetłumaczyłem sobie z Delphi na c++ kawałek kodu. Jednak coś jest źle i nie wiem dokładnie co.
Oto kod w C++:#include <cstdlib> #include <iostream> #include <windows.h> #include <shlobj.h> #include <string> using namespace std; void System(string Cmd) { string TmpFn; DWORD Tmp; char Buf[8191]; HANDLE Hnd; _STARTUPINFOA SI; _SECURITY_ATTRIBUTES SA; _PROCESS_INFORMATION PI; string Result = ""; GetTempPath(sizeof(Buf), Buf); GetTempFileName(Buf, "ABC", 0, Buf); TmpFn = string(Buf); Cmd = "%ComSpec% /c " + Cmd; ExpandEnvironmentStrings(Cmd.c_str(), Buf, sizeof(Buf)); memset(&SA, sizeof(SA), 0); SA.nLength = sizeof(SA); SA.bInheritHandle = true; Hnd = CreateFile(TmpFn.c_str() , GENERIC_READ | GENERIC_WRITE, 0, &SA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if(Hnd == INVALID_HANDLE_VALUE) return; memset(&SI, sizeof(SI), 0); SI.cb = sizeof(SA); SI.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; SI.hStdOutput = Hnd; SI.hStdError = Hnd; SI.wShowWindow = SW_HIDE; if(CreateProcess(NULL, Buf, NULL, NULL, true, 0, NULL, NULL, &SI, &PI)) { WaitForSingleObject(PI.hProcess, INFINITE); CloseHandle(PI.hThread); CloseHandle(PI.hProcess); SetFilePointer(Hnd, 0, NULL, FILE_BEGIN); ReadFile(Hnd, (LPVOID)Result.c_str(), Result.length(), &Tmp, NULL); cout << Result << endl; } else { cout << "nie utworzno procesu" << endl; return; } CloseHandle(Hnd); DeleteFile(TmpFn.c_str()); } int main() { System("dir c:"); system("PAUSE"); return EXIT_SUCCESS; } Kompilator Dev c++.
A to Delphi:function System(Cmd: string): string; var TmpFn: string; Tmp: Cardinal; Buf: array[0..8191] of Char; Hnd: THandle; SI: TStartupInfo; SA: TSecurityAttributes; PI: TProcessInformation; begin Result := ''; GetTempPath(SizeOf(Buf), Buf); GetTempFileName(Buf, 'ABC', 0, Buf); TmpFn := string(Buf); Cmd := '%ComSpec% /c ' + Cmd; ExpandEnvironmentStrings(@Cmd[1], Buf, SizeOf(Buf)); FillChar(SA, SizeOf(SA), 0); SA.nLength := SizeOf(SA); SA.bInheritHandle := True; Hnd := CreateFile(PChar(TmpFn), GENERIC_READ or GENERIC_WRITE, 0, @SA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if Hnd = INVALID_HANDLE_VALUE then Exit; FillChar(SI, SizeOf(SI), 0); SI.cb := SizeOf(SA); SI.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; SI.hStdOutput := Hnd; SI.hStdError := Hnd; SI.wShowWindow := SW_HIDE; if CreateProcess(nil, Buf, nil, nil, True, 0, nil, nil, SI, PI) then begin WaitForSingleObject(PI.hProcess, INFINITE); CloseHandle(PI.hThread); CloseHandle(PI.hProcess); SetLength(Result, GetFileSize(Hnd, nil)); SetFilePointer(Hnd, 0, nil, FILE_BEGIN); ReadFile(Hnd, Result[1], Length(Result), Tmp, nil); form1.Memo1.Lines.Add(result); end; CloseHandle(Hnd); DeleteFile(PChar(TmpFn)); end; Co jest źle?
Użytkownik Konrad_st edytował ten post 04 sierpień 2006, 18:54
Ale co sie dokladnie pojawia?
Kompiluje sie, ale Result (czyli wynik) jest cały czas pusty.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Przetłumaczyłem sobie z Delphi na c++ kawałek kodu. Jednak coś jest źle i nie wiem dokładnie co.
Oto kod w C++:#include <cstdlib> #include <iostream> #include <windows.h> #include <shlobj.h> #include <string> using namespace std; void System(string Cmd) { string TmpFn; DWORD Tmp; char Buf[8191]; HANDLE Hnd; _STARTUPINFOA SI; _SECURITY_ATTRIBUTES SA; _PROCESS_INFORMATION PI; string Result = ""; GetTempPath(sizeof(Buf), Buf); GetTempFileName(Buf, "ABC", 0, Buf); TmpFn = string(Buf); Cmd = "%ComSpec% /c " + Cmd; ExpandEnvironmentStrings(Cmd.c_str(), Buf, sizeof(Buf)); memset(&SA, sizeof(SA), 0); SA.nLength = sizeof(SA); SA.bInheritHandle = true; Hnd = CreateFile(TmpFn.c_str() , GENERIC_READ | GENERIC_WRITE, 0, &SA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if(Hnd == INVALID_HANDLE_VALUE) return; memset(&SI, sizeof(SI), 0); SI.cb = sizeof(SA); SI.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; SI.hStdOutput = Hnd; SI.hStdError = Hnd; SI.wShowWindow = SW_HIDE; if(CreateProcess(NULL, Buf, NULL, NULL, true, 0, NULL, NULL, &SI, &PI)) { WaitForSingleObject(PI.hProcess, INFINITE); CloseHandle(PI.hThread); CloseHandle(PI.hProcess); SetFilePointer(Hnd, 0, NULL, FILE_BEGIN); ReadFile(Hnd, (LPVOID)Result.c_str(), Result.length(), &Tmp, NULL); cout << Result << endl; } else { cout << "nie utworzno procesu" << endl; return; } CloseHandle(Hnd); DeleteFile(TmpFn.c_str()); } int main() { System("dir c:"); system("PAUSE"); return EXIT_SUCCESS; } Kompilator Dev c++.
A to Delphi:function System(Cmd: string): string; var TmpFn: string; Tmp: Cardinal; Buf: array[0..8191] of Char; Hnd: THandle; SI: TStartupInfo; SA: TSecurityAttributes; PI: TProcessInformation; begin Result := ''; GetTempPath(SizeOf(Buf), Buf); GetTempFileName(Buf, 'ABC', 0, Buf); TmpFn := string(Buf); Cmd := '%ComSpec% /c ' + Cmd; ExpandEnvironmentStrings(@Cmd[1], Buf, SizeOf(Buf)); FillChar(SA, SizeOf(SA), 0); SA.nLength := SizeOf(SA); SA.bInheritHandle := True; Hnd := CreateFile(PChar(TmpFn), GENERIC_READ or GENERIC_WRITE, 0, @SA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if Hnd = INVALID_HANDLE_VALUE then Exit; FillChar(SI, SizeOf(SI), 0); SI.cb := SizeOf(SA); SI.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; SI.hStdOutput := Hnd; SI.hStdError := Hnd; SI.wShowWindow := SW_HIDE; if CreateProcess(nil, Buf, nil, nil, True, 0, nil, nil, SI, PI) then begin WaitForSingleObject(PI.hProcess, INFINITE); CloseHandle(PI.hThread); CloseHandle(PI.hProcess); SetLength(Result, GetFileSize(Hnd, nil)); SetFilePointer(Hnd, 0, nil, FILE_BEGIN); ReadFile(Hnd, Result[1], Length(Result), Tmp, nil); form1.Memo1.Lines.Add(result); end; CloseHandle(Hnd); DeleteFile(PChar(TmpFn)); end; Co jest źle?
Użytkownik Konrad_st edytował ten post 04 sierpień 2006, 18:54
Ale co sie dokladnie pojawia?
Kompiluje sie, ale Result (czyli wynik) jest cały czas pusty.