Makale numarası: 106553 - Son Gözden Geçirme: 15 Temmuz 2004 Perşembe - Gözden geçirme: 2.1 C dll artış ve yeniden Visual Basic'den Çağır
Bu SayfadaÖzetBu makalede, Visual Basic ile dll nasıl özetlenmektedir. Bu, aşağıdaki konuları kapsar: Bölüm A
Bölüm B
Daha fazla bilgiBÖLÜM a1.0 DLL nedir?Windows önemli bir bölümünü dll (dinamik bağlantı kitaplıkları) var. Bir DLL yürütülebilir program yürütülürken çağırabileceğiniz bir işlev içerir. Diğer bir deyişle, bir kitaplık programınız ile dinamik olarak bağlayabilirsiniz işlevlerin dll'dir.Statik veya dinamik BIR bağlantı olabilir. Statik bağlantı değişmez. Yürütülebilir dosya oluşturulur ve yürütme sırasında değişmez, programınız tarafından kitaplığı işlevine erişmek için gerekli olan tüm adres bilgilerini giderilmiştir. Dinamik bağlantı gerektiği gibi oluşturulur. Programın yürütülebilir dosya olarak değil bir işlev gerektiğinde, Windows tüm işlevlerini yerine uygulamanız için kullanılabilir hale getirme dinamik bağlantı kitaplığı (DLL) yükler. O zaman, Windows her işlev adresi ve dinamik olarak uygulamanıza yeniden bağlar. Visual Basic'te kullanılan tüm özel DLL'ler denetimleridir. Tek fark, özel işlem Visual Basic'den alınan iletileri açısından gerekli olduğunu olmasıdır. 1.1 Neden dll kullan?Neden bir DLL kullanmak isteyebileceğinizi dört nedenleri şunlardır:
1.2 Bir DLL dosyasının anatomisiHer bir DLL LibMain işlev içermelidir ve bir Windows çıkış yordam (WEP) adlı bir yürütülebilir program tarafından verilen işlevlere ek olarak içermelidir.
1.3 DLL bellek yönetimi sorunlarıBüyük bellek modelini kullanın.Statik olarak tanımlanmış tüm değişkenleri C saklar veya genel (dışında bir işlev tanımlanan), programın yığın alanı ve C depolar tüm değişkenleri yığında. Küçük ve orta modelinde, varsayılan olarak tüm işaretçiler yakın bir yerde kullanılabilir. Bu, verileri veri <a1>segment</a1> (DS) kaydı veya yığın kesiminin (SS) kaydının 16-bit uzaklıklar tarafından erişilen anlamına gelir. Ne yazık ki, derleyici uzaklık DS ya da SS olup bilmenin bir yolu yoktur vardır. DS ve BB aynı segmente işaret çünkü programların çoğunda bu sorun olmayacaktır. Bir DLL DOSYASı, ancak özel bir durumdur. Bir DLL kendi bir veri kesimini olsa da, yığın çağıran program ile paylaşır. Bu, DS ve SS aynı konuma işaret yok anlamına gelir. Büyük bellek modelinde, tüm değişkenleri 32-bitlik bir değer tarafından başvurulan DLL oluşturmak için en kolay çözüm bu sorunu var. Neden dinamik bellek ayırma?Dinamik olarak bellek ayrılırken Windows uygun bir tekniktir. Büyük veri dizileri bildirmek için 64 K sınırlıdır, programınızın yığın ya da disk alanı ve Windows belleğini boşa harcar, programın veri kesimi yer alır. Gereksinim ve işiniz bittiğinde boş, Windows için bellek sorun daha iyidir.Bellek ayrılıyor.Windows'da, iki tür bellek, yerel ve genel dinamik olarak ayırabilirsiniz. Yerel bellek için 64 K sınırlıdır ve durumunda bir DLL DOSYASı, dll DOSYASıNı çağıran programla yerel bellek paylaşılıyor. Yeniden yüklendikten sonra genel tüm Windows belleğinizin bellektir.Yerel bellek ayrılır ve yönetilen LocalAlloc, LocalLock LocalUnlock ve LocalFree kullanarak--bu örnekte olduğu gibi çalışır: Genel bellek ayrılır ve yönetilen kullanarak GlobalAlloc, GlobalLock GlobalUnlock ve GlobalFree--bu örnekte olduğu gibi çalışır: Diğer programlarla dll'de ayrılan bellek paylaşmak istiyorsanız, GMEM_SHARED bayrağını kullanarak tahsis. DDE yoluyla bellek paylaşmak istiyorsanız, GMEM_DDESHARE bayrağını kullanarak tahsis gerekir. Statik değişkenleri veri depolama dikkatli olunGenel veya statik değişkenleri kullanarak bir DLL DOSYASı verilerini depolamak üzere denerseniz, bu değerler, DLL bir sonraki çağırdığınızda değiştirdiyseniz Şaşkın olması gerekmez. Bu şekilde depolanan verilerin bu DLL erişen tüm uygulamaları için ortak olacaktır. Bir DLL kaç uygulama kullanımı ne olursa olsun, dll DOSYASıNıN yalnızca bir örneği yok. Bu sorunu en iyi yolu, yapıları DLL dosyasından geri dönmek ve gerektiğinde bunları yeniden olur.Dosya tanıtıcılarıUygulama veya DLL dosyaları arasında dosya tanıtıcısı paylaştırmak mümkün değildir. Her uygulama kendi dosya tanıtıcısı tablosu vardır. Bir DLL'i kullanarak aynı dosyaya kullanılacak iki uygulama için her ikisi de tek tek dosyasını gerekir.1.4 Bir DLL DOSYASı, Visual C++ kullanarak oluşturmaVisual C++ kullanarak bir DLL DOSYASı oluşturmak gerekli adımları şunlardır:
1.5 Örnek C DLLAşağıdaki dll DOSYASı, Visual Basic'den adlı GetDiskInfo işlevi içerir. Kullanılabilir disk alanı, <a2>geçerli sürücü adı</a2> ve <a4>birim adını döndürür.KITAPLıK diskinfo Not: KITAPLıK adı .def dosyası, DLL dosya adı ile aynı olması gerekir, ya da çözmelisiniz Visual Basic "DLL yükleme hatası." verir. Örneğin, yukarıdaki .def dosyası KITAPLıĞı DISKINFO deyimi kullanarak DISKINFO.DLL dosyası oluşturun. AÇıKLAMA 'GetDiskInfo tenekesi Visual Basic'den çağrılacak' exetype windows 3.1 KOD preload moveable discardable <a1>VERİ</a1> preload TAŞINABİLİR TEK heapsize 4096 DIŞA AKTARIR @ 1 GetDiskInfo BÖLÜM b2.0 Visual Basic'den dll çağrılıyor.Visual Basic'te, tüm işlevleri, aramak istediğiniz DLL işlevleri de dahil olmak üzere önce Declare deyimi kullanarak bildirilmelidir. Bir form veya modül <a1>bildirimleri</a1> bölümündeki işlevlerinizi bildirebilirsiniz. Bir DLL yordam veya işlev bir form içinde bildirirseniz, o form için özeldir. Ortak sağlamak için <a0></a0>, bir modülünde bildirmeniz gerekir. Declare deyimi örnek aşağıdadır:Işlev bildirmek sonra arayabilir ve yalnızca siz arayın ve bir Visual Basic işlevini kullanın işlevini kullanın. 2.1 DLL parametreleriDLL'ler, genellikle C yazılır, dll parametreleri doğrudan Visual Basic tarafından desteklenen çeşitli kullanabilirsiniz. Sonuç olarak, parametrelerini ileterek, Programcı geçirmek için uygun veri türünü bulmak var.Değer veya başvuru geçirilmesi bağımsız değişkenleriVarsayılan olarak, Visual Basic tarafından başvuru için tüm bağımsız değişkenler geçirir. (Visual Basic başvuruyla geçirme, uzak bir 32 bitlik bir adres sağlar.) Ancak, birçok DLL işlevi, bağımsız değişken değer geçirilecek bekler. Bu bağımsız değişkeni bildirimi önünde ByVal anahtar sözcüğünü girerek sağlanabilir.Aşağıdaki bölümlerde, parametreleri Visual Basic'e dönüştürme gösterir. 8 için 16 bit sayısal parametreleriSayısal parametreleri (int, kısa, imzasız int, işaretsiz kısa, BOOL ve WORD) 8 için 16-bit tamsayı geçirir.32 bitlik sayısal parametreleri32 Bitlik sayısal parametreleri (uzun, uzun ve DWORD imzasız) olarak LONG.Nesne tanıtıcılarıTüm tanıtıcılar bir pencere ile ilişkilendirilmiş benzersiz bir 16-bit tamsayı değerlerdir ve değer geçirilir, böylece bu parametreler, tamsayı geçirin.stringsDize (karakter işaretçi) veya işaretçi imzasız karakter LPSTR ve LPBYTE veri türleri içerir. Bu parametreler (ByVal paramname As String) iletirsiniz. Visual Basic dizeleri doğrudan geçirmek için <a0></a0>, bunları (dize olarak param) olarak iletirsiniz.Visual Basic ve C DLL arasında geçirilmesi dizeleri hakkında ek bilgi için lütfen Microsoft Knowledge Base'de aşağıdaki makaleye bakın: 118643
(http://support.microsoft.com/kb/118643/EN-US/
)
Bir dize veya dize PASS nasıl VB ve C DLL diziler. Not: Visual Basic dizeleri özel DLL açıkça gerektiriyorsa sürece dizeleri doğrudan geçmek gerekmez; bu nedenle işlem gerektirir. Sayısal değerler için işaretçilerIşaretçiler, yalnızca ByVal anahtar sözcüğünü kullanarak değil, sayısal değerler için geçirir.YapılarıVisual Basic kullanıcı tanımlı tür DLL tarafından beklenen yapısını eşleşirse, yapısı tarafından başvuru olarak geçirilebilir.Not: Bu yapıları değeriyle geçirilemez. Işaretçiler dizileriDizinin ilk öğe başvurusu geçirir.Işlev işaretçileriIşlev işaretçileri DLL işlevleri, Visual Basic ile kullanılamaz; bu nedenle, geri arama işlevleri, Visual Basic desteklemiyor.Boş işaretçilerBir DLL DOSYASı, bir NULL işaretçi bekliyor, (ByVal paramname'As any) olarak iletirsiniz. 0'ı kullanabilir ve DLL çağrılırken paramname değeri.2.2 Sorun gidermeAşağıda, karşılaşabileceğiniz bazı sorunların çözümleri var.DLL çağrılan sonra sistem kaynakları düşük alma KoruGDI nesneleri DLL dosyanızın kullanıyorsanız, kullandıktan sonra serbest unutmamalısınız. Bu Visual Basic'te açık olmayabilir, ancak Windows SDK (Yazılım Geliştirme Seti) kullanırken, bir GDI nesnesi (örneğin, CreateBrushIndirect) oluşturursanız, daha sonra NesneSil kullanarak silmeniz gerekir.Hatalı DLL arama kuralı hatasıBu hata genellikle yanlış atlama veya Declare ekstresinden ByVal anahtar sözcüğü de dahil olmak üzere neden olur. Bu hata, yanlış parametreleri geçirilirse da kaynaklanabilir.DLL yükleme hatasıBir dinamik bağlantı kitaplık yordamı çağırmak ve bu yordamın Declare deyiminde belirtilen bir dosya yüklenemiyor, bu hata oluşur. Neden bir DLL yüklenmemesi hakkında daha fazla bilgi edinmek için Microsoft Windows API işlevi LoadLibrary kullanabilirsiniz.Genel koruma (GP) hatasıKendisine ait olmayan bir bellek bloğu programınızı yazar GP hatası oluşur. Bu iki en olası nedenleri şunlardır:
2.3 Örnek Visual Basic arama programıBir Visual Basic programında bir DLL ça??rmadan iki bölüm vardır. Önce işlev bildirir ve sonra da olay kodu kullanın.Bir <a0>Declare</a0> ifadesinin örnek aşağıdadır. Bir modül veya formun genel Declarations bölümünde Declare deyimi konması. Işlev bildirildi sonra olay kodu kullanabilirsiniz. Aşağıdaki örnek, Command1 tıklatın olay kodda bir DLL işlevini kullanır: Bu makaledeki bilginin uygulandığı durum:
Otomatik TercümeÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir. Makalenin İngilizcesi aşağıdaki gibidir:106553
(http://support.microsoft.com/kb/106553/en-us/
)
| Diğer Kaynaklar Diğer Destek Siteleri
ToplulukHemen Yardım AlMakale çevirileri
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email



Üste