Laden...

Probleme mit Typ/Namespace/DLLImport

Erstellt von -acid- vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.784 Views
-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 19 Jahren
Probleme mit Typ/Namespace/DLLImport

Hallo,

ich binde hiermit die shell32.dll ein und habe mit der nächsten Zeile Probleme. Der Namespace LPCVOID konnte nicht gefunden werden...

Hier der Code:

[DllImport("shell32.dll")]
public static void SHChangeNotify(long wEventId, uint uFlags, LPCVOID dwItem1, LPCVOID dwItem2);

Meine Vermutung ist, dass der Namspace fehlt aber ich weiss nicht welchen ich einbinden muss. Nur damit ihr wisst was ich vorhabe:

Ich möchte gerne die Funktion SHChangeNotify ausführen (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shchangenotify.asp).

N
4.644 Beiträge seit 2004
vor 19 Jahren
[DllImport("shell32.dll")]
public static extern void SHChangeNotify(long wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 19 Jahren

kurz und bündig g danke.

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 19 Jahren

würde halt auch gerne wissen was das extern und IntPtr soll. einfach um was zu lernen.

N
4.644 Beiträge seit 2004
vor 19 Jahren

Ich zeige Dir mal die Zitate der SDK:

Der Typ IntPtr ist als ganzzahliger Typ mit plattformabhängiger Größe konzipiert. Das heißt, dass es sich bei 32-Bit-Hardware und 32-Bit-Betriebssystemen i. d. R. um eine 32-Bit-Instanz dieses Typ handelt und bei 64-Bit-Hardware und 64-Bit-Betriebssystemen um eine 64-Bit-Instanz des Typs.

Der Typ IntPtr kann von Sprachen, die Zeiger unterstützen, verwendet werden sowie als gemeinsame Methode zur Darstellung von Verweisen auf Daten zwischen Sprachen, die Zeiger unterstützen, und solchen, die keine Zeiger unterstützen.

IntPtr-Objekte können auch dazu verwendet werden, Handles zu enthalten. Instanzen von IntPtr werden z. B. häufig in der System.IO.FileStream-Klasse verwendet, damit sie Dateihandles enthalten.

Im Gegensatz zum Typ UIntPtr ist der Typ IntPtr CLS-kompatibel. In der Common Language Runtime wird nur der IntPtr-Typ verwendet. Der UIntPtr-Typ wird hauptsächlich aus Gründen der Systemsymmetrie zum IntPtr-Typ bereitgestellt.

In einer Methodendeklaration kann mit dem extern-Modifizierer angegeben werden, dass die Methode extern implementiert wird. Der extern-Modifizierer wird häufig mit dem DllImport-Attribut verwendet.

Hoffe es hilft Dir.

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 19 Jahren

@Noodles:

Ich komme leider nicht weiter, deswegen nochmal mein Code:

[DllImport("shell32.dll")]
public static extern void SHChangeNotify(long wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);

Die Funktion wird bei nem Event ausgelöst:

SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,null,null);

Ich ändere vorher die Datei-Endung und will das System dadurch "informieren". Leider kommt die Meldung das die ersten 2 Parameter der Funktion nicht in der Klasse bestehen. Habe auch schon versucht Konsten draus zu machen doch leider weiss ich nicht was diese potentiellen Konstaten dann für einen Wert haben müssen. Also entweder habe ich etwas falsch verstanden oder nen Code-Fehler gemacht... Vielleicht kann mir ja jemand weitehelfen.

Danke schonmal.

N
4.644 Beiträge seit 2004
vor 19 Jahren

Scham mal hier, vielleicht hilft es Dir.

M
38 Beiträge seit 2004
vor 19 Jahren

der fehler besagt doch lediglich, dass die ersten 2 paramater, also in dem fall SHCNE_ASSOCHANGED und SHCNF_IDLIST nicht definiert sind...
du solltest also vorhin mit den 2 zeilen
logn SHCNE_ASSOCHANGED;
uint SHCNF_IDLIST;
die beiden variablen definiern...
dann könnts gehn
wenns n anderes problem war, dann sorry für meine unfähigkeit ^^

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 19 Jahren

Also es funktioniert. Für alle die es interessiert. Hier der Code um die Registry zu "informieren":

[DllImport("shell32.dll")]
private static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
private const int SHCNE_ASSOCCHANGED = 0x08000000;
private const int SHCNF_IDLIST = 0;

Auslösen der Funktion zb. durch ein Event:
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,IntPtr.Zero,IntPtr.Zero);

Danke an alle.