Saya belajar tentang pemrograman Win32, dan WinMain
prototipenya seperti:
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
Saya bingung untuk apa WINAPI
pengidentifikasi ini dan menemukan:
#define WINAPI __stdcall
Apa fungsinya? Saya bingung dengan ini memiliki sesuatu setelah tipe kembali. Untuk apa __stdcall
? Apa artinya ketika ada sesuatu antara jenis kembali dan nama fungsi?
c
winapi
calling-convention
stdcall
Tristan Havelick
sumber
sumber
s untuk berkeliling minimum 6 karakter konyol (dan kontra-produktif).Jawaban:
__stdcall
adalah konvensi pemanggilan yang digunakan untuk fungsi tersebut. Ini memberi tahu kompilator aturan yang berlaku untuk mengatur tumpukan, mendorong argumen dan mendapatkan nilai balik.Ada sejumlah konvensi panggilan lain,
__cdecl
,__thiscall
,__fastcall
dan mengagumkan bernama__declspec(naked)
.__stdcall
adalah konvensi panggilan standar untuk panggilan sistem Win32.Wikipedia membahas detailnya .
Ini terutama penting ketika Anda memanggil fungsi di luar kode Anda (misalnya OS OS) atau OS memanggil Anda (seperti halnya di sini dengan WinMain). Jika kompiler tidak mengetahui konvensi pemanggilan yang benar, Anda mungkin akan mendapatkan crash yang sangat aneh karena stack tidak akan dikelola dengan benar.
sumber
C atau C ++ sendiri tidak mendefinisikan pengidentifikasi tersebut. Mereka adalah ekstensi kompiler dan berdiri untuk konvensi panggilan tertentu. Itu menentukan di mana harus meletakkan argumen, dalam urutan apa, di mana fungsi yang dipanggil akan menemukan alamat pengirim, dan seterusnya. Sebagai contoh, __fastcall berarti argumen fungsi dilewatkan pada register.
The Wikipedia Pasal memberikan gambaran tentang konvensi panggilan yang berbeda ditemukan di luar sana.
sumber
Jawabannya sejauh ini telah mencakup rincian, tetapi jika Anda tidak berniat untuk turun ke pertemuan, maka yang perlu Anda ketahui adalah bahwa penelepon dan callee harus menggunakan konvensi panggilan yang sama, jika tidak Anda akan mendapatkan bug yang sulit ditemukan.
sumber
Saya setuju bahwa semua jawaban sejauh ini benar, tetapi inilah alasannya. Kompiler C dan C ++ Microsoft menyediakan berbagai konvensi panggilan untuk kecepatan panggilan fungsi (yang dimaksudkan) dalam fungsi C dan C ++ aplikasi. Dalam setiap kasus, penelepon dan callee harus menyetujui konvensi pemanggilan mana yang akan digunakan. Sekarang, Windows sendiri menyediakan fungsi (API), dan itu sudah dikompilasi, jadi ketika Anda memanggilnya, Anda harus menyesuaikannya. Setiap panggilan ke Windows API, dan callback dari Windows API, harus menggunakan konvensi __stdcall.
sumber
Lihatlah:
http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx
sumber
Ini ada hubungannya dengan bagaimana fungsi dipanggil - pada dasarnya urutan di mana hal-hal diletakkan di tumpukan dan siapa yang bertanggung jawab untuk pembersihan.
Berikut dokumentasinya, tetapi itu tidak berarti banyak kecuali Anda memahami bagian pertama:
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx
sumber
__stdcall digunakan untuk meletakkan argumen fungsi di stack. Setelah fungsi selesai, secara otomatis deallocates memori. Ini digunakan untuk argumen tetap.
Di sini fnname memiliki args yang langsung mendorong ke stack.
sumber
Saya tidak pernah menggunakan ini sebelumnya sampai hari ini. Karena dalam kode saya, saya menggunakan multi-threadding dan API multi-threading yang saya gunakan adalah windows one (_beginthreadex).
Untuk memulai utas:
Fungsi ExecuteCommand HARUS menggunakan kata kunci __stdcall dalam tanda tangan metode agar beginthreadex menyebutnya:
sumber