كيف تضم المسار في سطر القيادة؟
-
24-09-2019 - |
سؤال
CreateProcess () إرجاع خطأ عندما يحتوي سطر الأوامر على مسار. لا أفهم السبب.
هنا قمت بتبسيط العملية:
function ExecProcess(path:string):boolean;
var StartupInfo:TstartupInfo;
ProcInfo:TProcessInformation;
begin
FillChar( StartupInfo, SizeOf( TStartupInfo ), 0 );
StartupInfo.cb := SizeOf( TStartupInfo );
Result:= CreateProcess(nil, PChar(path), Nil, Nil, False, 0, Nil, PChar(ExtractFilePath(path)),StartupInfo,ProcInfo);
end;
begin
ExecProcess(ParamStr(0) + ExtractFilePath(ParamStr(0)));
end.
النتيجة خاطئة.
كيف يمكنني تضمين PATH في سطر القيادة؟
المحلول
إذا أعطيت بعض معلومات التصحيح مثل قيم ParamStr (0) و Path ، أعتقد أنك ستجد إجابتك الخاصة. أعتقد أن الخطأ هنا: paramstr (0) + extractFilePath (paramstr (0))
لذا ، إذا كان تطبيقك C: Apps foo.exe ، فستتصل بشكل فعال: Execprocess ('c: apps foo.exec: apps ') ؛
لا أعتقد أن هذا ما تريده. ومع ذلك ، لا تقول ما تفعله ، لذلك من الصعب معرفته بالتأكيد ....
نصائح أخرى
كلما واجهت مشاكل في المسارات ، فهي إما
- يحتوي المسار على مسافات فيه ويحتاج إلى لفها في اقتباسات
- تتم معاملة الانزلاقات الخلفية في المسار مثل شخصيات الهروب وتحتاج إلى مضاعفة ""
كما ذكر كريس ، أنت تسلسل القيمتين (بدون مساحة بينهما) إلى سلسلة طويلة. نظرًا لأن `c: apps foo.exec: apps 'ربما لا يكون ما تقصده تمامًا ، ربما لا ينبغي أن تفعل ذلك.
بالإضافة إلى ذلك ، إذا كان أي من المسارات يحتوي على مساحات ، فقد تحتاج إلى إضافة أسعار مزدوجة. دلفي لديها وظيفة في sysutils فقط لهذا الغرض:
var
AppPath, ExePath: string
begin
// Setup StartupInfo and ProcInfo as before. Omitted for brevity here.
ExePath := AnsiQuotedStr(ParamStr(0), '"');
AppPath := AnsiQuotedStr(ExtractFilePath(ExePath), '"');
Result:= CreateProcess(nil, ExePath, Nil, Nil, False, 0,
Nil, Apppath, StartupInfo, ProcInfo);
end;
لاحظ أنه من خلال تعيين القيمتين لمتغيرات السلسلة ، فإن PRARAS يلقيون عادة ما يكونون ضروريين ، حيث أن المترجم سوف يتعامل معها ضمنيًا لك.