int vs IntPtr, wenn Sie ein handle?
Zuerst eine hintergrund-Frage:
Im Allgemeinen, was ist der Unterschied zwischen int
und IntPtr
? Meine Vermutung ist, dass es ein Tatsächliches Objekt, sondern als ein Wert wie ein int
oder byte
ist. Angenommen, das ist wahr:
Also Sie sind nicht das gleiche. Dennoch sehe ich Griffe vertreten als die beiden.
- IntPtr:
Control.Handle
-
int (oder uint): Ein PInvoke kann eingestellt werden, um eine
int
und es funktioniert Prima:[DllImport("coredll.dll", SetLastError = true)] public static extern int GetForegroundWindow(); private string GetActiveWindow() { const int nChars = 256; int handle = 0; StringBuilder Buff = new StringBuilder(nChars); handle = CoreDLL.GetForegroundWindow(); if (CoreDLL.GetWindowText(handle, Buff, nChars) > 0) { return Buff.ToString(); } return ""; }
So, int
vs IntPtr
? Spielt es eine Rolle, für die Griffe? Können Sie entweder?
Du musst angemeldet sein, um einen Kommentar abzugeben.
int
ist 32 bit lang.IntPtr
ist so lang wie ein pointer, die für Ihre Architektur. Daher wird ein Zeiger gespeichert werden können in eineint
nur auf 32-bit-Systemen, während es immer werden gespeichert, in einerIntPtr
.Feststellen, dass Ihre "int" als return-Wert" Beispiel nicht Verwendung eines
int
zu halten, ein Zeiger, aber nur, um halten Sie einen numerischen Wert ein. Dies bedeutet nicht, dass einint
wird automatisch die richtige Größe obwohl: der Autor, dass P/Invoke-Signatur sollte gegangen, um die Dokumentation fürGetForegroundWindow
und sehen, dass es gibt eineHWND
.Dann, aus
windef.h
im Plattform-SDK (oder dieser MSDN-Seite) können wir sehen, dass eineHWND
ist einHANDLE
was ist einPVOID
ist... ein Zeiger!Deshalb, so weit wie ich kann sagen, dass die Signatur ist falsch, wie die Größe der Rückgabewert von
GetForegroundWindow
hängt von der Architektur. Also, es sollte auch einIntPtr
.Update:
Während es sein kann, abgeleitet aus dem oben, denke ich lohnt es sich, explizit darauf hingewiesen, dass:
int
stattIntPtr
im 32-bit-Anwendungen wird nie ein problem verursachen, auch wenn Sie auf 64-bit-Windows, da die meisten Anwendungen sind 32-bit-an diesem Punkt in der Zeit, das wird lassen Sie Weg, solche Fehler sehr oft.int
stattIntPtr
im 64-bit-Anwendungen ist nicht garantiert zu Problemen führen, da es durchaus möglich ist, dass in der Praxis die Werte festgestellt werden, passen in die 32 bits derint
. Dieses weitere verringert die Wahrscheinlichkeit, dass ein Fehler manifestiert sich darin, dass ein application-Fehler.Daher für einen Fehler, tatsächlich manifestieren, gibt es drei Bedingungen, die erfüllt sein müssen zur gleichen Zeit:
int
wird dort eingesetzt, wo einIntPtr
werden sollte.int
ist tatsächlich größer als 32 bit.