Aracılığıyla paylaş


/CLRSUPPORTLASTERROR (PInvoke Çağrıları için Son Hata Kodunu Koru)

/CLRSUPPORTLASTERROR, varsayılan olarak açıktır, ile derlenen /clrkoddan DLLS'de yerel işlevleri çağırmanıza olanak tanıyan P/Invoke mekanizması aracılığıyla çağrılan işlevlerin son hata kodunu korur.

Sözdizimi

/CLRSUPPORTLASTERROR
/CLRSUPPORTLASTERROR:NO
/CLRSUPPORTLASTERROR:SYSTEMDLL

Açıklamalar

Son hata kodunun korunması performansta düşüş anlamına gelir. Son hata kodunu korumanın performans maliyetini doğurmak istemiyorsanız, bağlantısını kullanarak bağlayın /CLRSUPPORTLASTERROR:NO.

ile bağlantı ekleyerek /CLRSUPPORTLASTERROR:SYSTEMDLLperformans cezasını en aza indirebilirsiniz. Bu, sistem DLL'lerindeki işlevler için yalnızca son hata kodunu korur.

Dekont

Aynı modülde CLR kodu tarafından kullanılan yönetilmeyen işlevlerde son hatanın korunması desteklenmez.

Visual Studio geliştirme ortamındaki bu bağlayıcı seçeneğini ayarlamak için

  1. Proje için Özellik Sayfaları iletişim kutusunu açın. Daha fazla bilgi için bkz . Derleyici ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>Bağlayıcısı>Gelişmiş özellik sayfasını seçin.

  3. PInvoke Çağrıları için Son Hata Kodunu Koru özelliğini değiştirin. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.

Bu bağlayıcı seçeneğini program aracılığıyla ayarlamak için

Örnekler

Aşağıdaki örnek, son hatayı değiştiren dışarı aktarılan bir işleve sahip yerel DLL'yi tanımlar.

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

Aşağıdaki örnek DLL'yi kullanır ve nasıl kullanılacağını /CLRSUPPORTLASTERRORgösterir.

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

Ayrıca bkz.

MSVC bağlayıcı başvurusu
MSVC bağlayıcı seçenekleri