Funkcja ShellExecute służy tylko do uruchomienia programu z jednym argumentem, ta funkcja nie analizuje argumentu przekazywanego z linii komend tylko go przekazuje do programu. Teoretycznie program GREP powinien sam przeanalizować parametr i coś z nim zrobić, ale to tak nie działa.
Programy pobierają standardowo zawsze jeden parametr ParamStr(0) i jest to zawsze ścieżka dostępu do programu wraz z pełną nazwą pliku, tak już jest w Windows, kolejne argumenty to są ParamStr(1), ParamStr(2) i tak dalej, te dodatkowe argumenty są odbierane przez program tylko jeżeli program jest nastawiony na ich odbieranie, a ten Tój program GREP najwyraźniej oczekuje więcej niż jeden taki argument. Problem polega jednak na tym, że do programu należy przekazywać argumenty pojedynczo, a nie jako ciąg znaków, czyli nie tak:
"-i vector d:\\TEST___\\SLT1.cpp d:\\TEST___\\STL2.cpp > d:\\log.txt"
lecz tak:
"\"-i vector\" \"d:\\TEST___\\SLT1.cpp\" \"d:\\TEST___\\STL2.cpp > d:\\log.txt\""
nie jestem pewien tej składni, chodzi jednak o to, że jeżeli program oczekuje kilki parametrów jeden po drugim to tak należy je przekazywać, jako kilka parametrów a wszystkie w jednym.
Lepszym rozwiązaniem jest funkcja CreateProcess i dla Twoich potrzeb mogła by wyglądać tak:
- Kod: Zaznacz cały
//--------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Grep = "c:\\grep.exe";
Grep = Grep + " " + "\"-i vector d:\\TEST___\\SLT1.cpp d:\\TEST___\\STL2.cpp > d:\\log.txt\"";
STARTUPINFO StartupInfo;
;ZeroMemory( &StartupInfo, sizeof(STARTUPINFO));
StartupInfo.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION ProcessInfo;
if(CreateProcess(NULL,
Grep.c_str(),
NULL,
NULL,
TRUE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&StartupInfo,
&ProcessInfo))
{
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
}
//--------------------------------
Przy takim zapisie: "-i vector d:\\TEST___\\SLT1.cpp d:\\TEST___\\STL2.cpp > d:\\log.txt" przekazujesz do programu parametr w takiej postaci:
-i vector d:\\TEST___\\SLT1.cpp d:\\TEST___\\STL2.cpp > d:\\log.txt
Zauważ, że brakuje cudzysłowów, podczas gdy przy takim zapisie: "\"-i vector d:\\TEST___\\SLT1.cpp d:\\TEST___\\STL2.cpp > d:\\log.txt\"" uzyskasz:
"-i vector d:\\TEST___\\SLT1.cpp d:\\TEST___\\STL2.cpp > d:\\log.txt"
czyli przekazywany parametr zawiera cudzysłowie. Być może problem z ShellExecute sprowadza się tak naprawdę tylko do tych cudzysłowów.