/CLRSUPPORTLASTERROR (Conserver le dernier code d’erreur pour les appels PInvoke)

/CLRSUPPORTLASTERROR, qui est activé par défaut, conserve le dernier code d’erreur des fonctions appelées via le mécanisme P/Invoke, ce qui vous permet d’appeler des fonctions natives dans DLLS, à partir de code compilé avec /clr.

Syntaxe

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Notes

La conservation du dernier code d’erreur implique une diminution des performances. Si vous ne souhaitez pas entraîner le coût de performances de conservation du dernier code d’erreur, liez-le à l’aide /CLRSUPPORTLASTERROR:NOde .

Vous pouvez réduire la pénalité de performances en liant avec /CLRSUPPORTLASTERROR:SYSTEMDLL, qui conserve uniquement le dernier code d’erreur pour les fonctions dans les DLL système.

Remarque

La conservation de la dernière erreur n’est pas prise en charge pour les fonctions non managées consommées par le code CLR dans le même module.

Pour définir cette option de l'éditeur de liens dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriétés du projet. Pour plus d’informations, consultez Définir les propriétés du compilateur et de la génération.

  2. Sélectionnez la page de propriétés Avancées de l’Éditeur >de propriétés>de configuration.

  3. Modifiez le dernier code d’erreur pour la propriété PInvoke Calls . Choisissez OK ou Appliquer pour enregistrer vos modifications.

Pour définir cette option de l'éditeur de liens par programmation

Exemples

L’exemple suivant définit une DLL native avec une fonction exportée qui modifie la dernière erreur.

// CLRSUPPORTLASTERROR_dll.cpp
// compile with: /LD
#include <windows.h>
#include <math.h>

#pragma unmanaged
__declspec(dllexport) double MySqrt(__int64 n) {
   SetLastError(DWORD(-1));
   return sqrt(double(n));
}

L’exemple suivant utilise la DLL, montrant comment utiliser /CLRSUPPORTLASTERROR.

// CLRSUPPORTLASTERROR_client.cpp
// compile with: /clr CLRSUPPORTLASTERROR_dll.lib /link /clrsupportlasterror:systemdll
// processor: x86
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <math.h>

#pragma comment(lib, "wininet.lib")

double MySqrt(__int64 n);

#pragma managed
int main() {
   double   d = 0.0;
   __int64 n = 65;
   HANDLE  hGroup = NULL;
   GROUPID groupID;
   DWORD   dwSet = 127, dwGet = 37;

   SetLastError(dwSet);
   d = MySqrt(n);
   dwGet = GetLastError();

   if (dwGet == DWORD(-1))
      printf_s("GetLastError for application call succeeded (%d).\n",
             dwGet);
   else
      printf_s("GetLastError for application call failed (%d).\n",
             dwGet);

   hGroup = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL,
                           0, 0, &groupID, 0);
   dwGet = GetLastError();
   if (dwGet == 183)
      printf_s("GetLastError for system call succeeded (%d).\n",
             dwGet);
   else
      printf_s("GetLastError for system call failed (%d).\n",
             dwGet);
}
GetLastError for application call failed (127).
GetLastError for system call succeeded (183).

Voir aussi

Informations de référence sur l’éditeur de liens MSVC
Options de l’éditeur de liens MSVC