Merhaba,
Son günlerde GtkD, SDL derken kütüphaneler ile içli dışlı olup ilinti yazmaya başladık. İster istemez, D'de yazdığımız bir kodu diğer dillerden kullanılabilmesi için nasıl kütüphane yazmamız gerektiğini merak ediyor insan. Aslında bu konuda, çektiğiniz her DMD paketi içindeki samples dizininde, mydll isminde bir örnek var. Ama deneyip tecrübe edelim mi? Öğrencek çok şeyimiz olabilir ki eğer forumda tartışılmadıysa işte şimdi tam vakti...:)
Geçen gün Erdem'den öğrendiğim kadarıyla DMD eski bir bağlayıcı (OptLink) kullanıyormuş ama Borland ile uyumlu olduğu için SDL'nin Borland ile derlenmiş LIB dosyalarını kullanıyormuşuz. Kendi LIB dosyalarımız için ise sanırım, core.sys.windows.dll sınıfını çağırarak Dllmain() işlevi oluşturmak ve modüller ile birlikte derlemek gerekiyor. Neticede iki OBJ (biri kütüphaneyi derlerken) bir de LIB dosyası oluşuyor. İkinci derlemede de EXE oluşurken DLL ile birlikte çalışıyormuş. Aslında DLL'de EXE boyutlarında bir dosya oluyor ve o da bir uygulama; herhalde runtime'ı olmayan bir uygulama?
Bakınız bahsettiğim örneğin dosyaları şöyle:
Alıntı ("mydll.d"):
> module mydll;
> import std.c.stdio;
>
> export void dllprint() { printf("hello dll world\n"); }
> ```
>
Alıntı ("mydll.def"):
>
>
> LIBRARY "mydll.dll"
EXETYPE NT
SUBSYSTEM WINDOWS
CODE SHARED EXECUTE
DATA WRITE
>
Alıntı ("dll.d"):
>> import std.c.windows.windows;
> import core.sys.windows.dll;
>
> __gshared HINSTANCE g_hInst;
>
> extern (Windows) BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved) {
> switch (ulReason) {
> case DLL_PROCESS_ATTACH:
> g_hInst = hInstance;
> dll_process_attach( hInstance, true );
> break;
> case DLL_PROCESS_DETACH:
> dll_process_detach( hInstance, true );
> break;
> case DLL_THREAD_ATTACH:
> dll_thread_attach( true, true );
> break;
> case DLL_THREAD_DETACH:
> dll_thread_detach( true, true );
> break;
> default:
> assert(0);
> }
> return true;
> }
> ```
>
Bunları ise şu şekilde derliyormuşuz:
'
dmd -ofmydll.dll -L/IMPLIB mydll.d dll.d mydll.def
'
Neyicede ortaya bir OBJ, bir LIB ve de bir DLL dosyası çıkıyor. Kısaca şu kod ile de deneyebiliyoruz:
Alıntı ("test.d"):
>
>
> import mydll;
int main()
{
mydll.dllprint();
return 0;
}
>
Derlemek için ise genelde yaptığımız gibi şöyle yapıyoruz:
'dmd test.d mydll.lib'
En son mydll.dll dosyasının uzantısını exe yaparak çalıştırmayı denedim de "geçerli bir Win32 uygulaması değil" şeklinde bir uyarı aldım. Sanırım bizim başlangıçta çalışan main() işlevi bu DLL içinde bulunmadığı için böyle oluyor. Belkide dll.d dosyası yapısını değiştiriyor.
Sevgiler, saygılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]