Sdílet prostřednictvím


/CLRSUPPORTLASTERROR (Zachování kódu poslední chyby pro volání PInvoke)

/CLRSUPPORTLASTERROR, který je ve výchozím nastavení zapnutý, zachovává poslední kód chyby funkcí volaných prostřednictvím mechanismu P/Invoke, který umožňuje volat nativní funkce v knihovně DLLS, z kódu zkompilovaného pomocí /clr.

Syntaxe

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Poznámky

Zachování posledního kódu chyby znamená snížení výkonu. Pokud nechcete, aby se náklady na výkon zachovaly při zachování posledního kódu chyby, použijte odkaz ./CLRSUPPORTLASTERROR:NO

Snížení výkonu můžete minimalizovat propojením , /CLRSUPPORTLASTERROR:SYSTEMDLLkterý zachovává pouze poslední kód chyby pro funkce v systémových knihovnách DLL.

Poznámka:

Zachování poslední chyby není podporováno pro nespravované funkce, které kód CLR využívá ve stejném modulu.

Nastavení tohoto parametru linkeru ve vývojovém prostředí sady Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Další informace naleznete v tématu Nastavení vlastností kompilátoru a sestavení.

  2. Vyberte stránku vlastností linkeru>>Konfigurace Upřesňující vlastnost.

  3. Upravte vlastnost Zachovat poslední kód chyby pro volání PInvoke. Změny uložíte kliknutím na OK nebo Použít .

Programové nastavení tohoto parametru linkeru

Příklady

Následující ukázka definuje nativní knihovnu DLL s jednou exportovanou funkcí, která upravuje poslední chybu.

// 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));
}

Následující ukázka využívá knihovnu DLL, která demonstruje způsob použití /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).

Viz také

Referenční zdroje k linkeru MSVC
Možnosti linkeru MSVC