Derelict'in programcısı olduğunu bilmiyordum
Ama benim paylaştığım 4. parça ki bu yeni bir haber...:)
İlinti hazırlamada uzmanlaşmış olduğu belli ki yazı dizisi bu konu üzerine. Şöyle bir tekniğini incelemeye niyetlendim de kafam karıştı! Bakınız, benim extern(C) olarak geçtiğim ilintiyi, herhalde hafızayı daha iyi kullanabilmek adına nasıl yapmış:
'(Bu arada export ... ile align(16) struct gibi şeyler gördüm!)'
class DerelictSDL2Loader : SharedLibLoader
{
protected
{
override void loadSymbols()
{
bindFunc(cast(void**)&SDL_Init, "SDL_Init");
: : :
Yukarıda ilk dikkat çeken bindFunc() işlevi. Şimdi bir dedektif gibi iz sürelim. Ayrıca sınıfı destructor'ünde DerelictSDL2.unload(); şeklinde çağrılan bir işlev de olduğunu belirtmeliyim!
**1. **İlk olarak derelict.util.loader (https://github.com/aldacron/Derelict3/blob/master/import/derelict/util/loader.d)'a gidiyorum ve oradaki SharedLibLoader sınıfını görüyorum:
class SharedLibLoader
{
public:
this(string libNames)
{
_lib = new SharedLib();
_libNames = libNames;
}
: : :
Ama dikkat, burası sadece bir sıçrama tahtası! Çünkü asıl işi yapan _lib isimli nesne üzerinden SharedLib sınıfı olmalı. Yukarıdaki satırların hemen altında da üç tane aynı isimde load() üyesi var. Tabi peşine düştüğüm bindFunc() işlevi orada ama bütün iş burada değil. Sanırım burada tablo (libNames) küçük parçalara bölünerek aşamalı bir yükleme yapılıyor. Devam edelim...
**2. **Şimdi ise derelict.util.sharedlib (https://github.com/aldacron/Derelict3/blob/master/import/derelict/util/sharedlib.d)'e ışınlanıyoruz ve 47. satırda extern(C)'mi görüyorum...:)
final class SharedLib
{
public
{
: : :
void load(string[] names)
{
if(isLoaded)
return;
string[] failedLibs;
string[] reasons;
foreach(n; names)
{
_hlib = LoadSharedLib(n);
if(_hlib !is null)
{
_name = n;
break;
}
failedLibs ~= n;
reasons ~= GetErrorStr();
}
if(!isLoaded)
{
SharedLibLoadException.throwNew(failedLibs, reasons);
}
}
: : :
Burada da dikkat çeken yüklenip yüklenmediğini denetlemesi ve hata atması. Sanki bütün mevzu buradaymış gibi ama tüm kodu incelerseniz değil. Bu da bir sıçrama tahtası sayılır ve asıl işi dopen() ile dlclose() işlevleri yapıyor. Peki bunlar nerede...:)
**3. **Hatırlarsanız bundan önceki adımda 47. satır (https://github.com/aldacron/Derelict3/blob/master/import/derelict/util/sharedlib.d#L47)dan bahsetmiştim. İşte o bölümde şu yazıyor:
/* From <dlfcn.h>
* See http://www.opengroup.org/onlinepubs/007908799/xsh/dlsym.html
*/
const int RTLD_NOW = 2;
void *dlopen(const(char)* file, int mode);
int dlclose(void* handle);
void *dlsym(void* handle, const(char*) name);
const(char)* dlerror();
Meğer extern(C) yukarıda bahsettiğim iki işlevi çağırıyormuş. Bu işlevler ise kütüphanenin içindeki işlevi arayıp buluyor ve zannedersem adresini (getSymbol) geri döndürüyor...
Benden bu kadar! Sürebildiğim iz bu ki bana fazla geliyor. Hep diyorum ya basit şeyleri seviyorum. İşin içine bir çok sınıf girince ürkütüyor. Sanırım bu huyumdan vazgeçmeliyim çünkü yazılım sektörü böyle...:)
Sevgiler, saygılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]