簡體   English   中英

DirectX 應用程序無法通過 Process.Start 在 Windows Server 2012 R2 上加載,通過 CMD 或在本地計算機上正常工作

[英]DirectX app unable to load through Process.Start on Windows Server 2012 R2, works fine through CMD or on local machine

我有一個運行 DirectX 11 的應用程序,它播放場景並生成 mp4。 我正在嘗試通過 Process.Start 啟動它,以便我可以管理進程並在它崩潰或未正確關閉時強制它超時。

當我在本地 Win10 機器上測試 function 時,它運行良好,當我在 WinServ2012R2 機器上通過 CL 或 a.BAT 文件運行它時,它也運行良好。 但是,當我嘗試在服務器機器上通過 Process.Start function 運行它時,它無法打開 DirectX

var startInfo = new System.Diagnostics.ProcessStartInfo($"{AppLocation}", $"{Parameters}")
{
   WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal,
   UseShellExecute = false,
   RedirectStandardOutput = true,
   CreateNoWindow = false,
   WorkingDirectory = $"{DirectoryName}",
   Verb = "runas"
};

var loop = 0;
while (!System.IO.File.Exists($"{FileLocation}"))
{
   loop++;
   using (var p = System.Diagnostics.Process.Start(startInfo))
   {
      Logger.Info("Process Running....");
      if (!p.WaitForExit(300000))
      {
         p.Kill();
      }
      if (loop >= 5)
         break;
    }
}

編輯:DirectX 錯誤是:DXGI_ERROR_NOT_CURRENTLY_AVAILABLE 0x887A0022

大概和環境有關吧。

如果父進程是在該服務器的桌面內運行的普通 Win32 控制台或 GUI 應用程序,則放置類似Sleep( 60000 ); 在您的main()WinMain function 的第一行中,並使用Process Explorer查找有效的手動啟動和失敗的編程啟動之間的差異。 檢查進程的“圖像”、“安全”和“環境”選項卡。

如果父進程是系統服務,那就更復雜了。 服務通常在另一個用戶帳戶下運行,您需要進行一些設置以允許服務或服務啟動的子進程訪問 GPU。

另一個可能的原因是防病毒或反惡意軟件破壞了東西。

PS 請注意,您的代碼中有小錯誤。

一件事,當您檢測到超時時, Process.Kill 是異步的,您需要稍后等待。

另一個,您指定RedirectStandardOutput = true但您不使用該 stream。 如果子進程打印大量文本,它最終會停止等待父進程消耗 pipe 中緩沖的數據。 如果您不關心 output,請不要重定向這些流。 如果您確實關心,請在打印后立即重定向並使用數據,無論是在單獨的線程上還是使用 async/await。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM