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.
DLL'de dışa aktarılan bir işlevin adresini almak için işlemler, GetProcAddress çağrısını açıkça kullanır. DLL işlevini çağırmak için döndürülen işlev işaretçisini kullanırsınız.
GetProcAddress, DLL modülü tanıtıcısını (LoadLibrary, AfxLoadLibrary, veya GetModuleHandle tarafından döndürülen) ve çağırmak istediğiniz işlevin adını veya işlevin dışa aktarma sırasını parametre olarak alır.
DLL işlevini bir işaretçi aracılığıyla çağırdığınızdan ve derleme zamanı türü denetimi olmadığından, yığında ayrılan belleği aşmamak ve erişim ihlaline neden olmak için işlevin parametrelerinin doğru olduğundan emin olun. Tür güvenliği sağlamaya yardımcı olmak için, dışarı aktarılan işlevlerin işlev prototiplerine bakmak ve işlev işaretçileri için eşleşen tür tanımları oluşturmaktır. Örneğin:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...
HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD dwParam1;
UINT uParam2, uReturnVal;
hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
"DLLFunc1");
if (!lpfnDllFunc1)
{
// handle the error
FreeLibrary(hDLL);
return SOME_ERROR_CODE;
}
else
{
// call the function
uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
}
}
GetProcAddress'i çağırırken istediğiniz işlevi nasıl belirteceğiniz, DLL'nin nasıl oluşturulduğuna bağlıdır.
Dışarı aktarma numaralarını yalnızca bağladığınız DLL bir modül tanım dosyası (.def) ile oluşturulmuşsa ve bu numaralar, DLL'nin .def dosyasının EXPORTS bölümünde işlevlerle birlikte listeleniyorsa elde edebilirsiniz. Dışarı aktarma sıraları DLL'nin dışarı aktarma tablosunda dizin görevi görecek olduğundan, DLL'nin dışarı aktarılan birçok işlevi varsa, işlev adının aksine getProcAddress'i dışarı aktarma sırasıyla çağırmak biraz daha hızlıdır. Dışarı aktarma sırasıyla, GetProcAddress belirtilen adı DLL'nin dışarı aktarma tablosundaki işlev adlarıyla karşılaştırmak yerine işlevi doğrudan bulabilir. Ancak GetProcAddress'i sadece bir dışa aktarma sırasıyla çağırmalısınız, eğer sıraları .def dosyasındaki dışarı aktarılan işlevlere atama kontrolüne sahip olmalısınız.