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

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu makalede, Visual Basic ile dll nasıl özetlenmektedir. Bu, aşağıdaki konuları kapsar:

Bölüm A

  • 1.0 DLL nedir?
  • 1.1 Neden bir DLL kullan?
  • 1.2 Bir DLL dosyasının anatomisi.
  • 1.3 DLL bellek yönetimi sorunları.
  • 1.4 Visual C++ kullanarak bir DLL DOSYASı oluşturma.
  • 1.5 Örnek C DLL.

Bölüm B

  • 2.0 Dll, Visual Basic'den çağrılıyor.
  • 2.1 DLL parametreleri.
  • 2.2</a1> Sorun giderme.
  • 2.3 Örnek Visual Basic arama programı.

Daha fazla bilgi

BÖLÜM a

1.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:

  • C çalışma zamanı işlevler erişim:

    C çalışma zamanı kitaplığı, DLL dosyaları için değil olan Visual Basic programcıları için kullanılabilir olmayacaktır pek çok yararlı işlevleri vardır. Örneğin, _dos_getdiskfree işlevi, toplam disk alanı miktarını ve bir sürücüdeki kullanılabilir boş disk alanı sağlar.
  • <a1>Windows</a1> API (uygulama programı arabirimi) erişimi, işlevleri geri yordamları gerektir:

    Bazı Windows API işlevleri, bir geri çağırma işlevi gereklidir. Bir geri arama işlevi, Windows çağıracak bir işlevdir API yürütülürken arayın. Bu tür bir işlevi olan bir tanıtıcı tarafından belirli bir göreve ait olan tüm pencerelerin verir EnumTaskWindows örneğidir.
  • Hız:

    C oldukça yakın yerel makine kodu olan bir düzeyde çalışan tam derlenmiş bir dildir. Bu, C iyi yazılmış programların çalışmasını hızlı anlamına gelir.
  • Kullanımda yüklenemedi:

    Kod ve bir DLL verileri yalnızca gerektiğinde yüklenir. Bir DLL DOSYASı, yalnızca gerekli parçaları yerine tüm DLL yüklenen şekilde düzenlenebilir. Bu, gerekli olan bellek ve yüklemek için kullanılan süre miktarını azaltır.

1.2 Bir DLL dosyasının anatomisi

Her 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.

  • LibMain:

    Bir DLL LibMain işlevi içermesi gerekir. LibMain işlevi DLL başlatılamadı sistem tarafından verilir. DLL gerektiren program ilk yüklendiğinde LibMain yalnızca bir kez--denir. LibMain için geçirilen Parametreler şunlardır:
    -TANıTıCı: DLL'ın örneğinin tanıtıcı.
    -WORD: Kitaplığı'nın veri kesimi.
    -WORD: Öbek boyutu.
    -LPSTR: komut satırı parametreleri.
  • wep:

    Kitaplık bellekten önce WEP (Windows çıkış yordam), bir DLL için temizlemeyi gerçekleştirir. Bir WEP işlevi <a0>Windows</a0> işletim sisteminin önceki sürümlerinde her DLL için gerekli, ancak sürüm 3.1 isteğe bağlıdır. Bir WEP dahil edilecek Visual C alanı'ndaki (.def) modülü tanımında örnek dosya:
    DIŞA AKTARIR
    wep
  • Verilen işlevleri:

    Bu DLL dosyanızın aramak istediğiniz işlevlerdir. Bunlar, _export tarafından belirtilen. _export geriye dönük uyumluluk için kullanılır. Aramak istediğiniz tüm işlevleri kendi DLL (.def) dosyasında listelenmiş olmalıdır.

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:
   char* pszBuffer;
   ....
   pszBuffer = (char *) LocalAlloc (LPTR, 20);
   ...
   LocalFree (pszBuffer);
				
ıt genel bellek ayırmaya olandan yerel bellek ayrılamıyor hızlıdır. Ancak, yerel yığın ayırma DLL aradığınız tüm programları arasında paylaştırılmalıdır 64 K sınırlıdır. Küçük olduğunda, kısa süreli bellek bloklarını gerekli yerel bellek kullanmak uygundur.

Genel bellek ayrılır ve yönetilen kullanarak GlobalAlloc, GlobalLock GlobalUnlock ve GlobalFree--bu örnekte olduğu gibi çalışır:
   HGLOBAL hglb;
   char* pszBuffer;

   hglb = GlobalAlloc (GHND, 2048);
      // GHND allocates the memory as moveable and
      // initialized to 0
      // 2048 is the amount of memory to be allocated...
   pszBuffer = GlobalLock (hglb);
   ...
   GlobalUnlock (hglb);
   GlobalFree (hglb);
				
The GlobalAlloc işlevi,'ün katları olarak 4 K bellek ayırı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 olun

Genel 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şturma

Visual C++ kullanarak bir DLL DOSYASı oluşturmak gerekli adımları şunlardır:

  1. Visual C++ başlatın.
  2. Proje menüsünden Yeni'yi seçerek, yeni bir proje oluşturun. Aşağıdaki seçenekleri işaretleyin:

    • "Windows dinamik bağlantı kitaplığına (.dll)" proje tipini ayarlama
    • "Microsoft Foundation Classes kullan" onay kutusunu temizleyin.
    Ayarlayabilir veya bu seçenekler daha sonra Seçenekler menüsünden Project seçerek görüntülemek.
  3. Proje menüsünde Düzen'ı seçtiğinizde, gelen iletişim kutusunu kullanarak, varolan .C ve .def dosyaları projeye ekleyin. Veya doğrudan Visual C++ düzenleme penceresinde kodunuzu girin. (Aşağıda listelenen .C ve .def örnek kod bakın.)
  4. Proje menüsünden yapı <yourname>.dll seçeneğini seçin.

1.5 Örnek C DLL

Aş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.
      C Code Example, DISKINFO.C:

   #include <windows.h>
   #include <dos.h>

   int CALLBACK LibMain (HANDLE hInstance, WORD wDataSeg, WORD wHeapSize,
   LPSTR lpszCmdLine)

   // The following is required only under Windows version 3.1
   // Win32 does not require or support UnlockData()
   {
      if (wHeapSize > 0)
         UnlockData (0);  //Unlocks the data segment of the library.
      return 1;
   }

   void __export CALLBACK GetDiskInfo (char *cDrive, char *szVolumeName,
   unsigned long *ulFreeSpace)
   {
      unsigned drive;
      struct _diskfree_t driveinfo;
      struct _find_t c_file;

      _dos_getdrive (&drive);
      _dos_getdiskfree( drive, &driveinfo );

      if (!_dos_findfirst( "*.*", _A_VOLID, &c_file ))
         wsprintf( szVolumeName, "%s", c_file.name);
      else
         wsprintf ( szVolumeName, "NO LABEL");

      *cDrive = drive + 'A' -1;

      *ulFreeSpace = (unsigned long) driveinfo.avail_clusters * (unsigned
         long) driveinfo.sectors_per_cluster * (unsigned long)
         driveinfo.bytes_per_sector;
   }
				
Visual C++ DISKINFO.DEF aşağıdaki dosyada'nı kullanın:
KITAPLıK diskinfo
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
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.

BÖLÜM b

2.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:
   Declare Sub getdiskinfo Lib "c:\somepath\diskinfo.dll"
      (ByVal mydrive As String, ByVal myvolume As String, free As Long)
				
tüm DECLARE bildirimi tek tek satır olarak girmelisiniz. Declare ifadenin GETDISKINFO kullanıcı tarafından oluşturulan DISKINFO.DLL dosyasında yer alan kullanıcı tanımlı yordamı bildirir.

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 parametreleri

DLL'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şkenleri

Varsayı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 parametreleri

Sayı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 parametreleri

32 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.

strings

Dize (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çiler

Iş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 dizileri

Dizinin ilk öğe başvurusu geçirir.

Işlev işaretçileri

Işlev işaretçileri DLL işlevleri, Visual Basic ile kullanılamaz; bu nedenle, geri arama işlevleri, Visual Basic desteklemiyor.

Boş işaretçiler

Bir 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 giderme

Aşağıda, karşılaşabileceğiniz bazı sorunların çözümleri var.

DLL çağrılan sonra sistem kaynakları düşük alma Koru

GDI 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:

  • Siz bir dizi sınırları overstepped. C, yazmakta olduğunuz dizi alt indis geçerli olup olmadığını denetlemez. Bu nedenle, size ait olmayan belleğe kolayca yazabilirsiniz.
  • Işaretçi, serbest bir bellek konumundan kullandığınız. Kendi bellek serbest sonra tüm işaretçiler NULL atamak için en iyi seçenek olur.
DLL işlevi için yanlış türde değişken geçirilen BIR GP hatası da oluşabilir.

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ı.
   ' Enter the following Declare as one, single line:
   Declare Sub getdiskinfo Lib "c:\dllartic\diskinfo.dll"

      (ByVal mydrive As String, ByVal myvolume As String, free As Long)
				
Tam olarak gösterildiği gibi belirtin ByVal ifadeleri, veya yoksa bir GP hatası oluşabilir.

Işlev bildirildi sonra olay kodu kullanabilirsiniz. Aşağıdaki örnek, Command1 tıklatın olay kodda bir DLL işlevini kullanır:
   Sub Command1_Click ()
      Dim drive As String * 1
      Dim volume As String * 20
      Dim free As Long
      Call getdiskinfo(drive, volume, free)
      Text1.Text = drive
      Text2.Text = volume
      Text3.Text = Str$(free)
   End Sub
				

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual Basic 3.0 Professional Edition
  • Microsoft Visual Basic 3.0 Professional Edition
Anahtar Kelimeler: 
kbmt kbhowto kbprogramming KB106553 KbMttr
Otomatik TercümeOtomatik 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/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.