1

Konu: dll dosyası nasıl kullanılır?

Sevgili Arkadaşlar,
Sırf deneme olsun diye ufak bir fonksiyon yazıp bundan bir dll dosyası yarattım.
Ama iş bu dosyayı başka bir programla entegre gelince başaramadım. Ya program çalıştığında "cannot find entry point bykhrf in the DLL" hatasını alıyorum, yahudda programı save ederken hata mesajı alıyorum.
DLL dosyasını yarattığım program kodu şoyle:

Visual Fox Pro
FUNCTION BYKHRF

 
Parameters V_DIZI
Private V_DIZI
V_DIZI = Strtran(V_DIZI,"i","İ")
V_DIZI = Strtran(V_DIZI,"ı","I")
Return Upper(V_DIZI)

Bu DLL dosyasını çalıştırmak istediğim kod satırı da şöyle:

DECLARE  string bykhrf IN yetkinvfp.dll

Vfp9 yardımında önerilen bütün komutla şekillerini denediğim halde sonuç degişmedi.
Bana bu işin üstesinden nasıl gelecegimi benim bilgi düzeyimi gözönünde bulunduracak tüm arkadaşlara şimdiden çok teşekkürederim.
Sevgilerimle
Erdal

2 Son düzenleyen, cetinbasoz (23.12.2009 01:55:56)

Re: dll dosyası nasıl kullanılır?

Merhaba,
VFP ile yaratilan DLL'ler activeX grubu DLL'ler (diger grup ise win32 DLL - windows'un kendi DLL'leri ya da C kullanilarak sonradan yaratilmis DLLler).
Win32 DLL'e ornek:

Visual Fox Pro
declare Sleep in win32API integer dwMilisaniye

 
Sleep( 1000 ) && 1000 milisaniye hicbirsey yapmadan dur - uyu

ActiveX DLL yaratmak icin OLEPUBLIC tanimli custom ya da Session classin olmali (eger dataya erisecek ise session - bence hep session yap). Ikincisi, parameters ya da LParameters satiri kullanma (asagidaki gibi kullan), ucuncusu gelen ve donen parametrelerin tiplerini belirt:

Visual Fox Pro
define class FoxFonksiyonlari as session OlePublic

Datasession = 2
 
Procedure BYKHRF(V_DIZI as string) as string
V_DIZI = Chrtran(m.V_DIZI,"iı","İI")
Return Upper(m.V_DIZI)
endproc
enddefine

Bu kodu prg olarak sakla. Bu projenin ana kodu. Sonra da Multithreaded DLL olarak derle. FoxTest.Dll olarak derledigini varsayalim, o zaman kullanilisi su sekilde (win32 DLL'lerin aksine bunda declare yok):

Visual Fox Pro
local loTest as 'FoxTest.FoxFonksiyonlari' && intellisense destegi saglamak icin

loTest = CreateObject('FoxTest.FoxFonksiyonlari')  && Objenin class adi DLLAdi.ClassAdi
? loTest.BYKHRF( 'ığüşiöç IĞÜŞİÖÇ') && ActiveX objenin BYKHRF adli metodu

3

Re: dll dosyası nasıl kullanılır?

Sevgili Çetin,
Bana yardım etmek için sarf ettiğin zaman ve emek için çok teşekkür ederim.
Hemen denedim ve hem senin programın hem de kendi programımı sorunsuz çalıştırdım.
Hoşgörüne sığınarak bir sorum daha olacak : Her fonksiyon için ayrı bir program mı yazmam gerekecek yoksa ayni program içerisine birkaç fonksiyon yazabilir miyim?
Tekrar teşekkür ve sevgilerimle.
Erdal

4

Re: dll dosyası nasıl kullanılır?

Erdal abi, tüm fonksiyonların için bir tane program yazıp (mesela "MyUtils.PRG") , o programın içinde de sana gerekli olan tüm fonksiyonlarını yerleştirebilirsin.

Ana programının başında bir yerlerde de şunu yazman yeterli :

Visual Fox Pro
Set Procedure To MyUtils Additive
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

5

Re: dll dosyası nasıl kullanılır?

Birden fazla yazabilirsin, ancak sadece "dis dunyaya" bu DLL uzerinden vermek istediklerini koy (ya da baslarina PROTECTED, HIDDEN ekleri koyarak disaridan gorunup gorunemeyecegini belirtirsin):

Visual Fox Pro
define class FoxFonksiyonlari as session OlePublic

Datasession = 2
 
Procedure BYKHRF(V_DIZI as string) as string
V_DIZI = Chrtran(m.V_DIZI,"iı","İI")
Return Upper(m.V_DIZI)
endproc
 
Procedure KCKHRF(V_DIZI as string) as string
V_DIZI = Chrtran(m.V_DIZI,"İI","iı")
Return Lower(m.V_DIZI)
endproc
 
Procedure VeriAlmaFonksiyonu( musteriID as string ) as string
   sys(2336,1) && bu kritik bolmeye giris/cikis ayari icin. Ayni anda baska threadler bu isi yapmasin beklesin biraz diye
   select * ;
       from ('C:\PROGRAM FILES\MICROSOFT VISUAL FOXPRO 9\SAMPLES\data\Customer') ;
      into cursor crsCustomer ;
     nofilter
sys(2336,2) && kritik isimiz kalmadi
CursorToXML('crsCustomer','lcXML',2,0,0,'1')
use in 'customer'
use in 'crsCustomer'
return m.lcXML
endproc
enddefine

Kullanan kod:

Visual Fox Pro
local loTest as 'FoxTest.FoxFonksiyonlari' && intellisense destegi saglamak icin

loTest = CreateObject('FoxTest.FoxFonksiyonlari')  && Objenin class adi DLLAdi.ClassAdi
? loTest.BYKHRF( 'ığüşiöç IĞÜŞİÖÇ') && ActiveX objenin BYKHRF adli metodu
? loTest.KCKHRF( 'ığüşiöç IĞÜŞİÖÇ') && ActiveX objenin KCKHRF adli metodu
 
local lcResult
lcResult = loTest.VeriAlmaFonksiyonu( 'ALFKI' )
XMLToCursor( m.lcresult, 'BenimMusteri' )
select BenimMusteri
browse

Bu DLL'ler dis dunyadan kullanma amacli aslinda. Yoksa VFP icinden VFP DLL kullanmak bana pek normal gelmiyor (daha dogrusu ben kullanim yeri yaratamadim hic).

6

Re: dll dosyası nasıl kullanılır?

Sevgili Çetin ve Uğur,
İkinize de çok teşekkur ederim.
Sevgili Uğur,
Senin metodun çok daha basit ama benim derdim DLL kullanımını öğrenmekti. Senin metodunu da kullanacağım.
İnsanın sizler gibi yardımsever dostları olması çok güzel. Sayenizde VFP programlamasında çok yolaldım.
Teşekkür ve sevgilerimle.
Erdal

7

Re: dll dosyası nasıl kullanılır?

Sevgili Çetin,
Son gösterdiğin yol gayet güzel çalışıyor ama program çalışırken öyle yavaşladı ki dayanılır gibi değil. Ben de sol elimle sağ kulağımı göstermek gibi bir yolla tekrar düzeltme yapınca program normal bir hızla çalışmaya başladı.
Tek yaptığım şey senin gönderdiğin kodu kopyalayıp yapıştırmak ve yapmamı söylediklerini adım adım uygulamak olmuşdu.
Dll dosyasının yeri de hızda hiç farketmiyor.
Bu işin daha hızlı bir yolu var mı?
Bana ayıracağın zaman ve emek için şimdiden çok teşekkür ederim.
Sevgilerimle.
Erdal

8

Re: dll dosyası nasıl kullanılır?

Tam olarak hangisini sordugunu anlamadim.
ActiveX DLL'ler COM olarak adlandiriliyor ve COM metodlari yavasliklariyla meshur. Mumkun oldugu kadar az sayida COM metodu cagir.
Nerede, nasil ve hangi kodu kullandigini gorsem belki daha iyi bir fikrim olabilir.

9

Re: dll dosyası nasıl kullanılır?

Sevgili Cetin,
Senin yolgöstermen ile birlikte aşağıdaki kodu bir dll dosyasına çevirmiş ve gene senin yol göstermenle bu dll dosyasını kullanmıştım:

Visual Fox Pro
define class FoxFonksiyonlari as session OlePublic

Datasession = 2
 
 
 
Procedure BYKHRF(V_DIZI as string) as string
 
V_DIZI = Chrtran(m.V_DIZI,"iı","İI")
 
Return Upper(m.V_DIZI)
 
endproc

programda ise şöyle kullandım:

Visual Fox Pro
local loTest as 'FoxTest.FoxFonksiyonlari' && intellisense destegi saglamak icin

 
loTest = CreateObject('FoxTest.FoxFonksiyonlari')  && Objenin class adi DLLAdi.ClassAdi
if loTest.BYKHRF(loAra) = loTest.BYKHRF( m.CD)


Ama program öyle bir yavaşladı ki sırf öğrenmek amacıyla yaptığım bu işten vazgeçtim.
Yardimlarin için şimdiden çok teşekkür ederim.
Sevgilerimle.
Erdal

10

Re: dll dosyası nasıl kullanılır?

Ama ben "Bu DLL'ler dis dunyadan kullanma amacli aslinda. Yoksa VFP icinden VFP DLL kullanmak bana pek normal gelmiyor" diye eklemistim:) Bence Fox DLLler sadece VB, C#,Excel,Word vb gibi diger dil ve araclardan kullanilmak icin. Yapi geregi ister VFP ile ister baska dilde yazilmis olsun Activex DLLler yavas.

11

Re: dll dosyası nasıl kullanılır?

Sevgili Çetin,
Anlaşılan o ki DLL dosyalarını çok mecbur kalmadıkça kullanmamam gerekiyor.
Bu tavsiyeni aklımın bir köşesine yazdım.
Yardımların için çok teşekkür ederim.
Sevgilerimle.
Erdal