CBuilder da DLL Sorunu
lazio29.03.2004 - 21:55:21
merhabalar,
delphi de hazırlamış olduğum dll dosyasını CBuilder a nasıl gömebilirim.
aslında ben "Add to Project" seçeneği ile dll yi programa ekliyorum ve
boş bir *.cpp dosyası açıp fonksiyonları görünen tanımlarını ve dllimport yöntemi ile çağıracağımı yazıyorum. daha sonrada projedeki herhangi bir forum dosyasından çağırıyorum(tabii formun header ınada cpp dosyasını tanıtıyorum). işte tam bu noktada programı derlerken formun obj dosyası ile ilgili hata veriyor. unresolve export .... xx.obj gibi bişey..
benim yaptığım yanlışmı eksikmi..
teşekkürler..
 
warder31.03.2004 - 23:39:41
Add to Project ile dll programa eklenmez.
dll yi kullanmanın yolları delphi de neyse builder de de aynı olmalı.
Yani dinamik veya statik. sanıyorum siz bunları zaten biliyorsunuz.
Amacınız statik kullanmaksa. Add to Project ile *.dll dosyasının aynı adlı *.lib dosyasını projeye eklemeniz gerekiyor. *.dll dosyasını system, system32, windows klasörlerinden birisinde ya da *.exe ile aynı klasörde bulundurmalısınız.
dinamik kullanmayı düşünüyorsanız herhengi bir şey eklemenize gerek yok
 
lazio01.04.2004 - 15:21:53
merhaba,
normalde delphi de dll yi tanımlarken
function xxxx(); extern "dlladi.dll" gibi tanımlıyoruz.
ancak c de böyle bir olay yok bildiğim kadarıyla, ve böyle bir olay yoksa ilgili fonk. hangi dll nin içinde olduğunu nasıl anlatacağız. ayrıca dll yi delphi de yazdım yani elimde *.lib dosyası yok..
teşekkürler..
 
gkimirti01.04.2004 - 16:02:36
bilmiyorum ama c de bir dll deki fonksiyonu kullanmak icin header dosyanda fonksiyonların prototipini belirtmen lazım
bu da delphi de ki tanımlamanın bir benzeri olmalı
 
lazio01.04.2004 - 16:26:25
evet, bende bir header dosyasına fonksiyonları tanımlıyorum
extern __d... xxx(int) şeklinde
ama burada delphi deki gibi dll dosyasının adını yazamıyorum, yabi c deki kullanımı bu şekilde değil..
doğrusu nasıl bilemiyorum
 
warder01.04.2004 - 23:46:53
merhaba,
normalde delphi de dll yi tanımlarken
function xxxx(); extern "dlladi.dll" gibi tanımlıyoruz.
ancak c de böyle bir olay yok bildiğim kadarıyla, ve böyle bir olay yoksa ilgili fonk. hangi dll nin içinde olduğunu nasıl anlatacağız. ayrıca dll yi delphi de yazdım yani elimde *.lib dosyası yok..
teşekkürler..

Mesajlarınızda dikkatimi çeken, konuyu fazla abarttığınız.
Tabii bu doğal hakkınız. Sadece aslında o kadar zor olmadığını vurgulamak istiyorum.
öncelikle *.lib dosyasını nasıl oluşturacaksınız:
builder/bin dizininde implib.exe var. lib dosyası yapacağınız dll yi bu dizine taşıdıktan sonra (istersen taşıma. ben kolayıma geleni öneriyorum)
komut satırında aynı dizine geldikten sonra aşağıdaki örneğe uygun olanı enterlayın.
C:\...vs.\vs.\ bin\implib istediğinizisim.lib dllninadı.dll
buradaki istediğinizisim.lib genelde dll ile aynı ad olarak kullanılır. adettendir.
böylece aynı dizinde *.lib dosyası da oluşur. Bu lib dosyasını Add to project ile eklemelisiniz.
dll dosyasında export ettiğiniz fonksiyonları şimdi import edip kullanabilirsiniz.
örnek export...


#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
double __export AsagiYuvarla(double sayi)
{
.....vs.vs.
return sonuc;
}
//---------------------------------------------------------------------------
double __export YukariYuvarla(double sayi)
{
...vs.vs..
return sonuc;
}
//---------------------------------------------------------------------------


örnek import:

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

double __import AsagiYuvarla(double sayi);
double __import YukariYuvarla(double sayi);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


bir static dll kullanımı bundan ibaret.
 
lazio06.04.2004 - 19:55:22
ilginize teşekkürler, deneyeceğim..
 
lazio10.08.2004 - 16:45:55

[Linker Error] Unresolved external 'BilgiOk(System::AnsiString)' referenced from G:\DLL_DENE\UNIT1.OBJ


bu mesaj ne anlama geliyor acaba Shocked

kullanmak istediğim dll yi tanımlıyorum..

TCevap __import BilgiOk(AnsiString msg);

sorun yok. derlediğimde hiçbir hata vermiyor..
ancak

void __fastcall TForm1::Button1Click(TObject *Sender)
{
BilgiOk("Deneme");
}

kullanmayı denediğimde derleme esnasında en başta belirttiğim bu hatayı veriyor..

Not: Lib dosyasını olşturup "Add File To Project" ile eklediğim halde..
 
warder12.08.2004 - 23:29:08
Linker in dediği,
"Bana söylediğin yerde bundan birden fazla tanımlanmış, sen hangisinden bahsediyorsun anlayamadım." veya "bundan orada yok o yüzden çözemedim"
gibi bir mesaj. Yani kararsızlık durumu.
typedef hatalarına düşmüş olabilirsiniz. Kimbilir göremediğimiz yerlerde neler yaptınız. Bence bilmediğiniz veya tam emin olmadığınız cpp özelliklerinden yararlanmaya çalışmamalısınız. Sade ve ekonomik olmanız problemsiz sonuçlar almanıza yardımcı olabilir.
Ayrıca fonksiyondan dönen tipe bakarak (hoş tipin ne olduğu anlaşılmıyor ama) kullandığınız yerde void muamelesi yapmanız da tuhaf bir durum.
Bu şekliyle verecek başka cevap yok gibi.

ilave : .....
Sizin durumunuz kafama takıldı ve inceledim.
Sonuç olarak, kullandığınız fonksiyonu tanımladığınız header dosyasını include etmişsiniz. Bu yüzden hata almıyorsunuz. Ancak aynı fonksiyonun cpp dosyasını "Add file to project" ile eklememişsiniz. Yani ilgili fonksiyonun cpp dosyası eklenmediğinden obj dosyası oluşturulamıyor. Bu durumda header ını eklediğiniz için de kullanılamıyor. Linker include ettiğiniz dosyanın obj unuda arıyor ama orada zaten yok ve kararsızlığa düşüp projeyi bağlayamadığı için hatayı veriyor.
cpp dosyasını da belirttiğim gibi eklediğinizde problem durumu ortadan kalkacaktır.
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com