2009-08-18 16 views
8

Bu typedef:C++: MSVC'de __stdcall ile geri arama typedefs

typedef DWORD WINAPI 
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

iyi derlenmez, ancak msvc olarak derlediğim zaman WINAPI (__stdcall için bir takma addır):

typedef DWORD 
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

Neden böyle oluyor ? WINAPI parçasını güvenli bir şekilde çıkarabilir miyim?

Güncelleniyor: "WINAPI" formunu typedef kaldırmak zorunda kaldım, aksi takdirde

 error C2059: syntax error : '(' 

satır için.

Msvc yapamazken Borland'ın "WINAPI" ile neden derleyebildiğini söyleyebilir misiniz?

+0

Üzgünüz, şimdi dahil edilmiştir. – George

cevap

13

VC++ 'ya inanıyorum, çağıran kuralı,()' s İşte bir example içinde, bir işlev işaretçisi typedef içinde bir çağrı kuralı kullanarak MSDN'de koymak gerekir.

typedef DWORD (WINAPI * CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

Bu, sorunsuz bir şekilde derlenmelidir.

+0

Teşekkür ederim, bu bir işe yarar:) – George

0

Bir işlev gösterici, işlev tarafından kullanılan arama kuralı hakkında bilgi sahibi olmalıdır. __cdecl çağrı kuralı kullanan bir işlevi işaret ediyorsanız, bir __cdecl işlev işaretçisi kullanmanız gerekir. __stdcall çağrı kuralını kullanan bir işlevi işaret ediyorsanız, bir __stdcall işlev işaretçisi kullanmanız gerekir.

Bu yardımcı olur umarım.

0

Yan Not: işlev imzası typedefs pointer typedefs olarak ifade edilebilir asla inanıyoruz.

olmayan işaretçi, basitçe

CM_Open_DevNode_Key MyFunc olarak yazılmış olabilirdi bu geri arama imzayı takip etmektir bir fonksiyonun herhangi başlık beyanı olmak CM_Open_DevNode_Key tanımlanmış olsaydı

;

yerine bir aşırı ayrıntılı/hataya eğilimli

DWORD WINAPI myFunc (DWORD DWORD DWORD DWORD PhKey DWORD);

Bu, gerektiğinde çok daha basit kodlara ve çok daha spesifik olarak işlev imzaları eşleşmesine olanak sağlar.

onlar (: Düzgün değerlendirdi "const CHAR *" e karşı "const PChar" rezil örnek) işaret ediliyor içerik ait constness belirterek uygulamaya izin demonte beri bu işaretçi typedefs genel olarak kötü olduğunu cabası.