2012-07-28 34 views
7

C ile ilgili konular için Google'da arama yapmak çok zor çünkü C# veya C++ ile ilgili sonuçları C değil, C ile sonuçlandırmaya devam ediyorum, bu yüzden birileri bana hızlı ve kolay bir cevap verebilir. Bir LIB dosyası olmadan C'deki bir DLL'deki işlevleri nasıl kullanabilirim? Tüm fonksiyon prototiplerini ve isimlerini biliyorum.lib kullanmadan C içinde DLL kullanın

Şimdiden teşekkürler!

+0

Sana kardeşim hissediyorum! C arkaya doğru daha fazla sürüklenir .. – displayname

cevap

8

Evet yapabilirsiniz. Sen, GetProcAddress işlevini kullanmalısınız

Süreçler açıkça LIB karıştığı DLL verilen bir fonksiyonun adresi elde etmek için bir DLL çağrı GetProcAddress bağlamadan, DLL doğrudan işlevi çağırmak için. DLL işlevini çağırmak için döndürülen işlev işaretçisini kullanın.

yukarıdaki bağlantıdan Örnek alıntı:

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); 
    } 
} 
+2

Bu benim yapacağım şey. Bu proje bittiğinde size deneyimlerimi anlatacağım. Eski bir bilgisayarda çalışan eski bir eski Winradio 3000 serisi kartı uzaktan kontrol etmeye çalışıyorum. Babam nerede olursa olsun onu kullanabilir ve uzaktan kontrolün sihirli bir şekilde yapılması kolay olacağını düşünür. Eh, bir bilgisayardan diğerine müzik akışı var şimdi bir başlangıç ​​var, şimdi sadece winradio ile birlikte gelen DLL ile kontrolleri uygulamak gerekir ve babamın sihirli uzaktan kumanda bitmiş olacak. –

+0

Oh ve sonra bir kullanıcı arayüzü yapmam gerekiyor sanırım ... –

+0

Evet, bu çok iyi çalışıyor! Gerçekten hiçbir şey yok. Winradio API'sının dokümantasyonu biraz kafa karıştırıcıydı (dünyalarındaki DWORD, görünüşte dünyamda uzun zamandır imzasız). Bunun dışında bu çok kolaydı. Çok teşekkürler! –

3

Sen LoadLibrary() ve DarkXphenomenon tarafından cevap açıklandığı gibi GetProcAddress() kullanabilirsiniz. Veya başka bir alternatif, bir .def dosyası oluşturarak ve bir içe aktarma kitaplığı oluşturmak için bunu LIB komutuyla çalıştırarak DLL için kendi içe aktarma kitaplığınızı oluşturmaktır. Burada Ek ayrıntılar:

http://support.microsoft.com/kb/131313