EXPORTS
İşlevlerin veya verilerin dışarı aktarılan adlarını veya sıralarını belirten bir veya daha fazla dışarı aktarma tanımının bir bölümünü tanıtır. Her tanım ayrı bir satırda olmalıdır.
EXPORTS
definition
Açıklamalar
İlk tanım , anahtar sözcükle aynı satırda EXPORTS
veya sonraki bir satırda olabilir. . DEF dosyası bir veya daha fazla EXPORTS
deyim içerebilir.
Dışarı aktarma tanımının söz dizimi şöyledir:
entryname[=internal_name|other_module.exported_name] [@ordinal [NONAME] ] [ [PRIVATE] | [VERİ] ]
entryname , dışarı aktarmak istediğiniz işlev veya değişken adıdır. Bu gereklidir. Dışarı aktardığınız ad DLL'deki addan farklıysa, internal_name kullanarak dışarı aktarmanın adını DLL'de belirtin. Örneğin, DLL'niz bir işlevi func1
dışarı aktarırsa ve çağıranların işlevi olarak func2
kullanmasını istiyorsanız şunları belirtmeniz gerekir:
EXPORTS
func2=func1
Dışarı aktardığınız ad başka bir modülden geliyorsa, other_module.exported_name kullanarak dışarı aktarmanın adını DLL'de belirtin. Örneğin, DLL'niz bir işlevi other_module.func1
dışarı aktarırsa ve çağıranların işlevi olarak func2
kullanmasını istiyorsanız şunları belirtmeniz gerekir:
EXPORTS
func2=other_module.func1
Dışarı aktardığınız ad sıralı olarak dışarı aktaran başka bir modülden geliyorsa, other_module kullanarak dışarı aktarmanın DLL'deki sırasını belirtin.#sıralı. Örneğin, DLL'niz bir işlevi sıralı 42 olduğu diğer modülden dışarı aktarıyorsa ve çağıranların olarak func2
kullanmasını istiyorsanız şunları belirtmeniz gerekir:
EXPORTS
func2=other_module.#42
MSVC derleyicisi C++ işlevleri için ad dekorasyonu kullandığından, internal_name süslü adı kullanmanız veya dışarı aktarılan işlevleri kaynak kodunda kullanarak extern "C"
tanımlamanız gerekir. Derleyici ayrıca, __stdcall çağırma kuralını kullanan C işlevlerini bir alt çizgi (_) ön eki ve at işaretinden (@) oluşan bir sonek ve ardından bağımsız değişken listesindeki bayt sayısı (ondalık) ile süsler.
Derleyici tarafından üretilen süslü adları bulmak için DUMPBIN aracını veya bağlayıcı /MAP seçeneğini kullanın. Dekore edilmiş adlar derleyiciye özgü. süslü adları içinde dışarı aktarırsanız. DEF dosyası, DLL'ye bağlanan yürütülebilir dosyalar da derleyicinin aynı sürümü kullanılarak oluşturulmalıdır. Bu, çağırandaki süslü adların içindeki dışarı aktarılan adlarla eşleşmesini sağlar. DEF dosyası.
@ordinal işlevini kullanarak işlev adının değil bir sayinin DLL'nin dışarı aktarma tablosuna gireceğini belirtebilirsiniz. Birçok Windows DLL'i eski kodu desteklemek için sıraları dışarı aktarır. 16 bit Windows kodunda sıraların kullanılması yaygındı, çünkü dll boyutunu en aza indirmeye yardımcı olabilir. DLL istemcilerinizin eski destek için ihtiyaç duymadığı sürece işlevleri sıralı olarak dışarı aktarmanızı önermeyiz. Çünkü . LIB dosyası sıra ve işlev arasındaki eşlemeyi içerecektir; DLL kullanan projelerde olduğu gibi işlev adını kullanabilirsiniz.
İsteğe bağlı NONAME anahtar sözcüğünü kullanarak yalnızca sıralı olarak dışarı aktarabilir ve sonuçta elde edilen DLL'de dışarı aktarma tablosunun boyutunu küçültebilirsiniz. Ancak, DLL'de GetProcAddress kullanmak istiyorsanız, ad geçerli olmadığından sırayı bilmeniz gerekir.
İsteğe bağlı PRIVATE anahtar sözcüğü, entryname değerinin LINK tarafından oluşturulan içeri aktarma kitaplığına eklenmesini engeller. Link tarafından oluşturulan görüntüdeki dışarı aktarmayı etkilemez.
İsteğe bağlı DATA anahtar sözcüğü dışarı aktarmanın kod değil veri olduğunu belirtir. Bu örnekte adlı exported_global
veri değişkenlerini nasıl dışarı aktarabileceğiniz gösterilmektedir:
EXPORTS
exported_global DATA
Tanımı dışarı aktarmanın önerilen sırada listelenen dört yolu vardır:
Kaynak koddaki __declspec(dllexport) anahtar sözcüğü
içindeki
EXPORTS
bir deyim. DEF dosyasıLINK komutunda /EXPORT belirtimi
biçimindeki
#pragma comment(linker, "/export: definition ")
kaynak kodunda bir açıklama yönergesi. Aşağıdaki örnekte, işlev bildiriminden önce #pragma açıklama yönergesi gösterilmektedir; buradaPlainFuncName
sıralanmamış ad ve_PlainFuncName@4
işlevin süslü adıdır:#pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4") BOOL CALLBACK PlainFuncName( Things * lpParams)
#pragma yönergesi, sıralanmamış bir işlev adını dışarı aktarmanız gerekiyorsa ve derleme yapılandırmasına bağlı olarak farklı dışarı aktarmalara sahipseniz (örneğin, 32 bit veya 64 bit derlemelerde) kullanışlıdır.
Dört yöntem de aynı programda kullanılabilir. LINK dışarı aktarmaları içeren bir program oluşturduğunda, dışında bir içeri aktarma kitaplığı da oluşturur. EXP dosyası derlemede kullanılır.
Dışarı AKTARMAlar bölümüne bir örnek aşağıda verilmiştir:
EXPORTS
DllCanUnloadNow @1 PRIVATE
DllWindowName = WindowName DATA
DllGetClassObject @4 NONAME PRIVATE
DllRegisterServer @7
DllUnregisterServer
kullanarak dll'den bir değişken dışarı aktardığınızda. DEF dosyası, değişkende belirtmeniz __declspec(dllexport)
gerekmez. Ancak, DLL kullanan herhangi bir dosyada yine de veri bildiriminde kullanmanız __declspec(dllimport)
gerekir.