سؤال

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 ') ؛

لا أعتقد أن هذا ما تريده. ومع ذلك ، لا تقول ما تفعله ، لذلك من الصعب معرفته بالتأكيد ....

نصائح أخرى

كلما واجهت مشاكل في المسارات ، فهي إما

  1. يحتوي المسار على مسافات فيه ويحتاج إلى لفها في اقتباسات
  2. تتم معاملة الانزلاقات الخلفية في المسار مثل شخصيات الهروب وتحتاج إلى مضاعفة ""

كما ذكر كريس ، أنت تسلسل القيمتين (بدون مساحة بينهما) إلى سلسلة طويلة. نظرًا لأن `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 يلقيون عادة ما يكونون ضروريين ، حيث أن المترجم سوف يتعامل معها ضمنيًا لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top