Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kodunuzu taşıma sırasında aşağıdaki noktaları göz önünde bulundurun:
Aşağıdaki varsayım artık geçerli değildir:
#ifdef _WIN32 // Win32 code ... #else // Win16 code ... #endifAncak, 64 bit derleyici geriye dönük uyumluluk için _WIN32 tanımlar.
Aşağıdaki varsayım artık geçerli değildir:
#ifdef _WIN16 // Win16 code ... #else // Win32 code ... #endifBu durumda else yan tümcesi _WIN32 veya _WIN64 temsil edebilir.
Veri türü hizalamaya dikkat edin. TYPE_ALIGNMENT makro, bir veri türünün hizalama gereksinimlerini döndürür. Örneğin: x86 üzerinde
TYPE_ALIGNMENT( KFLOATING_SAVE )== 4, Intel Itanium işlemcide 8TYPE_ALIGNMENT( UCHAR )== 1 her yerdeÖrnek olarak, şu anda aşağıdaki gibi görünen çekirdek kodu:
ProbeForRead( UserBuffer, UserBufferLength, sizeof(ULONG) );büyük olasılıkla şu şekilde değiştirilmelidir:
ProbeForRead( UserBuffer, UserBufferLength, TYPE_ALIGNMENT(IOCTL_STRUC) );Intel Itanium sistemleri için çekirdek modu hizalama özel durumlarının otomatik düzeltmeleri devre dışı bırakılmıştır.
DEĞİl işlemlerine dikkat edin. Aşağıdakileri göz önünde bulundurun:
UINT_PTR a; ULONG b; a = a & ~(b - 1);Sorun şu ki ~(b–1) "0x0000 0000 xxxx xxxx" üretir ve "0xFFFF FFFF xxxx xxxx" üretmez. Derleyici bunu algılamaz. Bunu düzeltmek için kodu aşağıdaki gibi değiştirin:
a = a & ~((UINT_PTR)b - 1);İmzasız ve imzalı işlemleri gerçekleştirirken dikkatli olun. Aşağıdakileri göz önünde bulundurun:
LONG a; ULONG b; LONG c; a = -10; b = 2; c = a / b;Sonuç beklenmedik şekilde büyük. Kural, işlenenlerden biri imzalanmamışsa sonucun işaretsiz olmasıdır. Yukarıdaki örnekte, a işaretiz bir değere dönüştürülür, b'ye bölünür ve c'de depolanan sonuç. Dönüştürme, sayısal işleme içermez.
Başka bir örnek olarak aşağıdakileri göz önünde bulundurun:
ULONG x; LONG y; LONG *pVar1; LONG *pVar2; pVar2 = pVar1 + y * (x - 1);Sorun, x işaretiz olduğundan ortaya çıkar ve bu da ifadenin tamamının imzasız olmasını sağlar. y negatif olmadığı sürece bu işlem düzgün çalışır. Bu durumda, y işaretsiz bir değere dönüştürülür, ifade 32 bit duyarlık kullanılarak değerlendirilir, ölçeklendirilir ve pVar1'e eklenir. 32 bit işaretsiz negatif sayı büyük bir 64 bit pozitif sayıya dönüşür ve bu da yanlış sonuç verir. Bu sorunu çözmek için x değerini imzalı bir değer olarak bildirin veya ifadede LONG için açıkça yazın.
Parçalı boyut ayırmaları yaparken dikkatli olun. Mesela:
struct xx { DWORD NumberOfPointers; PVOID Pointers[100]; };Derleyici, 8 bayt hizalamasını yapmak için yapıyı ek 4 baytla doldurması nedeniyle aşağıdaki kod yanlıştır:
malloc(sizeof(DWORD) + 100*sizeof(PVOID));Aşağıdaki kod doğrudur:
malloc(offsetof(struct xx, Pointers) + 100*sizeof(PVOID));CreateFileMappinggibi işlevlere
(HANDLE)0xFFFFFFFFgeçirmeyin. Bunun yerine INVALID_HANDLE_VALUEkullanın.Bir dizeyi yazdırırken uygun biçim tanımlayıcılarını kullanın. İşaretçileri onaltılık olarak yazdırmak için %p kullanın. Bu, işaretçileri yazdırmak için en iyi seçenektir. Microsoft Visual C++ çok biçimli verileri yazdırmak için %I destekler. Visual C++, 64 bit olan değerleri yazdırmak için %I64'i de destekler.