Jump to page: 1 2
Thread overview
May 25, 2013

Daha önce burada ( http://ddili.org/forum/thread/1136 ) ve burada ( http://ddili.org/forum/thread/1131 ) bahsetmiş olduğumuz dinamik olarak runtime esnasında dll çağırıp işleve erişme işlemleri için az önce kafamda şimşekler çaktı diyebilirim :)

Tek bilmem gereken şey şu; fonksiyon çağırma işlemleri nasıl gerçekleşiyor?

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 25, 2013

Ali hocam yapacağım şey şu aslında.

Fonksiyona alacağı tüm verileri türsüz olarak byte olarak veya int olarak göndereceğim. Yani fonksiyonun yine hangi parametreleri aldığını script dili üzerinden belirtecekler ama int olarak belirtti ya 4 baytlık veri göndereceğim. Sonuç olarak fonksiyon ona int olarak davranacak ve zaten eğer script içerisinde string olarak belirtilirse bu sefer de haliyle hata verecek ama sonuç olarak fonksiyonu çağırabilecek ve statik olarak fonksiyon parametreleri tanımlanmamış olacak.

Sanırsam bu olayı yapabilmek için iasm kullanmak gerekecek. D dili buna müsaade etmiyordur gibime geliyor, iasm ile yapılabilir.

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 25, 2013

Bilmiyorum sanırsam ya tam anlayamadım yada anlatamadım ama http://ddili.org/forum/post/9108 adresindeki MessageBoxA, ClipCursor gibi işlevleri bu şekilde çalıştırmayı istiyorum. Yani bu şekilde fonksiyonu void* olarak tanımlamayacağım fonksiyon zaten var ve int alır, string alır ama ben onun int aldığını script dili üzerinden bilerek çağırma işlemi yapacağım.

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 25, 2013

Hocam demek istediğim bu değil bu işlevi ben tanımlamıyorum zaten tanımlanmış. Şöyle bir şey yaptım.

module main;

import std.stdio;

void x(int z, int z2){
	writeln(z," -- ", z2);
}

int main(string[] argv){

	asm{
		mov EAX, 2;
		push EAX;
		mov EAX,3;
		call x;
	}
  return 0;
}

Ama string işlemlerini beceremedim...

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 25, 2013

Soruyu doğru anladım mı? İşlev göstergesine dll içindeki işlevin adresi verilir ve işlev göstergesi bir işlev gibi çağrılır.

Ek: Bundan sonra çıkacak olan DConf konuşması Martin Nowak'ın "Shared libraries in D" konuşması. Pazartesi günü hazır olacak.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 25, 2013

C ailesinden olan sistem dilleri buna izin verir.

import std.stdio;

void foo(void * baytlar)
{
   int * gösterge = cast(int*)(baytlar);
   int değer = *gösterge;

   // ... burada 'değer' kullanılır ...

   writeln("aldığım parametre: ", değer);
}

void main()
{
   int i = 42;
   int * p = &i;
   foo(p);
}

'void*' yerine biraz daha güvenli olan 'void[]' de kullanılabilir. Ayrıca variadic parameter olanağı da var.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 25, 2013

aracıİşlev, sana ait bir işlev. Sen hangi asıl işlevi çağıracağını ve parametrenin aslında ne türde olduğunu biliyorsun:

void asılİşlev(string s)
{
   assert(s == "merhaba");
}

void aracıİşlev(void * parametre)
{
   // Sen bu noktada asılİşlev()'i çağırman gerektiğini ve onun string
   // aldığını biliyorsun. Onun için bize verilmiş olan void* parametresinin
   // bir string göstergesi olduğuna inanıyoruz:
   string s = *cast(string*)parametre;

   // ve çağırıyoruz:
   asılİşlev(s);
}

void main()
{
   // Çağıran tarafta aslında bir string var:
   string s = "merhaba";

   // Bir noktada bu bilgiyi kaybediyoruz:
   void * p = &s;

   // aracıİşlev'in doğru türü bildiğine güvenerek tür bilgisini kaybetmiş
   // olan parametremizi gönderiyoruz:
   aracıİşlev(p);
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 27, 2013

Evet onun string aldığını biliyorum ama,
(int, string, int, bir struct) gibi daha kompleks ve çeşitli yapılar gelebilir bu noktada string s gibi tanımlamam doğru olmayacaktır.

Biraz asm boyutunu inceledim ve her şey push metodu ile stacka atılıyor. String gönderildiğinde ise string içerisinde int ve ptr bulunduğu için ikisini ayrı ayrı push ediyoruz. Bu şekilde fonksiyon çağırılacak, yapıyı çözdüm ve ilerleyen zamanlarda kodları burada paylaşacağım...

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 26, 2013

İşlevi senin tanımladığı düşünmedim.

Örnekteki foo, sana ait olmayan ama bildirimini senin bildiğin bir işlev olsun. Ben kod içine yazdım ama bir DLL içinde de tanımlı olabilir. Sen yalnızca onun string aldığını biliyorsun.

Örnekteki aracıİşlev sensin. Elinde yalnızca void* diye bir parametre var. Onun aslında ne olduğunu bilemezsin ama anlaşmalara uygun olarak onun foo'yu çağırırken kullanılacağını bildiğin için buna güvenerek onu bir string* gibi kullanıyor ve foo'yu o string ile çağırıyorsun.

Bu, C'de de çok uygulanan bir yöntemdir. İşlev çağrısı perde arkasında senin assembly'den farklı olmayacaktır. D'de daha temiz ve güvenli çözümler de bulunabilir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 27, 2013

Ali hocam an itibariyle istediğimi gerçekleştirmiş bulunmaktayım...

Ama http://ddili.org/forum/post/9108 adresindeki GetProcAddress komutunu kullanarak compiled time işlevi tanımlamadan yapabilirim inşallah. Belki dll çağırmalarında asm boyutunda farklı kodlar çalışıyor ama eğer çalışmıyorsa şu anda doğrudan bu sisteme uygulayabilirim.

module main;

import std.stdio;
import core.memory;

void xx(int a, int b, string x){
	writeln(x, a+b);
}
struct adata{
	uint typ;
	void* veri;
}
enum{
	INT, STRING
}
int main(string[] argv){
	int sayi1 = 40;
	xx();
	int sayi2 = 20;
	string metin = "toplam = ";
	adata[] dizi = [adata(INT, &sayi1), adata(INT, &sayi1), adata(STRING, &metin)];

	foreach(d; dizi){
		final switch(d.typ){
			case INT:
				int x = *cast(int*) d.veri;
				asm{push x;}
			case STRING:
				string x = *cast(string*) d.veri;
				auto l= x.length;
				auto c = x.ptr;
				asm{
					push c;
					push l;
				}
				break;
		}
	}
	asm{
		call xx;
	}


	while(1){}
  return 0;
}

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2