Aracılığıyla paylaş


GetProcAddress

DLL'de dışarı aktarılan bir işlevin adresini almak için bir DLL çağrısına açıkça bağlanmayı işler GetProcAddress . 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) parametre olarak alır ve çağırmak istediğiniz işlevin adını veya işlevin dışarı aktarma sırasını 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. Örnek:

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 sırasını yalnızca bağladığınız DLL bir modül tanımı (.def) dosyasıyla oluşturulmuşsa ve sıralar DLL'nin .def dosyasının EXPORTS bölümündeki işlevlerle 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. Bununla birlikte, GetProcAddress'i dışarı aktarma sırasıyla çağırmanız için sıraların .def dosyasındaki dışarı aktarılan işlevlere atanması üzerinde denetim sahibi olmanız gerekir.

Ne yapmak istiyorsunuz?

Ne hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Visual Studio'da C/C++ DLL'leri oluşturma