STRICT Compliance
Başarıyla derlenen bazı kaynak kodları, STRICT türü denetimini etkinleştirdiğinizde hata iletileri. Aşağıdaki bölümlerde, STRICT etkinleştirildiğinde kodunuzu derlemek için en düşük gereksinimler açıklanmaktadır. Özellikle taşınabilir kod üretmek için ek adımlar önerilir.
Genel Gereksinimler
Temel gereksinim, daha genel türlere güvenmek yerine doğru tanıtıcı türlerini ve işlev işaretçilerini bildirmeniz gerekir. Bir tanıtıcı türünü, başka bir tanıtıcının beklendiği yerde kullanamazsınız. Bu, işlev bildirimlerini değiştirmeniz ve daha fazla tür ataması kullanmanız gerekebileceği anlamına da gelir.
En iyi sonuçlar için genel HANDLE türü yalnızca gerektiğinde kullanılmalıdır.
Uygulamanızda İşlevleri Bildirme
Tüm uygulama işlevlerinin bildirildiğinden emin olun. Bildirimlerinizi kolayca tarayabileceğiniz ve değiştirilmesi gereken parametre ve dönüş türlerini arayabileceğiniz için tüm işlev bildirimlerini ekleme dosyasına yerleştirmeniz önerilir.
İşlevleriniz için üst bilgi dosyaları oluşturmak üzere /Zg derleyici seçeneğini kullanırsanız, STRICT türü denetimini etkinleştirip etkinleştirmediğinize bağlı olarak farklı sonuçlar alabileceğinizi unutmayın. STRICT devre dışı bırakılmıştır, tüm tanıtıcı türleri aynı temel türü oluşturur. STRICT etkinleştirildiğinde, farklı temel türler oluştururlar. Çakışmayı önlemek için, STRICT her etkinleştirdiğinizde veya devre dışı bırakışınızda üst bilgi dosyasını yeniden oluşturmanız veya üst bilgi dosyasını temel türler yerine HWND , HDC, HANDLEvb. türlerini kullanacak şekilde düzenlemeniz gerekir.
Windows.h'den kaynak kodunuzla kopyaladığınız tüm işlev bildirimleri değişmiş olabilir ve yerel bildiriminiz güncel olmayabilir. Yerel bildiriminizi kaldırın.
Tür Ataması Gerektiren Türler
Bazı işlevlerin genel dönüş türleri veya parametreleri vardır. Örneğin, SendMessage işlevi bağlama bağlı olarak herhangi bir sayıda türde olabilecek verileri döndürür. Kaynak kodunuzda bu işlevlerden herhangi birini gördüğünüzde doğru tür atamasını kullandığınızdan ve mümkün olduğunca belirli olduğundan emin olun. Aşağıdaki listede bu işlevlerin bir örneği verilmiştir.
- LocalLock
- globallock
- GetWindowLong
- SetWindowLong
- SendMessage
- DefWindowProc
- SendDlgItemMessage
SendMessage, DefWindowProcveya sendDlgItemMessageçağırdığınızda, önce sonucu UINT_PTRyazacak şekilde atamanız gerekir. LRESULT veya sonucun tanıtıcı içerdiği LONG_PTR değeri döndüren herhangi bir işlev için benzer adımları uygulamanız gerekir. Bir tanıtıcının boyutu Windows sürümüne bağlı olarak değiştiğinden, taşınabilir kod yazmak için bu gereklidir. (UINT_PTR) ataması düzgün dönüştürmeyi sağlar. Aşağıdaki kodda, SendMessage fırçaya tanıtıcı döndürdüğü bir örnek gösterilmektedir:
HBRUSH hbr;
hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);
CreateWindow ve CreateWindowEx parametresi hmenu bazen bir tamsayı denetim tanımlayıcısı (ID) geçirmek için kullanılır. Bu durumda kimliği bir HMENU türüne atamanız gerekir:
HWND hwnd;
int id;
hwnd = CreateWindow(
TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
x, y, cx, cy, hwndParent,
(HMENU)id, // Cast required here
hinst,
NULL);
Ek Dikkat Edilmesi Gerekenler
STRICT türü denetimi en iyi şekilde yararlanmak için izlemeniz gereken ek yönergeler vardır. Aşağıdaki değişiklikleri yaparsanız kodunuz windows'un gelecek sürümlerinde daha taşınabilir olacaktır.
WPARAM , LPARAM, LRESULTve LPVOID türleri çok biçimli veri türleridir. STRICT türü denetimi etkinleştirildiğinde bile farklı veri türlerini farklı zamanlarda. Tür denetimi avantajından yararlanmak için, bu türlerdeki değerleri en kısa sürede atamanız gerekir. (İleti krakerlerinin wParam otomatik olarak yeniden yayınlandığını ve lParam taşınabilir bir şekilde unutmayın.)
HMODULE ve HINSTANCE türlerini ayırt etmeye özellikle dikkat edin. STRICT etkinleştirildiğinde bile, bunlar aynı temel tür olarak tanımlanır. Çekirdek modülü yönetim işlevlerinin çoğu HINSTANCE türlerini kullanır, ancak yalnızca HMODULE türlerini döndüren veya kabul eden birkaç işlev vardır.
İlgili konular
-
STRICT Devre Dışı Bırakma
-
STRICT etkinleştirmeyi