Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Selamün Aleyküm,
Hepimize kolay gelsin,
Başka bir dil ile yazılımış dll içerisindeki formları Delphide açmak istiyorum, ama uzun bir zaman oldu bununla ilgili bir örnek bulamadım. Birde Trubo Delphi 2006 ile yazdığım bir dll içerisindeki formu Delphi.net ile açamıyorum.DLL dosyalarının çağrılması için hangi dilde yazıldığının bir önemi yok bunu biliyorum ama, dll içerisinde form varsa, ve bu form VCL harici bir form ise bunlar delphide nasıl çağrılır.Formda ve offline v3. dosyasında aradım gerçekten bulamadım. Vcl olan formları çağırmakla ilgili güzel örnekler var ama diğer diller ile tasarlanmış formları açan bir örneğe rastlayamadım.
Delphide dll çağırırken yada dll içerisindeki procedure ve function çağırırken belli bir standart yokmu?
yani ben bir kod yazayım dll içerisindeki form ister vb de tasarlanmış olsun ister delphi. her ikisini birden açabilecek standart bir yöntem varmıdır?
Şimdiden teşekkürler.
Hepimize kolay gelsin,
Başka bir dil ile yazılımış dll içerisindeki formları Delphide açmak istiyorum, ama uzun bir zaman oldu bununla ilgili bir örnek bulamadım. Birde Trubo Delphi 2006 ile yazdığım bir dll içerisindeki formu Delphi.net ile açamıyorum.DLL dosyalarının çağrılması için hangi dilde yazıldığının bir önemi yok bunu biliyorum ama, dll içerisinde form varsa, ve bu form VCL harici bir form ise bunlar delphide nasıl çağrılır.Formda ve offline v3. dosyasında aradım gerçekten bulamadım. Vcl olan formları çağırmakla ilgili güzel örnekler var ama diğer diller ile tasarlanmış formları açan bir örneğe rastlayamadım.
Delphide dll çağırırken yada dll içerisindeki procedure ve function çağırırken belli bir standart yokmu?
yani ben bir kod yazayım dll içerisindeki form ister vb de tasarlanmış olsun ister delphi. her ikisini birden açabilecek standart bir yöntem varmıdır?
Şimdiden teşekkürler.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
.dll'ler bünyelerinde sadece fonksiyonları barındırırlar. Dll'de yazılmış olan bu fonksiyonlar form açarsa açar, açmazsa açmaz. Mantık bundan ibaret. Senin tek yapman gereken .dll de çalışacak işlemleri bir fonksiyon içinde gerektiği gibi hazırlamak, o kadar. Daha sonra programlarından bu fonksiyonu kullanarak gerekli işlemlerini gerçekleştirebilirsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Öncelikle vermiş olduğun cevap için çok teşekkür ederim. Ben bir dll oluştururken zaten dediğin gibi yapıyorum. Yani bir Procedure yada function içerisinde formu creat ediyorum ve formun show olayını çağırıyorum.sonrada fonsiyon yada procedure ismini exports ile dışarı gönderiyorum. dll dosyasını delhi .net ile yaptığımda ve dll li ve içerisindeki procedure yada fonction'u çağıran programıda delphi .net ile yazığımda bir sorun yok, dll içerisinde oluşturduğum form açılıyor. ama aynı dll'li delphi 2006 ile çağırıp içerisindeki fonksiyonu çalıştırmak istediğimde access violation hatası veriyor. bu hata procedure'nin çalıştırıldığı satırda veriyor. yani dll çğırma satırlarını geçiyor. sıra içerisindeki fonksiyon yada procedure' yi çalıştırmaya geldiğinde bu hatayı veriyor.sabanakman yazdı:.dll'ler bünyelerinde sadece fonksiyonları barındırırlar. Dll'de yazılmış olan bu fonksiyonlar form açarsa açar, açmazsa açmaz. Mantık bundan ibaret. Senin tek yapman gereken .dll de çalışacak işlemleri bir fonksiyon içinde gerektiği gibi hazırlamak, o kadar. Daha sonra programlarından bu fonksiyonu kullanarak gerekli işlemlerini gerçekleştirebilirsin.
Selamlar.
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
s.a.
ozaman dll projesinin run parameters kısmına d2006 ile oluşturduğun exeyi göster.
d2007 den dlle breakpoint koyarak çalıştır hangi satırda hata verdiğine bak bakalım.
eğer 2006 ile denediğin makinede 2007 yüklü değilse dll de kullandığın bileşenlerin istediği dosyalardana biri sisteminde olmayabilir.
kolay gelsin.
ozaman dll projesinin run parameters kısmına d2006 ile oluşturduğun exeyi göster.
d2007 den dlle breakpoint koyarak çalıştır hangi satırda hata verdiğine bak bakalım.
eğer 2006 ile denediğin makinede 2007 yüklü değilse dll de kullandığın bileşenlerin istediği dosyalardana biri sisteminde olmayabilir.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
as.aslangeri yazdı:s.a.
ozaman dll projesinin run parameters kısmına d2006 ile oluşturduğun exeyi göster.
d2007 den dlle breakpoint koyarak çalıştır hangi satırda hata verdiğine bak bakalım.
eğer 2006 ile denediğin makinede 2007 yüklü değilse dll de kullandığın bileşenlerin istediği dosyalardana biri sisteminde olmayabilir.
kolay gelsin.
Cevabın için sanada çok teşekkür ederim @aslangeri. Bu iş için çok vakit kaybettiğimden yapmak istediğim özellikten vazgeçtim. Bunuda vermiş olduğun cevabı doğru varsayarak, her farklı bir dille yazılmış dll içinde kullanılan bileşenlere ait dosyanın sistemde yüklü olması gerekliliği etkili oldu.Neden dersen;
Benim düşüncem şu şekildeydi,
Projemde dinamik olarak bir menü dizayn ediyordum, onclick olaylarınada dll ve içerisindeki fonksiyon yada procedurleri dinamik olarak çağıran kodlar yer alacaktı. dll isimini, ve içerisindeki fonksiyon adlarını formatı standarlaştırılmış bir tablodan okuyacaktım. bundaki maksadım, son kullanıcılar kendi dll lerini yazarak,çalışan programa menü ilave ederek, bu menüyle kendi dll lerini çağırabilsinler, çalıştırabilsinlerdi.
yani benim yazdığım program belkide başka bir müşteride ben bile tanıyamayacaktım.
ama şimdi her dil ile kullanılan bileşenler farklı olduğunda, dll içerisindeki fonksiyonlar çalışırken bir sürü farklı dosyaya ihtiyaç duyacak demektir.bunların neler olduğunu bilebilmek belkide imkansız denecek kadar zor, çünkü kişiler dll dosyalarını neyle yazacaklarını bilmeyorum.
bundan dolayı sadece projeme dizayn yapma özelliği koydum.
ama o dediğim fikri unutmuş değilim, araştıracağım.
Hayırlı akşamlar olsun,
selam ve dua ile
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
bi yerde gozunuzden kacan ufak bir ayrinti var. mantiken exe ile dll in hangi delphi surumu ile ya da hangi programlama dili ile yazildiginin bi onemi olmamasi gerekir hersey raconuna uygun yazildiysa. dll in calismak icin ihtiyac duyacagi dosyalar ise dll i yazan kisiye ve de dll in gelistirildigi programlama diline baglidir. eger siz dll i delphi ile derliyorsaniz ve gerekli paketleri de icerisine ekliyorsaniz dll hicbir dosyaya ihtiyac duymadan calisacaktir. eger paketleri dll e dahil etmiyorsaniz ya da dll vb ile yazilmis ise gerekli olan dosyalar (vclxx.bpl ya da vbrunxxx.dll) bilgisayarda olmasi gerekir.
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
vermiş olduğun cevap için teşekkür ederim @sadettinpolat. Yüreğüme su serptin diyebilirim. Ben şuan projemi dll ile yapıyorum, yani parça parça. zaten dinamik olarak menümde var. tüm çalışmalarımı bitirince yine dediğim şekilde bir yapıya döneceğim inşallah.sadettinpolat yazdı:bi yerde gozunuzden kacan ufak bir ayrinti var. mantiken exe ile dll in hangi delphi surumu ile ya da hangi programlama dili ile yazildiginin bi onemi olmamasi gerekir hersey raconuna uygun yazildiysa. dll in calismak icin ihtiyac duyacagi dosyalar ise dll i yazan kisiye ve de dll in gelistirildigi programlama diline baglidir. eger siz dll i delphi ile derliyorsaniz ve gerekli paketleri de icerisine ekliyorsaniz dll hicbir dosyaya ihtiyac duymadan calisacaktir. eger paketleri dll e dahil etmiyorsaniz ya da dll vb ile yazilmis ise gerekli olan dosyalar (vclxx.bpl ya da vbrunxxx.dll) bilgisayarda olmasi gerekir.
Selamlar...
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Modüler bir yapı kurmak için mi tercih ediyorsun bu yöntemi?
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
evet, hem modüler bir yapı, hemde son kullanıcılar program ile ilgili isteklerinde, bize bağımlı kalmaksızın, kendi dlllerini yazıp yada bir başkasına yazdırıp programa ek işlevler kazandırmaktı maksadım.yani esnek bir program olsun istedim.aLonE CoDeR yazdı:Modüler bir yapı kurmak için mi tercih ediyorsun bu yöntemi?
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Esnek kütüphane yapısı olarak, .bpl yapısını kullanmayı tercih edebilirsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Gerek dll ve gerekse bpl kullanılarak geliştirilen projelerde debug işlemleri oldukça zahmetlidir o nedenle bir kez daha düşün derim.
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Artık çok geç. projeye başladım. artık zorlukları hep beraber yenceğizaLonE CoDeR yazdı:Gerek dll ve gerekse bpl kullanılarak geliştirilen projelerde debug işlemleri oldukça zahmetlidir o nedenle bir kez daha düşün derim.

Selamlar...
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Konuya burada bende bir kaç şey eklemek isterim izninizle.
Ne zamandır üzerinde çalıştığım bir projem var aslında projelerim var projemin adı ShurzanOp 2.0
Bu proje bir ana modül ve üç alt modülden meydana geliyor alt modüllerinin üçüde dll form'u
1. Kopya dosya arayan modül 2. Temp dosyaları arayan modül. ve 3 Registry ayar modülü
üçünüde dll olarak hazıladım ayrıca tüm modüllerde ortak kollandığım kendi fonksiyonlarımıda fonkasiyonlar.dll adlı dll dosyası olarak hazırladım yani bu konuda bazı deneyimler kazandım onları sizlerle paylaşmaktan zevk alırım.
Öncelikle herkesçe bilinir ki dll kollanan uygulama o dll içerisindeki fonkasiyonları kullanabilmesi için dll'ye iki türlü bağlanır Statik ve dinamik
Statik bağlanılacaksa dll projeni derlediğinde dll dosyandan hariç birde lib dosyan olacaktır bunuda dll kullanan uygulama projene dahil edilmeli yada kod satırıyla link verilmeli (örnek: #pragma link "LM324.lib" şekinde) böylece uygulamanız derlendiğinde dll yi load etmek free etmek ve fonkasiyonlarınızın adreslerini almak gibi bir zahmet ile uğraşmazsınız.
fonksiyonlarınızı dil söz diziminize göre deklare etmeniz yeterli
C++ örneği:
Ancak bunun şöyle bazı dezavantajları var
1. dll uygulama başlangıcında doğrudan load olur uygulama close olduğunda free edilir
yani ne zaman load edileceği ne zaman bellekten atılacağı sizin kontrolünüzde olmaz.
2.Ayrıca bu lib dosyası aynı derleyici ile üretilmesi gerekir( yanılıyorsam düzeltin) ve
3. bu bir dll formuysa ve bu forum forumun Create ve Close olması durumunda bazı erişim hatalarının oluşmaması için doğru kodlama yapılması gerekir
Örneğin dllformunu çalıştırdığınızda Create edip haliyle ShowModal edilecektir ve daha sonraki satırlarda da Free edilecektir
ama unutulmaması gereken konu şu o dll çağıran uygulamada load edilmiş durumda forum free edilsede o dll hala bellekte!
Dinamik olarak uygulamanıza bağlayabilmeniz için Windows'un LoadLibrary Apisini kullanacak FreeLibrary api ile istediğiniz zaman bellekten atabileceksiniz bu durumda lib dosyası gerekmez. aynı derleyici ile yazılmasına gerek yok ama fonksiyonun adresini alırken doğru yazılmalı Borlan derleyiciler ile derlenmiş dll lerde fonksiyon adlarının başına bir alt çizgi karakteri konulduğunu gördüm aşağıda ki örnekte olduğu gibi...
Bunlardan hariç dll içindeki çağrılan fonksiyonların ihtiyacı olan parametrelerinin türlerine geri dönüş türlerine dikkat edilmeli
Örneğin Borland ile yazılmış bir dll de fonksiyonun parametrelerinde eğer Bir TStringList kullanımış ve bu dll bir başka Builder de hazırlanan uygulamada kullanılacaksa ve ve gerek duyduğu bu türden değişkeni yoksa kullanılamayacaktır dönüş türüde aynı şekilde.
Hazırlayacağınız dll eğer genel amaçlı kullanılacaksa parametrelerinde ve geri dönüş türlerinde doğal türleri kullanın.
Son olarak dll projeleri hazırlamak zahmetli ama çok gereklidir Bir Coder için bilmesi gereken konudur tüm projenizi tek bir exe içine koymanız ne kadar doğru olur ayrıca tekrar eden kod yazmak coder için daha zahmetlidir aynı fonksiyon birden fazla projede yada uygulamada kullanılacaksa dll olarak hazırlamak daha doğru olur.
Saygılar...
Ne zamandır üzerinde çalıştığım bir projem var aslında projelerim var projemin adı ShurzanOp 2.0
Bu proje bir ana modül ve üç alt modülden meydana geliyor alt modüllerinin üçüde dll form'u
1. Kopya dosya arayan modül 2. Temp dosyaları arayan modül. ve 3 Registry ayar modülü
üçünüde dll olarak hazıladım ayrıca tüm modüllerde ortak kollandığım kendi fonksiyonlarımıda fonkasiyonlar.dll adlı dll dosyası olarak hazırladım yani bu konuda bazı deneyimler kazandım onları sizlerle paylaşmaktan zevk alırım.
Öncelikle herkesçe bilinir ki dll kollanan uygulama o dll içerisindeki fonkasiyonları kullanabilmesi için dll'ye iki türlü bağlanır Statik ve dinamik
Statik bağlanılacaksa dll projeni derlediğinde dll dosyandan hariç birde lib dosyan olacaktır bunuda dll kullanan uygulama projene dahil edilmeli yada kod satırıyla link verilmeli (örnek: #pragma link "LM324.lib" şekinde) böylece uygulamanız derlendiğinde dll yi load etmek free etmek ve fonkasiyonlarınızın adreslerini almak gibi bir zahmet ile uğraşmazsınız.
fonksiyonlarınızı dil söz diziminize göre deklare etmeniz yeterli
C++ örneği:
Kod: Tümünü seç
extern "C" __declspec(dllimport)String getlines(const String , char , unsigned int = 0);
1. dll uygulama başlangıcında doğrudan load olur uygulama close olduğunda free edilir
yani ne zaman load edileceği ne zaman bellekten atılacağı sizin kontrolünüzde olmaz.
2.Ayrıca bu lib dosyası aynı derleyici ile üretilmesi gerekir( yanılıyorsam düzeltin) ve
3. bu bir dll formuysa ve bu forum forumun Create ve Close olması durumunda bazı erişim hatalarının oluşmaması için doğru kodlama yapılması gerekir
Örneğin dllformunu çalıştırdığınızda Create edip haliyle ShowModal edilecektir ve daha sonraki satırlarda da Free edilecektir
ama unutulmaması gereken konu şu o dll çağıran uygulamada load edilmiş durumda forum free edilsede o dll hala bellekte!
Dinamik olarak uygulamanıza bağlayabilmeniz için Windows'un LoadLibrary Apisini kullanacak FreeLibrary api ile istediğiniz zaman bellekten atabileceksiniz bu durumda lib dosyası gerekmez. aynı derleyici ile yazılmasına gerek yok ama fonksiyonun adresini alırken doğru yazılmalı Borlan derleyiciler ile derlenmiş dll lerde fonksiyon adlarının başına bir alt çizgi karakteri konulduğunu gördüm aşağıda ki örnekte olduğu gibi...
Kod: Tümünü seç
typedef __declspec(dllimport)String FONKSIYONU_GOSTEREN_GOSTERICI_TURU(const String , char , unsigned int = 0);
FONKSIYONU_GOSTEREN_GOSTERICI_TURU *getlines;
getlines= (FONKSIYONU_GOSTEREN_GOSTERICI_TURU*)GetProcAddress(hDLL, "_getlines");
Örneğin Borland ile yazılmış bir dll de fonksiyonun parametrelerinde eğer Bir TStringList kullanımış ve bu dll bir başka Builder de hazırlanan uygulamada kullanılacaksa ve ve gerek duyduğu bu türden değişkeni yoksa kullanılamayacaktır dönüş türüde aynı şekilde.
Hazırlayacağınız dll eğer genel amaçlı kullanılacaksa parametrelerinde ve geri dönüş türlerinde doğal türleri kullanın.
Son olarak dll projeleri hazırlamak zahmetli ama çok gereklidir Bir Coder için bilmesi gereken konudur tüm projenizi tek bir exe içine koymanız ne kadar doğru olur ayrıca tekrar eden kod yazmak coder için daha zahmetlidir aynı fonksiyon birden fazla projede yada uygulamada kullanılacaksa dll olarak hazırlamak daha doğru olur.
Saygılar...
Re: Dll içerisinde VCL olmayan formlar Delphi'de nasıl Açılır ?
Konuya açılma yaparken esas soruya cevap vermeyi es geçmişim kusura bakma arkadaş 
Eğer senin dll formun çağrılıken foksiyonda VCL kütüphanesine ait olmayan vede doğal değişken türlerinden değilde derlendiği buildere ait kütüphane değişkenlerini parametre ve dönüş türü olarak kullanmışsa bu dll yi kullanamazsın yada o değişkenlerin olduğu kütüphaneyi kendi builderine yüklemelisin.
Eğer yukarıdaki gibi değilde doğal tür değişkenlerden yada bu değişkenler senin builderinde varsa sorunsuz kullanabilirsin.
Tabi dinamik bağlıyarak kullanabileceksin çünkü o derleyicinin hazırlamış olduğu lib dosyası senin builderine uyum göstermeyebilir yani statik kullanmanı tavsiye etmem dinamik bağlantıyla dll yi kullan.

Eğer senin dll formun çağrılıken foksiyonda VCL kütüphanesine ait olmayan vede doğal değişken türlerinden değilde derlendiği buildere ait kütüphane değişkenlerini parametre ve dönüş türü olarak kullanmışsa bu dll yi kullanamazsın yada o değişkenlerin olduğu kütüphaneyi kendi builderine yüklemelisin.
Eğer yukarıdaki gibi değilde doğal tür değişkenlerden yada bu değişkenler senin builderinde varsa sorunsuz kullanabilirsin.
Tabi dinamik bağlıyarak kullanabileceksin çünkü o derleyicinin hazırlamış olduğu lib dosyası senin builderine uyum göstermeyebilir yani statik kullanmanı tavsiye etmem dinamik bağlantıyla dll yi kullan.