Aracılığıyla paylaş


GetProcAddress

DLL'deki dışarı aktarılan bir işlevin adresini almak için açık olarak bir DLL çağrısına GetProcAddress bağlanan işlemler.DLL işlevini çağırmak için döndürülen işlev işaretçisini kullanın.GetProcAddress, DLL modül tanıtıcısını parametreler olarak alır (LoadLibrary, AfxLoadLibrary ya da GetModuleHandle tarafından döndürülen) 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 vasıtasıyla çağırdığınız derleme zamanı tür kontrolü olmadığı için, yığında ayrılan belleği aşıp erişim ihlaline neden olmamak amacıyla işlev parametrelerinin doğru olduğundan emin olun.Tür güvenliğini sağlamaya yardımcı olacak bir yol da, dışarı aktarılan işlevlerin işlev prototiplerine bakmak ve işlev işaretçilerine ilişkin 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);
   }
}

DLL'in nasıl oluşturulduğuna bağlı GetProcAddress aranırken istediğiniz işlevi nasıl belirtirsiniz.

Bağlandığınız DLL modül tanımı (.def) dosyasıyla oluşturulursa ve ordinaller DLL .def dosyasının DIŞA AKTARMALAR bölümündeki işlevlerle listelenirse yalnızca dışarı aktarma sırası edinebilirsiniz.DLL dışarı aktarılmış birçok işleve sahipse, dışarı aktarma sıraları DLL'nin dışarı aktarma tablosunda dizin görevi gördüğünden GetProcAddress öğesini işlev adının tersine bir dışarı aktarma sırası ile çağırmak biraz daha hızlıdır.Dışarı aktarma sırası ile, GetProcAddress , işlevi DLL'nin dışarı aktarma tablosundaki işlev adlarını belirtilen adla karşılaştırarak değil doğrudan bulabilir.Ancak, yalnızca .def dosyasında dışarı aktarılan işlevlere sıra sayıları atama üzerinde denetiminiz varsa GetProcAddress'i bir dışarı aktarma sıra sayısı ile çağırmalısınız.

Ne yapmak istiyorsunuz?

Hangi konu hakkında daha fazla bilgi edinmek istiyorsunuz?

Ayrıca bkz.

Kavramlar

Visual C++ dll