Compartilhar via


/CLRSUPPORTLASTERROR (Preservar o último código de erro para chamadas PInvoke)

/CLRSUPPORTLASTERROR, que está ativado por padrão, preserva o último código de erro das funções chamadas por meio do mecanismo P/Invoke, que permite chamar funções nativas em DLLs, a partir do código compilado com /clr.

Sintaxe

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Comentários

Preservar o último código de erro implica em diminuição no desempenho. Se você não quiser incorrer no custo de desempenho de preservar o último código de erro, vincule usando /CLRSUPPORTLASTERROR:NOo .

Você pode minimizar a penalidade de desempenho vinculando com /CLRSUPPORTLASTERROR:SYSTEMDLL, que preserva apenas o último código de erro para funções em DLLs do sistema.

Observação

Não há suporte para preservar o último erro para funções não gerenciadas que são consumidas pelo código CLR no mesmo módulo.

Para definir esta opção do vinculador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para mais informações, consulte Definir propriedades de build e do compilador.

  2. Selecione a página de propriedades Propriedades da Configuração>Vinculador>Avançado.

  3. Modifique a propriedade Preservar o último código de erro para chamadas PInvoke. Escolha OK ou Aplicar para salvar as alterações.

Para definir esta opção do vinculador por meio de programação

Exemplos

O exemplo a seguir define uma DLL nativa com uma função exportada que modifica o último erro.

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

O exemplo a seguir consome a DLL, demonstrando como usar /CLRSUPPORTLASTERRORo .

// 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).

Confira também

Referência de vinculador MSVC
Opções do vinculador MSVC