أتمتة الكلمات لا تعمل إلا للمسؤول ، أو مع تأخير بعد إنشاء كلمة. التطبيق

StackOverflow https://stackoverflow.com/questions/4022719

سؤال

لدينا برنامج تم إجراؤه في بورلاند دلفي يستخدم أتمتة الكلمات لإنشاء مستندات. في التثبيت (الخادم الطرفي) ، يمكننا فقط الحصول على كلمة أتمتة العمل عند التشغيل كمسؤول محلي.
عندما يكون Runnnig كمستخدم ANOTER ، نحصل على رسالة خطأ "Opdracht Mislukt -2146824090" (نسخته الهولندية من المكتب) ، أعتقد أنه تترجم إلى "فشل العملية" أو "فشل الأمر".

قام المستخدم بقراءة/كتابة الوصول إلى المجلد حيث يحاول البرنامج وضع المستند الجديد.

مكتب 2010
64Bits Windows Server 2008 R2 Standard

التطبيق هو تطبيق Windows 32 بت.

إذا قمت بإضافة تأخير (500 مللي ثانية) بعد إنشاء الكلمة. التطبيق ، كل شيء يعمل على أنه Normall.

WordApp   := CreateOleObject('Word.Application');
sleep(500);
Doc := WordApp.documents.Open(sFile,EmptyParam,true);

أي شخص يعرف لماذا يعود الأمر CreateOleBject الآن قبل استخدام تطبيق Word؟

هل كانت مفيدة؟

المحلول 3

يبدو أن حساب المسؤول الذي يعمل في تأخيره ، ليس لديه أي شيء لديه حقوق للقيام به ، ولكن تحدث هذه الكلمة بشكل أسرع بكثير مع هذا الحساب من حسابات مستخدمي المجال العادية.

يمكنني العيش مع حل المتأخر ، ولكن إذا كان أي شخص يعرف طريقة أفضل ، فيرجى إخبارنا بذلك.

نصائح أخرى

إذا كنت تريد تتبع ذلك ، فيمكنك استخدام أداة مثل ProcessMonitor لتتبع Word Automation Executions حتى النقطة التي يمكنك استخدام التطبيق.

يبدو أن هناك نوعًا من التحقق من الحقوق يحدث - لكن نصف ثانية يبدو الكثير من الوقت لهذا الغرض.

يمكنك محاولة فتح الوثيقة عدة مرات ، أم أن Word قد غمرت تمامًا بعد أن أعطت الخطأ؟

WordApp := CreateOleObject('Word.Application');

while True do
begin
  try
    Doc := WordApp.documents.Open(sFile,EmptyParam,true);
    Break;
  except
    on E: EOleSysError do
    begin
      // raise error if it's not the expected "Command failed" error
      if E.ErrorCode <> -2146824090 then
        raise;
    end;
  end;
end;

يحرر:

لطفا أنظر جوابي هنا مما يوفر حلاً أفضل وشرحًا لسبب حدوث ذلك.

أدرك أن هذا الموضوع قديم جدًا ، لكنني حللت هذه المشكلة من خلال التأكد من إغلاق المستند قبل الإقلاع عن التدخين (Oledocument.close). من خلال القيام بذلك ، ليست هناك حاجة إلى أي نوع من التأخير ، وما إلى ذلك. انظر مقتطفات رمز Delphi أدناه.

مثال:

  oleWord     := Unassigned;
  oleDocument := Unassigned;

  Screen.Cursor := crHourGlass;

  try
    oleWord               := CreateOleObject('Word.Application');
    oleWord.Visible       := False;
    oleWord.DisplayAlerts := False;

    oleDocument := oleWord.Documents.Open(Worklist.Filename);
    oleDocument.SaveAs(Worklist.Filename, wdFormatDOSTextLineBreaks);

    oleDocument.Close;
    oleWord.Quit(False);
  finally
    oleDocument := Unassigned;
    oleWord     := Unassigned;

    Screen.Cursor := crDefault;
  end;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top