проблемы с запуском приложения SlimDX C # на компьютере с Windows XP - PullRequest
1 голос
/ 20 марта 2012

Я сделал простое приложение C # WinForms, которое делает снимок экрана

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SlimDX.Direct3D9;
using SlimDX;

namespace KMPP
{
    public class DxScreenCapture
    {
        Device d;

        public DxScreenCapture()
        {
            PresentParameters present_params = new PresentParameters();
            present_params.Windowed = true;
            present_params.SwapEffect = SwapEffect.Discard;

            d = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing, present_params);
        }

        public Surface CaptureScreen()
        {
            Surface s = Surface.CreateOffscreenPlain(d, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Format.A8R8G8B8, Pool.Scratch);
            d.GetFrontBufferData(0, s);
            return s;
        }
    }
}

Теперь, чтобы назвать это:

using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using SlimDX.Direct3D9;
using SlimDX;
using KMPP;
using System.Diagnostics;
using System.Threading;

namespace dxcapture
{
    public partial class Form1 : Form
    {
        DxScreenCapture sc = new DxScreenCapture();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Stopwatch stopwatch = new Stopwatch();
            DateTime current = DateTime.Now;

            string n = string.Format(@"text-{0:yyyy-MM-dd_hh-mm-ss-tt}.bmp",DateTime.Now);

            string directory = (@"C:\temp\");
            string name = (".bmp");
            string filename = String.Format("{0:hh-mm-ss}{1}", DateTime.Now, name);
            string path = Path.Combine(directory, filename);


            stopwatch.Start();

            Thread.Sleep(1000);

            Surface s = sc.CaptureScreen();
            Surface.ToFile(s, path, ImageFileFormat.Bmp);
            stopwatch.Stop();
            s.Dispose();

            textBox1.Text = ("Elapsed:" + stopwatch.Elapsed.TotalMilliseconds);


        }

        private void button2_Click(object sender, EventArgs e)
        {

        }

    }
}

Все работает нормально, когда я запускаю это приложение на Windows 7 x64 (оно было скомпилировано здесь)

К сожалению, когда я пытаюсь запустить это приложение на компьютере с Windows XP x86 - я получаю следующую ошибку:

http://i.minus.com/ipilqHeWqbvKe.png

Как я пытался это исправить?

  • установлен новейший DX на WinXP

  • установил последнюю версию SlimDX на WinXP (кстати, этот шаг решил мою предыдущую проблему)

  • установил последнюю версию .Net Framework v.4 на WinXP

  • скомпилировал это приложение как x86 и использовал SlimDX.dll x86 по той же причине

  • Я также положил slimdx.dll в ту же папку, где находится dxcapture.exe (имя приложения)

В чем может быть проблема? WinXP поддерживает захват экрана Directx9?

edit: Я пытался закомментировать различные строки кода, и похоже, что проблема заключается в "создании устройства". Я имею в виду эту строку:

            d = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing, present_params);

Машина WinXP имеет встроенную графику ATI, так что я не знаю ... может быть, в этом проблема, а может и нет, но я не могу проверить свою программу на другом компьютере.

1 Ответ

0 голосов
/ 30 марта 2012

Как упоминалось в отчете об ошибке, который вы подали, проблема, по-видимому, связана с вашей системой, будь то отсутствующие компоненты DirectX или графический адаптер, не поддерживающий Direct3D 9. Если ваша карта хотя бы не поддерживает D3D9, вы выиграли ' не может использовать SlimDX (или любую другую оболочку DirectX) для любого вида рендеринга.

...