2015-11-27 1 views
0

Dans une DLL pour la plate-forme cible .NET 3.5 écrite en C#, je vais utiliser la fonction non managée CMP_WaitNoPendingInstallEvents. Comme décrit dans la documentation, cette méthode renvoie les valeurs WAIT_OBJECT_0, WAIT_TIMEOUT et WAIT_FAILED définies dans le fichier winbase.h. Je dois vérifier cette valeur de retour de C# et passer à l'action.Appel de code non géré à partir de C# et vérification de la valeur retournée avec des constantes connues

Comment puis-je comparer la valeur renvoyée avec les constantes définies dans winbase.h à partir de C#?

Répondre

1

dans winnt.h

#define STATUS_WAIT_0  ((DWORD)0x00000000L) 

dans winbase.h

#define WAIT_OBJECT_0  ((STATUS_WAIT_0) + 0) 
#define WAIT_FAILED   ((DWORD)0xFFFFFFFF) 

et winerror.h

#define WAIT_TIMEOUT  258L // dderror 

Vous devez définir ces constantes vous-même. Pour utiliser directement les constantes dans les fichiers d'en-tête Windows, vous pouvez implémenter une bibliothèque statique C++ pour renvoyer leurs valeurs, mais cela ne sert à rien car elle produira le même résultat car les valeurs constantes seront de toute façon inliées.

[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CMP_WaitNoPendingInstallEvents", CharSet = CharSet.Auto)] 
public static extern uint CMP_WaitNoPendingInstallEvents(uint TimeOut); 

private const uint WAIT_OBJECT_0 = 0x0; 
private const uint WAIT_TIMEOUT = 0x102; 
private const uint WAIT_FAILED = 0xFFFFFFFF; 

Devrions PInvoke:

uint result = CMP_WaitNoPendingInstallEvents(1000); 
switch (result) 
{ 
    case WAIT_OBJECT_0: 
     break; 
    case WAIT_TIMEOUT: 
     break; 
    case WAIT_FAILED: 
     break; 
}