/CLRSUPPORTLASTERROR
(PInvoke Çağrıları için Son Hata Kodunu Koru)
/CLRSUPPORTLASTERROR
, varsayılan olarak açıktır, ile derlenen /clr
koddan 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:SYSTEMDLL
performans cezasını en aza indirebilirsiniz. Bu, sistem DLL'lerindeki işlevler için yalnızca son hata kodunu korur.
Not
Aynı modülde CLR kodu tarafından kullanılan yönetilmeyen işlevlerde son hatanın korunması desteklenmez.
- Daha fazla bilgi için bkz
/clr
. (Ortak Dil Çalışma Zamanı Derlemesi).
Visual Studio geliştirme ortamındaki bu bağlayıcı seçeneğini ayarlamak için
Proje için Özellik Sayfaları iletişim kutusunu açın. Daha fazla bilgi için bkz . Derleyici ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>Bağlayıcısı>Gelişmiş özellik sayfasını seçin.
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
- Bkz. AdditionalOptions.
Ö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ı /CLRSUPPORTLASTERROR
gö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).