Aracılığıyla paylaş


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 func2kullanması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 func2kullanması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 func2kullanması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_globalveri 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:

  1. Kaynak koddaki __declspec(dllexport) anahtar sözcüğü

  2. içindeki EXPORTS bir deyim. DEF dosyası

  3. LINK komutunda /EXPORT belirtimi

  4. 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; burada PlainFuncName 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.

Ayrıca bkz.

Modül Tanımlama Deyimleri Kuralları