2012-06-16 17 views
7

Olası Çoğalt: Bir WindowProc() fonksiyonunun
What does a “CALLBACK” declaration in C do?Bir Windows API işlev bildiriminde "CALLBACK" ne anlama geliyor?

prototip bu

 LRESULT CALLBACK WindowProc(HWND hWnd,UINT message , WPARAM wParan, LPARAM lParam); 

ama ben CALLBACK anahtar kelime rastlamak hiç, ben sadece Bir geriçağırım işlevinin, bir işaretçiyi başka bir işleve ilettiğiniz biri olduğunu bilin, bu yüzden bu CALLBACK burada tam olarak nedir? ve ne yapar?

cevap

7

Bu, Win32 API'sinin geri arama işlevleri hakkında varsaydığı şey olduğu için __stdcall olarak tanımlanmıştır. Bu bir çağrı kuralı - fonksiyon çağrısının düşük seviyede nasıl düzenlendiğini açıklar - CPU yığınında parametreler nasıl düzenlenir ve benzerleri. Beklenen yığın düzeni (yani kongre) hakkındaki varsayımlar, arayan kişi ile aranan kişi arasında eşleşmelidir, aksi takdirde her türlü eğlenceli sonuç ortaya çıkabilir.

Geçmişte, Intel işlemcilerde birden çok sözleşme vardı; Microsoft olmayan derleyicileri sayıyorsanız daha da fazla. Geri aramalarınızın __stdcall olduğundan emin olmak iyi bir uygulamadır. Bazı durumlarda, derleyici ve ayarlara bağlı olarak, __stdcall varsayılan çağrı kuralıdır (yani, CALLBACK'ı güvenle atlayabilirsiniz), ancak her zaman değil.

Win16'da, CALLBACK far pascal olarak tanımlandı. Bu, özellikle C programında, kullanıcı fonksiyonları için varsayılan değer olarak daha az olasıdır. Geri çağırmaların bir Pascal çağrı sözleşmesine sahip olduğu varsayımı, tarihi bir eserdi.

+0

_stdcall tam olarak nedir? LRESULT dönüş tipi, _stdclall nedir? Deklerasyonda hangi pozisyonda yer alıyor? Ve biraz basitleştirebilirsin - ne için geri çağırıyor? – Ghost

+0

__stdcall, [çağrı sözleşmesi] 'ni (http://en.wikipedia.org/wiki/Calling_convention) mümkün olan en çok şeyden biri olarak gösterir. Geri arama, API'nin işlevini tersi yerine çağırdığı bir tekniktir. Bunu doğru şekilde yapmak için API'nın, işlevin izlediği çağrı kuralını bilmesi gerekir. –

+0

Arama kuralını nasıl değiştirebiliriz? Ve winproc işlevi de bir şekilde konvansiyonu takip ediyor mu (mantıklı değil mi, becoz hangi kuralları izleyeceğimizi pencerelere söylüyoruz, bu da winproc'un sözleşmeye bağlı olduğu anlamına geliyor)? Soru dizisi için üzgünüm, tamamen memnun değilim. – Ghost