2011-06-17 1 views
2

Notre application est récemment passée de .net 3.5 à .net 4. Un problème qui s'est produit est que GetWindowThreadProcessId ne fonctionne plus.Récupère l'identificateur de processus à partir d'un descripteur de fenêtre sans GetWindowThreadProcessId (C# .net 4.0)

Microsoft dispose d'un correctif disponible, mais il serait difficile de l'installer sur chaque machine client et cela pourrait poser d'autres problèmes. Je préférerais un travail autour.

http://support.microsoft.com/kb/982638

Le problème est, comme décrit par Microsoft.

« Dans un .NET Framework application Remoting, vous avez un objet MarshalByRefObject Cet objet contient une méthode qui retourne un type IntPtr. Lorsque l'objet est sérialisé, une exception SerializationException est levée et le message d'erreur suivant s'affiche: Code de type non valide dans le flux 'Invalid' Ce problème se produit car le code distant traite un type IntPtr comme un type primitif quand le e CLR sérialise IntPtr. Cependant, le code d'accès distant traite plus tard le type IntPtr comme un type non valide lorsque le formatter binaire sérialise IntPtr. »

Alors, est-il une alternative? Y at-il une autre façon pour moi d'obtenir un identifiant de processus à partir d'un handle de fenêtre? Ou puis-je rassembler mon IntPtr différemment pour éviter ce bug?

Répondre

1

avez-vous essayez de remplacer la valeur de retour avec un vide? (Parce que je pense que vous n'avez pas besoin de l'ID de fil)

[DllImport("user32.dll", SetLastError=true)] 
static extern void GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 

au lieu de:

[DllImport("user32.dll", SetLastError=true)] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); 
Questions connexes