Tam Sürümünü Görmek İçin : DLL dosyalari
yastasinane
17/10/2006, 18:02
slm,
yazdigim dll dosyasindan programin kontrollerine ulasamiyorum. ornegin yazdigim dll dosyasindaki fonksiyonda ;
Form1->Label1->Caption = "vs..";
gibi bir komut varsa, dll dosyasinin compile 'i sirasinda " undefined symbol Form1" hatasi aliyorum.
bunu nasil asabiliriz ? yada asabilir miyiz ?
peacefire
17/10/2006, 18:40
dll oluşturma hakkında fazla bilgili değilim sadece düşüncemi söylemek istiyorum doğrumu yanlışmı bilmiyorum...
bir dll oluştuğun zaman özel bişey değilde genel bişey olması lazım o dll'de sen label1 falan kullanırsan sonra dll'i başkasına verdiğin zaman o kullanamaz...
sanırım dediğin gibi bişey yapılamaz.
tabi tam emin değilim bilen arkaşlar açıklarlarsa ikimizde öğrenmiz oluruz...
peacefire dll olusturmayi bilmesenizde bence guzel aciklamissiniz.
yastasine dll kodunuza Form1->Label1->Caption gibi bir sey ekleyip derlemesini bekliyemezsiniz. Ama bir dll yazip herhangi bir windows'un uzerindeki Label'larin Caption'larini degistirmek mumkun. Ancak sordugunuz soruya yerinde bir cevap verebilmek icin tam olarak ne yapmaya calisiyorsunuz onu anlamak lazim. Genel olarak bir cevap vermek gerekirse bu tur bir dll size ait olmayan bir programin penceresi uzerinde kontrol sahibi olma ihtiyaci duydugunuzda kullanilir. Ornegin soz konusu Form1'in penceresini kontrol etmek istersek bu pencerenin Window Handle (HWND) ini ele gecirmemiz gerek. Bu handle'i elde etmek icin bu pencerenin Window Class yada basitce Window Title'ini bilmemiz yeterli. Diyelimki Form1 penceresinin Window Title i yine Form1. Bu durumda HWND hWnd = ::FindWindow(0, "Form1"); dememiz yeterli. Daha sonra bu handle'i kullanarak Label box'in Window Handle'ini elde etmemiz gerekli. Eger bir tek Label box varsa asagidakine benzer bir API call kullanilabilir bu amacla.
HWND hWndLbl = ::FindWindowEx(hWnd, NULL, "STATIC", NULL);
Son olarakta ::SendMessage(hWndLbl, WM_SETTEXT, 0, (LPARAM)"vs.."); gibi bir cagri yapilarak istediginiz gerceklestirilebilir. Tabi bunlari hatirladigim kadari ile yaziyorum. Internette bu fonsiyonlara bakarsaniz cok daha detayli ve dogru bilgiler bulacaginizdan eminim.
undefined symbol dediğine göre, header dosyasını mı vermedin acaba ?
windows formları ile ilgili özel bir durum varsa bilemem.
ama genelde yapmal gereken header dosyası ile sembolleri tanımlaman.
ve dll'nin lib dosyasını projeye eklemen (yapmazsan link ederken hata alırsın).
kusura bakmayın yanlış anlamışım..:)
değiştirilecek nesne , dll fonksiyonlarına parametre olarak gönderilse sorun çözülür sanırım.
yastasinane
18/10/2006, 23:12
nasil ?
değiştirilecek nesne , dll fonksiyonlarına parametre olarak gönderilse sorun çözülür sanırım.
Bu sekilde cozulecegini sanmiyorum.
Diyelimki uyduruk bir sinifimiz var;
//some c++ kodu
class sinif{
private:
string s;
public:
sinif() { s = ""; }
~sinif() {};
void set(string str) { s = str; }
};
int main()
{
sinif a; // a yi dll fonksiyonuna parametre kullanmak istiyorsunuz
}
Bu noktada bir cift soru soralim.
1) Basitce set kullanmak varken neden dll?
2) Diyelimki bir nedenden dll'e ihtiyac oldu ama dll'e bu nesneyi nasil gececeksiniz?
DLL icinde asakidakine benzer bir islev tanimlamayi deneyebilirsiniz belki.
void somedllFunc(sinif x)
{
x.Set("vs..");
}
Ancak boyle bir kodu derlemek istediginizde yine hata alacaksiniz cunki DLL ne sinif nesnesinden nede uye islevlerinden haberdar.
Gerci mesru zeminde care tukenmezmis. Ancak DLL kullanmanin amaci ve manasi kalirmi bu noktadan sonra orasini bilemem.
...
Ancak boyle bir kodu derlemek istediginizde yine hata alacaksiniz cunki DLL ne sinif nesnesinden nede uye islevlerinden haberdar.
Gerci mesru zeminde care tukenmezmis. Ancak DLL kullanmanin amaci ve manasi kalirmi bu noktadan sonra orasini bilemem.
dll kullanımı gerekli mi konusunda haklı olabilirsin, yastasinane problemi tam anlatmamış, ben de bilemiyorum.
fakat Form sınıfı yastasinane kendi oluşturduğu bir sınıf değil,
oldukça genel amaçlı bir sınıf.
iş windows programlamaya girmeye başladığı için yazarken tereddütlüyüm.
fakat bu tarz bir yöntem kullanmadan, kendi geliştirdiğimiz görsel komponentleri dll haline getiremeyiz diye düşünüyorum.
@yastasinane
DLL derlenirken Form sınıfını bilebilir ( Form sınıfının header ini eklersin )
ve her fonksiyon ilk parametre olarak, bir Form işaretçisi kabul edebilir.
( ya da setForm.. filan gibi bir fonksiyon yazar bir defa da tanımlarsın..)
@sabahi
+1
haklısın,
yastasinane Form nesnesinin genel özelliklerine değil, kendi Form1'ine ulaşmaya çalışıyor, ben genel olarak Form nesnesinden bahsediyorum.
@yastasinane
ben bileşenleri tanımlarken, birbirlerini bilebilirler mi bilemezler mi karar vermek için doğum tarihlerine bakıyorum.
kronolojik sıralama:
Form sınıfı -> senin dll -> dll yi kullanacak Form(Form1).
bir bileşen kendisi yazıldıktan sonra yazılan birşeyi bilemez.
dll'nin Form1'in "icat ettiği" şeyleri kullanması mümkün değil.
kullanabilmesi sadece ve sadece Form1, Formdan türediği
(Form olmayı taahhüt ettiği ),
ve Form, dll den daha eski olduğu için mümkün.
yani özetle ,
Form1 in Form'dan aldıkları ile bağlısın.
Form sınıfının getComponents gibi bir metodu var ise bundan yararlanabilirsin.
yetmiyor ise Formdan bir sınıf türetirsin, yani yeni bir sözleşme yaratırsın.
( mesela "yeni Form" label1 içerir...)
dll yi bu "yeni Form" sınıfina göre yazarsın.
bundan sonraki Form1 lerini bu "yeni Form" sınıfından türetirsin.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.