Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Techie

Alter Hase

  • »Techie« ist der Autor dieses Themas

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

1

21.07.2013, 14:03

C# OOP Problem

Hi,

ich habe gerade ein Problem mit einer C# Klasse.
Ein Code spricht mehr als 1000 Worte:

LowSys.cs:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;

using System.Diagnostics;

using System.Runtime.InteropServices;



//namespace LowSys{

    public struct PROCESS_INFORMATION{

        public IntPtr   hProcess;

        public IntPtr   hThread;

        public uint     dwProcessId;

        public uint     dwThreadId;

    };



    public struct STARTUPINFO{

        public uint     cb;

        public string   lpReversed;

        public string   lpDesktop;

        public string   lpTitle;

        public uint     dwX;

        public uint     dwY;

        public uint     dwXSize;

        public uint     dwYSize;

        public uint     dwXCountChars;

        public uint     dwYCountChars;

        public uint     dwFillAttribute;

        public uint     dwFlags;

        public short    wShowWindow;

        public short    cbReseved32;

        public IntPtr   lpReversed32;

        public IntPtr   hStdInput;

        public IntPtr   hStdOutput;

        public IntPtr   hStdError;

    };



    public struct SECURITY_ATTRIBUTES{

        public int      nLength;

        public IntPtr   lpSecurityDescriptor;

        public bool     bInheritedHandle;

    };



    public class LowAPI{

        [DllImport("kernel32.dll")]

        static extern bool CreateProcessW(  string  lpApplicationName,

                                            string  lpCommandLine, 

                                            IntPtr  lpProcessAttributes,

                                            IntPtr  lpThreadAttributes,

                                            bool    bInheritHandles,

                                            uint    dwCreationFlags,

                                            IntPtr  lpEnvironment,

                                            string  lpCurrentDirectory,

                                            ref     STARTUPINFO lpStartupInfo,

                                        out PROCESS_INFORMATION lpProcessInformation );

    };

//};


Main.cs:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;

using System.Diagnostics;

using System.Runtime.InteropServices;

// using LowSys;



namespace Programm{

    public class Test1{

        public static void Main(){

            STARTUPINFO sInfo = new STARTUPINFO ();

            PROCESS_INFORMATION sPInfo = new PROCESS_INFORMATION ();

            LowAPI.CreateProccess ("C:\\WINDOWS\\SYSTEM32\\Calc.exe",

                                   null,

                                   IntPtr.Zero,

                                   IntPtr.Zero,

                                   false,

                                   0,

                                   IntPtr.Zero,

                                   null,

                                   ref sInfo,

                                   out sPInfo);

            Console.ReadLine();

        }

    }

}


Ich kann CreateProccess nicht aufrufen, da dieses angeblich nicht vorhanden ist.
Leider habe ich keine Ahnung was ich falsch mache. ( Ich habe noch nicht gerade viel mit C# gemacht und Syntax sitzt bei mir auch noch nicht ganz richtig :( )

Kann mir da jemand helfen?

Gruß Techie
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

21.07.2013, 14:11

und wie sieht es mit CreateProccessW aus?

nur so nebenbei: was sollen die ganzen Variablen denn bedeuten? da hätte man durchaus bessere Namen wählen können, als cb oder dwFlags...
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

3

21.07.2013, 14:23

Pack die Klasse und die Structs dazu mal in einen Namespace ;)

@Sacaldur: Das sind die Bezeichner der Funktion wie sie in der WinAPI nunmal benutzt werden.

benjs

Frischling

Beiträge: 19

Beruf: Schüler

  • Private Nachricht senden

4

21.07.2013, 18:40

Mach bei dem static extern bool CreateProcessW( [...] ) ein public davor, dann sollte es funktionieren :)
Wenn du einfach nur einen Prozess starten willst, kannst du auch die Process.Start()-Methode aus der System.Diagnostics.Process-Klasse aufrufen.

MfG, benjs

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

21.07.2013, 20:02

Bitte auch mal eine Seite zu Struct-Layout und Marshalling besuchen. Solche Struct-Definitionen sind schön, können aber schnell Stress bedeuten. Auch sollten man aufpassen, dass man solche als Referenz übergebenen Daten auf jeden Fall fixed macht, denn verlagert der GC den Speicherort einfach, dann gibt's tierisch Stress und man weiß nicht wieso.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

De_Struktor

unregistriert

6

21.07.2013, 20:56

Eine Frage, im voraus sry wenn nicht angebracht, aber kann man nicht für solche API Zugriffscodes, wie sie bei Techie vorliegen, nicht auch in enums packen, wäre das machbar??

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

22.07.2013, 03:11

Ich würde auch zu den gekapselten API Funktionen raten. Das .Net Framework erledigt dann alles für dich. Damit machst du es dir um einiges einfacher. In solchen Fällen am besten erst mal Google besuchen und dort gucken. Oft gibt es bei C# schon fertige einfachere Lösungen für solche Geschichten. Damit kannst du dir eine Menge Arbeit und Frust ersparen.

edit:
@De_Struktor: Das sollte meines Wissens eigentlich nicht machbar sein. Habe es selbst noch nicht versucht, aber aus reiner Intuition sage ich mal nein;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

De_Struktor

unregistriert

8

22.07.2013, 11:25

Ok danke schorsch :-)

Werbeanzeige