Laden...

Windows API-Programmierung (generelles API-Problem?)

Erstellt von wucher wichtel vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.222 Views
w
wucher wichtel Themenstarter:in
18 Beiträge seit 2007
vor 14 Jahren
Windows API-Programmierung (generelles API-Problem?)

Hallo zusammen!

Ich habe eine Frage zum Thema API-Programmierung: Ich wollte etwas zur API-Programmierung unter .NET lernen. Allerdings funktioniert das nicht so, wie ich mir das vorgestellt habe 🙂

Auf der Seite http://www.pinvoke.net/ werden die meisten (?) Windows API-Befehle aufgezählt und manche haben eine genaue Beschreibung dabei.

Bsp1:
[DllImport("user32.dll", SetLastError = true)]
static extern void EndTask(IntPtr hWnd);

Bei diesem Beispiel ist das Problem, dass ich keine Ahnung habe, was ich als Übergabeparameter übergeben soll (was ist 'IntPtr hWnd' und was sind gültige Werte dafür?).

Bsp2:
[DllImport("winmm.dll")]
static extern Int32 mciSendString(String command,
StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);

Hier gibt es Beispiel-Code. Das bedeutet ich habe für 2 Beispiele gültige Werte für die Übergabeparameter. Aber es gibt doch sicher noch mehr, oder?

Bsp3:
[DllImport("advapi32.dll", SetLastError=true)]
static extern TODO ShutDown(TODO);

Hier bekomme ich nicht mal gesagt, wie viele (bzw. welche) Parameter ich übergeben muss.

Meine Frage lautet: Wie kann ich herausbekommen, was für Parameter ich an die API-Befehle übergeben muss, damit das ganze funktioniert?

Vielen Dank für hilfreiche Antworten!
Viele Grüße

3.971 Beiträge seit 2006
vor 14 Jahren
  1. hWnd schreit nach einem Handle für ein Windows-Form
  2. Ich kenne deine Beispiele nicht, aber mciSendString sendet einen Befehl an die Audio/Video-Wiedergabe von Windows ab 3.1.
  • command ist der Befehl den du sendest
  • buffer ist ein Char-Array, wo von der Funktion vorrausichtlich Daten hineingeschrieben werden (ist mit string nicht möglich)
  • BufferSize ist die größe des übergebenes buffer-Char-Array (wichtig, der Stringbuilder muss mind. so groß sein wie BufferSize)
  • hwndCallback ist wieder ein Händle für ein Windows-Control. Denke dort wird das Video abgespielt
  1. Du brauchst die genaue C Funktion, sonst kannst du diese nicht aufrufen, bzw. in C# deklarieren. Die Funktion findest du in der entsprechende Header-Datei advapi32.h

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

w
wucher wichtel Themenstarter:in
18 Beiträge seit 2007
vor 14 Jahren

Hi!

Vielen Dank für deine Antwort!

Wo finde ich die Header-Dateien? Ich habe gerade die Windowssuche laufen lassen, aber er hat nichts gefunden. Die 'dll' findet er im system32-Ordner.

viele Grüße

3.971 Beiträge seit 2006
vor 14 Jahren

Auf deinen Rechner werden nur die kompilierten DLLs liegen. Für die Headerdateien musst du Visual Studio C++ installiert haben (oder ein entsprechendes SDK).

Ansonsten findest du unter MSDN: Windows API Reference die komplette Doku für die Windows-API

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

915 Beiträge seit 2006
vor 14 Jahren

Hrm, ich glaube am besten kann das Microsoft selbst erklären 🙂

*Die kleinen Tricks und Kniffe liegen eigentlich immer bei der Namensgebung.
Steht irgendwo hWnd weist du, das hier ein Handle übergeben musst von z.b. einem Steuerelement, einer Form oder eines Controls usw.

*Wenn du Namen wie hwndCallback siehst, weisst du automatisch, ah hier muss der Funktionszeiger zurückgegeben werden.

*Großgeschriebene Namen wie TODO geben meistens an das es sich um eine Struktur oder ein Enum handelt. Wenn man Groß und Kleingeschriebene Namen ließt wie WindowsMessages weis man das es sich in der Regel nur um Enum’s handelt und nicht um Strukturen.

(* Edit: Eine Faustregel ist das ganze nicht!)

Wenn man sich unsicher ist wo man nun die genauen Strukturen oder Enum’s dann herbekommt und unter www.pinvoke.net nichts findet. So kann man anhand des DLL Namen ermitteln wo man genau nachschauen muss. Die user32.dll ist eine Client-DLL von Windows und somit weis man, ah ich muss für nähere Informationen also in der Windows API Dokumentation nachsehen was genau gebraucht wird. Wenn der Name irgendwie komisch sein sollte oder auf pinvoke nicht auffindbar so weis man das es sich evtl. um eine Fremde API handelt die z.B. dafür verwendet wird irgend etwas anzusteuern. Hier hilft dann die Dokumentation des Fremdanbieters weiter, oder der Kollege der vielleicht diese DLL geschrieben hat.

Natürlich kann es auch sein das beim Import einer DLL plötzlich mal „int hwndCallback“ oder gleich „delegate hwndCallback“ da steht, dennoch bleibt es ein Funktionszeiger – die Schreibweise kann somit also variieren genauso wie der Namen. Dennoch denke ich das in der Regel der Importname aus der Doku wie aus pinvoke in der Regel aussagekräftig genug ist um klar werden zu lassen, was man übergeben muss.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

w
wucher wichtel Themenstarter:in
18 Beiträge seit 2007
vor 14 Jahren

Hi!

Vielen vielen Dank für eure Antworten!
Ich glaube ich habe das meiste verstanden 🙂)

Eine Frage bleibt allerdings: Ich finde keine Beschreibung zu ShutDown auf MSDN. Warum? In der Liste der API-Befehle steht unter 'S' nichts von ShutDown. Was mache ich in diesem Fall?

Und was meinst du, Andreas, mit einer Struktur (bei TODO)?

Nochmals vielen Dank für alles!

3.971 Beiträge seit 2006
vor 14 Jahren

Die Funktion heißt Beispielsweise ExitWindowsEx(). Wichtig ist, in der Windows-NT Linie (NT, 2000, XP, Vista) brauchst du vorher einen Sicherheitstoken, die prüft, ob der aktuelle Benutzer das auch wirklich ausführen darf

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

w
wucher wichtel Themenstarter:in
18 Beiträge seit 2007
vor 14 Jahren

Okay, danke schön!

Kann man das irgendwie rausbekommen, dass die Funktion anders heißt oder muss man das wissen? 🙂

3.971 Beiträge seit 2006
vor 14 Jahren

Wenn du auf der Straße den Heinz mit Egon ansprichst, ist die wahrscheinlichkeit sehr gering das Heinz antwortet. Du musst schon wissen das Heinz Heinz heißt. 😉 Ansonsten google ist dein freund

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

w
wucher wichtel Themenstarter:in
18 Beiträge seit 2007
vor 14 Jahren

okay, jetzt ist alles klar 🙂

morgen versuche ich mich noch weiter am Programmieren.

Danke schön!!