Ist P / Invoke auf 64-Bit-Windows erfordern unterschiedliche Signaturen als auf 32-Bit?

StackOverflow https://stackoverflow.com/questions/1426286

  •  07-07-2019
  •  | 
  •  

Frage

Wenn ich eine Signatur, die zum Beispiel auf user32.dll verweist soll ich dies mit user64.dll bauen, wenn das Ziel ein Computer 64-Bit ist?

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(
    IntPtr hWndRemove,
    IntPtr hWndNewNext);

Zur Zeit ist dies kein Problem, da ich nur 32-Bit aufgrund einer Bibliothek eines Anbieters (Progress Openedge) Targeting, die nur 32-Bit-Bibliotheken zur Verfügung stellen, um ihre Datenbank zugreifen zu können.

Ich habe keine Zeit habe einen 64-Bit-Windows-Computer, um zu sehen, ob dies der Fall ist.

War es hilfreich?

Lösung

Trotz der Namenskonvention, user32.dll (und andere 32 ... DLLs) sind tatsächlich 64-Bit auf 64-Bit-Maschinen. Dies sind die historischen Namen für den DLLs, und haben auf diese Weise unabhängig von den Änderungen an die zugrunde liegende Architektur gehalten. Haben Sie einen Lese von dieser Seite, um weitere Details zu erhalten.

Andere Tipps

Sie sollten nicht ist die Unterschrift / Name der DLL ändern, die Sie verknüpfen, wenn sie USER32.DLL Funktionen aufrufen in.

Trotz der Namenskonvention, auf einer 64-Bit-Windows-Maschine, die USER32.DLL-Datei, die in sitzt [Windows] \ System32 ist eigentlich ein 64-Bit-DLL. Die real 32-Bit-Version von USER32.DLL sitzt tatsächlich in einem Ordner namens [Windows] \ SysWow64.

Bitte finden Sie unter diese Frage weitere Informationen.

Das einzige, was Sie wahrscheinlich am meisten vorsichtig sein müssen, ist die Datentypen, die Sie als Parameter für die verschiedenen Windows-API-Funktionen übergeben. Zum Beispiel hat die „Sendmessage“ -Funktion innerhalb USER32.DLL eine spezifische Anforderung mit mindestens einem seiner Parameter (nach dem Seite auf P / Invoke ).

Es ist Signatur:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

und stellt fest, 2 & 3 unten klar Zustand:

  

2) NIEMALS "int" oder "integer", wie   lParam. Ihr Code wird auf 64-Bit-Absturz   Fenster. verwenden NUR IntPtr, eine „ref“   Struktur oder eine "out" Struktur.

     

3) NIE "Bool" verwenden, "int", oder   „Integer“ als Rückgabewert. Ihre   Kern auf 64-Bit-Windows zum Absturz bringen.   NUR IntPtr verwenden. Es ist nicht sicher zu bedienen   Bool - pinvoke kann ein nicht Marschall   IntPtr zu einem boolean.

Dieser „Vorbehalt“ erscheint auf diese spezielle Funktion (Sendmessage) spezifisch zu sein, auch wenn es etwas, was ich besondere Aufmerksamkeit beim Aufruf in jeder Windows-API-Funktionen.

zahlen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top