C# Portability von "CreateMutex"

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,
bräuchte mal wieder etwas hilfe, da ich nicht weiter weis.

Ich benutzer in meinem Programm die WinApi Funktion CreateMutex um z.B. bei einer Deinstallation des Programms festzustellen ob die Anwendung gerade ausgeführt wird.

Falls ja, dann soll sie erst geschlossen werden, bevor man mit der Deinstallation fortfahren kann.

Nun... es funktioniert auch alles soweit, bin eigentlich ganz zufrieden, aber jetzt hab ich die exe mal durch "Microsofts FxCop" durchjagen lassen und siehe da... mir wird folgender Hinweis ausgespuckt:

"P/Invoke declarations should be portable"


Mein DllImport im Programm sieht folgendermaßen aus:

Code:
[DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, StringBuilder lpName);


Jetzt begreife ich jedoch echt nicht was ich da noch tun soll? Ich hatte mal bei nem anderen Import diese Meldung, aber dort hat es geholfen, dass ich die "int" Paramter durch "IntPtr" ersetzt habe! Hier jedoch hab ich schon alles probiert und es funktioniert immernoch nicht. Die Meldung erscheint mir trotzdem immer und immer wieder.

Hoffe ihr könnt mir da mal weiterhelfen.

Danke schon mal im Vorraus!
 
Soweit ich weiß, ist IntPtr ein generischer Zeiger, was in C# ja sowieso ziemlich eingeschränkt ist (unsafe). Versuch es statt dessen mal mit LPStruct, das sollte laut Docs der richtige Typ für C-Strukturen sein... Ist aber ein Schnellschuss, weiß nicht, ob es funktioniert...
 
Hmm... ich kann mich zwar nicht mehr erinnern wo ich das gelesen hab, aber da wurde eigentlich ausdrücklich der StringBuilder empfohlen... Ich probiers aber mal kurz mit string.
Ergänzung ()

Ok... also mit string ist die Meldung leider immernoch da...

@BrainFart: was meinst du mit LPStruct genau?
Ergänzung ()

Also allem anschein nach hats nun geklappt. Danke allen für die Hilfe. Es lag wohl tatsächlich allein am bool Paramter.

Hier nochmals für alle der richtige Import der CreateMutex Funktion:

Code:
[DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
internal static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, 
	[MarshalAs(UnmanagedType.Bool)] bool bInitialOwner, StringBuilder lpName);
 
in meinem original-post hab ich zwar den bool-parameter angesprochen, aber davon war ich weit entfernt... :-)
 
Tja... ich bin da auch nur draufgekommen, weil ich dann beim FxCop dann die beschreibung von dem Fehler gelesen hab... da wurde dann "bInitialOwner" erwähnt und ich wusste nicht ob man das direkt vor den Paramter das "MarshalAs" stellen kann.

Habs dann einfach mal probiert und siehe da... hat funktioniert :D

Danke aber vielmals :)
 

Ähnliche Themen

Antworten
3
Aufrufe
2.419
1
Zurück
Oben