Direct3D Code läuft nur auf Entwicklungs PC



  • Hallo,

    Ich habe ein kleines Projekt auf C# und Direct3D geschrieben. Auf meinem entwicklungsrechner läuft es einwandfrei. Sobald ich es aber auf einem anderen Rechner laufen lassen möchte bekomm ich eine standart Windows Fehlermeldung. Auf dem PC ist aber das Framework 2.0 und die aktuelle directX version, auf der auch entwickelt wurde.

    Als test habe ich puren C# Code mal getestet. Dieser lies sich problemlos ausführen. probleme bekomm ich also sobald ich anfang Direct3D code zu starten.

    Abgesehn davon das es 2 verschiedene rechner sind, mit beides mal winXP drauf, ist ein wesentlicher Unterschied die existenz des DirectX SDK. nicht vorhanden -> läuft nicht.

    Wo liegt der Fehler hierbei, sodass ich den code auch auf anderen PC's zum laufen bringen kann als auf meinem eigenen EntwicklungsPC?

    Gruss Trider



  • Ohne die Fehlermeldung zu kennen kann dir wohl niemand helfen.



  • da gibt es keine. oder besser gesagt es ist die allgemeine fehlermeldung die Windows bringt wenn ein programm abstürtzt.

    Fehlermeldung :

    (Programm) hat ein problem festgestellt und muss beendet werden.

    Falls sie ihr arbeit noch nicht gespeichert hatten, können Daten möglicherweise verlohren gegangen sein.

    Informieren sie Microsoft über das Problem

    usw.. usw...

    Fehlermeldung ende

    Wie gesagt, einfache standart fehlermeldung die kommt sobald ich ein projekt laufen lassen möchte, in dem directx implementiert wurde. Framework 2.0 ist drauf und directx 9.0c. muss noch was anderes installiert werden oder im projekt anders eingestellt werden? (evtl das er gewisse dll's mit compiliert oder so, ich hab keine ahnung!)

    naja falls jemand was mit der fehlermeldung anfangen kann oder das problem kennt wäre ich sehr froh um hilfe...

    Eigentlich müsste das problem doch jeder kennen der ein programm entwickelt hat und es weiter gibt an jemanden der nicht die entwicklungsumgebung hat, oder? *G*

    Danke, Trider



  • Änder mal in "Software Vertexprocessing" um.

    Hat bei mir geholfen.


  • Mod

    versuch remote debugging, falls das mit c# geht (hab ich nie probiert)



  • Schau die Details des Fehlerberichts an. Da steht dann oft die aufgetretene Exception (Debug-Informationen mit ausliefern macht das dann auch noch lesbar).



  • Hier noch eine Stimme für remote debugging. Und es sollte gehen, habs aber auch noch nie mit C# Code probiert 🙂



  • danke, ich werd mal software Vertexprocessinng versuchen.

    Was das debuggen angeht muss ich wohl noch genauer nachforschen, als ich es einmal versucht habe, das projekt über das netzwerk auf dem zielpc geöffnet, ausgeführt und debuggt habe, kam eine meldung das die leitung nicht vertrauenswürdig war. Es ist eine Security exception aufgetreten.

    Remotedebugging mach ich aber zur zeit auf VC4.0 auf einem CE Gerät. Nur mein aktuelles Zielsystem ist ein "normaler rechner". Hab das noch nicht gefunden... Aber danke für die Tips. Ich werd mich hier nochmal melden falls ich entweder die Lösung gefunden habe oder ein anderes Problem aufgetreten ist 🙂

    Danke Trider



  • Trider schrieb:

    da gibt es keine. oder besser gesagt es ist die allgemeine fehlermeldung die Windows bringt wenn ein programm abstürtzt.

    Fehlermeldung :

    (Programm) hat ein problem festgestellt und muss beendet werden.

    Falls sie ihr arbeit noch nicht gespeichert hatten, können Daten möglicherweise verlohren gegangen sein.

    Informieren sie Microsoft über das Problem

    usw.. usw...

    Fehlermeldung ende

    Wie gesagt, einfache stan**** fehlermeldung die kommt sobald ich ein projekt laufen lassen möchte, in dem directx implementiert wurde. Framework 2.0 ist drauf und directx 9.0c. muss noch was anderes installiert werden oder im projekt anders eingestellt werden? (evtl das er gewisse dll's mit compiliert oder so, ich hab keine ahnung!)

    naja falls jemand was mit der fehlermeldung anfangen kann oder das problem kennt wäre ich sehr froh um hilfe...

    Eigentlich müsste das problem doch jeder kennen der ein programm entwickelt hat und es weiter gibt an jemanden der nicht die entwicklungsumgebung hat, oder? *G*

    Danke, Trider

    Das klingt aber verdächtig nach nicht gefundenen Texturen. Lieferst Du alle Texturen (oder Sound) mit und liegen diese im richtigen Verzeichnis ? Die Frage ist gar nicht so abwägig, denn sowas ist mir auch schon passiert 🤡 und dann kommt diese "Fehlermeldung", wenn dieses nicht im Programm abgefangen wird.

    Gruß SciFi



  • Ich hab mal um die erste initialisierung ein try{}catch(exception e){Messagebox.show(e.message)} gebastelt. leider ohne erfolg. Texturen verwende ich gar nicht. Ich hab lediglich mein device, ein Mesh und ein Gittermodell. Um sicher zu gehn das ich keinen müll programmiert hab, habe ich ein beispielprogramm vom directx SDK versucht laufen zu lassen leider auch ohne erfolg.

    Mit dem remote debugging komm ich au net weiter. Eine möglichkeit die ich gefunden hatte war sich an einen laufenden prozess anzuhängen. nur leider stürtzt der prozess ab bevor ich mich dranhängen kann. Andere remote debug methoden wie bekannt aus vs6 wo das projekt übertragen wird und dann gedebugged wäre mir einiges lieber, finde nur keine beispiele für sowas.

    Aber um auf das rusprüngliche Problem zurück zu kommen, ich habe bemerkt das das languagepack gefehlt hatte von meinem Framework. habe es nachträglich installiert und denk das er etwas weiter kommt mit ausführen. Bekomm aber immer noch sie selbe fehlermeldung wie oben aufgeführt...

    Gruss Trider



  • Hm. Kannst du vielleicht auf noch einem anderen PC probieren wo das SDK nicht drauf ist? Könnte schlicht und einfach der Treiber kaputt bzw. fehlerhaft sein...



  • Ich hab ne Vermutung.

    Ich habe ja zum programmieren 3 DLL's von Direct3D verwendet. ich vermute einfach mal das diese 3 zum laufen noch weitere benötigen. Ich habe mal versucht die dll's mit hilfe einer option : lokale kopie, mitzuliefern, doch dann is mein programm nicht mehr lauffähig gewesen. Im Moment habe ich mir einen ordner dll's angelegt wo ich diese lokalen kopien reingelegt habe. danach habe ich die option wieder ausgeschaltet und die dll's mit dem neuen pfad eingebunden. Siehe an es läuft wieder auf dem entwicklungsPC, jedoch immer noch nicht auf dem Zielsystem oder einem anderen rechner. könnte es nun noch sein das diese dll's weitere directxdll's benötigen um korrect zu laufen? mir gehn so langsam die ideen aus was ich machen kann. Eins hab ich och festgestellt. Auf meinem entwicklungsrechner hab ich n haufen directx dll's in meinem windowspfad welche auf keinem anderen rechner vorhanden sind die kein directxSDK besitzten. Hat das etwas damit zu tun?

    Gruss Trider



  • Was für DLLs???



  • Ich vermute, er benutzt MDX und das ist auf dem Zielrechner nicht installiert. In diesem Fall meckert er beim Laden jeder abhängigen Assembly, so dass ein try-catch auch nicht mehr greift. Es reicht nicht, die MDX-DLLs in das selbe Verzeichnis zu stecken, sie müssen im GAC registriert sein und die EULA erlaubt dies nur über DXSetup.



  • Diese Fehlermeldung "...hat ein Problem festgestellt und muss beendet werden" weisst doch meistens auf eine Speicherschutzverletzung hin oder ? Ich habe mir damit auch mal die Zähne ausgebissen, bis ich dann feststellte, dass auf dem Zielrechner ein RAM Riegel defekt war 😕



  • Nein, dieser Dialog kommt bei jeder ungefangenen Exception.



  • Die dll's die ich erwähnte sind : Microsoft.DirectX.dll, Microsoft.DirectX.Direct3D.dll, Microsoft.DirectX.Direct3DX.dll. Diese dll's hab ich meinen Verweisen hinzugefügt und mit using dann im programm eingebunden...

    ok fehler gefunden, aber wie ich ihn beheben kann hab ich keine ahnung.

    Also das hab ich gemacht :

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using Microsoft.DirectX.Direct3D;
    using Microsoft.DirectX;
    
    namespace simpleform
    {
        public partial class Form1 : Form
        {
            bool add_once = true;
            /* device params */
            private Device device = null;
    
            /* Kontrollvariablen um Objekte auszublenden */
            private bool show_buendel = true;
            private bool show_koerper = false;
            private bool show_gitter_koerper = false;
            private bool strafe = false;
            private bool show_bohrloecher = true;
            private bool show_meshnummern = false;
    
            /* Globale informationen */
            /* später eingebbar */
            private float brushes_amount_each_circle = 50;
            private float brushes_cur_abstand = 0.0f;
            private float brushes_abstand_inc = 2.0f;
            int meshes_to_sign = 5000;
    
            /* Kamera Bewegung Variablen
            Matrix mcam_rotate_x = Matrix.Identity;
            Matrix mcam_rotate_y = Matrix.Identity;
            Matrix mcam_rotate_z = Matrix.Identity;
            Matrix mcam_world = Matrix.Identity;
    
            float rot_value_x = 0;
            float rot_value_y = 0;
            float rot_value_z = 0;
    
            /* Mesh Variablen */
            Mesh tubeMesh;
            Mesh koerperMesh;
            /*
            float Cylinder_length = 2f;
            int cylinder_slices = 5;
            int cylinder_stacks = 2;
            private float koerper_radius = 30f;
            Matrix[] rotationen;
            float abstand_z_inc = 2;
            float[] winkel;
            float[] tiefe_ebene;
    
            /* Variablen für einschrenkungen */
            int von_winkel = 45;
            int bis_winkel = 360;
    
            /* Buendeldrehung
            Matrix kippen_y = Matrix.Identity;
            Matrix kippen_x = Matrix.Identity;
            float kippen_y_inc = 5;
            float kippen_x_inc = 5;
            int tmp_offset_kippen_l = 0;
            int tmp_offset_kippen_b = 0;
            int tmp_offset_kippen_all_laenge_l = 0;
            int tmp_offset_kippen_all_laenge_b = 0;
            int tmp_offset_kippen_all_breite_l = 0;
            int tmp_offset_kippen_all_breite_b = 0;
    
            /* Kamera Params */
            private float camDistance = 200f;
            private float cam_pos_x = 40f;
            private float cam_pos_y = 40f;
            private float cam_pos_z = 0f;
            private bool camMove = false;
            private Point mousePtLastPosit;
            private Point mousePtCurrentPosit;
    
            /* Koordinatensystem Variablen
            private VertexBuffer vertexBuffer = null;
            private VertexBuffer vertexBuffer_gitter = null;
    
            /* intersect hilfe */
            int intersected_position = -1;
    
            /* Gitter Variablen 
            //Vertex[] gitter;
            Matrix gitter_position = Matrix.Identity;
    
            /* Thread Variablen */
            Thread t;
    
            /* Buendelbewegung */
            int tmp_offset_x_move = 0;
            int tmp_offset_y_move = 0;
            int tmp_offset_z_move = 0;
    
            /* Koordinatensystem Struktur 
            struct Vertex
            {
                float x, y, z;
                int color;
    
                public Vertex(float _x, float _y, float _z, int _color)
                {
                    x = _x; y = _y; z = _z;
                    color = _color;
                }
    
                public void setData(float _x, float _y, float _z, int _color)
                {
                    x = _x; y = _y; z = _z;
                    color = _color;
                }
    
                public static readonly VertexFormats FVF_Flags = VertexFormats.Position | VertexFormats.Diffuse;
            };
    
            Vertex[] lineVertices = 
                {
                    new Vertex( -10000.0f, 0.0f, 0.0f,  Color.Red.ToArgb() ),   // red = +x Axis
                    new Vertex( 10000.0f, 0.0f, 0.0f,  Color.Red.ToArgb() ),
                    new Vertex( 0.0f, -10000.0f, 0.0f,  Color.Green.ToArgb() ), // green = +y Axis
                    new Vertex( 0.0f, 10000.0f, 0.0f,  Color.Green.ToArgb() ),
                    new Vertex( 0.0f, 0.0f, -10000.0f,  Color.Blue.ToArgb() ),  // blue = +z Axis
                    new Vertex( 0.0f, 0.0f, 10000.0f,  Color.Blue.ToArgb() ),
                };
    
             */
    
            public Form1()
            {
                InitializeComponent();
            }
    

    Also das Programm lässt sich NICHT starten solbald ich eine Matrix oder die Struktur Vertex initialisieren möchte. Komischerweise funktioniert aber die initialisierung von einem Mesh und einem Device. ich hab vil geklammert, da ich nicht remote debuggen konnte. Ich hoffe ihr erkennt die zugehörigkeiten 🙂 ansonsten schreib ich es mal um...

    Habt ihr ne idee warum er mir bei den 2 initialisierungen global in der klasse aussteigt?

    Gruss Trider



  • Ich habe in den Projekteigenschaften einige einstellungen unternomen, sodass er den code auf dem zielrechner compiliert und dann ausführt. nur dann bekomm ich eine fehlermeldung die mit direct x zu tun hat :

    Die DLL "C:\WINDOWS\assembly\GAC\Microsoft.DirectX.Direct3D\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.Direct3D.dll" unternimmt einen Versuch, innerhalb der Sperre für den OS-Loader eine verwaltete Ausführung durchzuführen. Versuchen Sie nicht, verwalteten Code innerhalb einer DllMain- oder Bildinitialisierungsfunktion auszuführen, da dies ein Hängen der Anwendung zur Folge haben kann.

    er bleibt bei der initialisierung stehn : Form1 frm = new Form();

    das oben beschriebene Problem mit den Matrizen und vertex besteht aber immer noch!

    irgend ein rat?

    Gruss Trider



  • Die von dir beschriebene Meldung ist ein Bug in MDX, der aber nur beim Debuggen auftritt. Du kannst in VS den LoaderLock Assistant ausstellen, um den Hinweis zu unterdrücken (Debug -> Exceptions).

    Die dll's die ich erwähnte sind : Microsoft.DirectX.dll, Microsoft.DirectX.Direct3D.dll, Microsoft.DirectX.Direct3DX.dll.

    Wie gesagt. Du hast MDX auf dem Zielrechner nicht installiert.



  • muss ich das komplette sdk auf dem zielrechner auch installieren? das wäre ja echt böse platzverschwendung (hab nicht viel).MDX = Managed DirectX. gibt es da ein spezielles MDX für windows was kleiner ist? das SDK das ich mit vs8 benutze hat 500 MB und installiert keine ahnung. gibt es da eine abgespeckte version die nicht so gross ist, die aber ausreicht um den code auszuführen? oder kann man die benötigten dll's einfach in einem extra ordner einfach mitliefern?

    Gruss Trider



  • Es gibt das MDX Redistributable zum herunterladen bei MS oder beim SDK dabei (wenn man es mitinstalliert).


Anmelden zum Antworten