Exe Dosyalar Başka Sistemde Çalışmıyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Exe Dosyalar Başka Sistemde Çalışmıyor

Mesaj gönderen heskin35 »

Delphinin oluşturduğu *.exe proje dosyaları delphi kurulu olmayan işletim sistemlerinde(win xp home edition, 1 den fazla makinede denedim) rtl70.bpl bulunamadı hatası vererek çalışmıyorlar.
New Application ile üzerinde hiçbir bileşen olmayan uygulama ile denedim diğer bilgisayarlarda yine aynı hata nüksetti ve çalışmadı. :(
Bu konuda başına gelmiş veya tecrübesi olan var ise umut içinde bekliyorum.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7604
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Project menüsünden Options kısmını aç ve Packages tabındaki "Build with runtime packages" daki işareti kaldır. Programı tekrar derle çalışacaktır.

Kolay gelsin.
Kullanıcı avatarı
XeoN
Üye
Mesajlar: 13
Kayıt: 12 Nis 2005 06:31
Konum: KONYA
İletişim:

Mesaj gönderen XeoN »

Bu dosyalar delphinin VCL bileşenlerinin makinada calısmasını sağlayan dosyalardır.

Bunlar;
dbrtl70.bpl
rtl70.bpl
vcl70.bpl
vcldb70.bpl
vclx70.bpl dosyalarıdır.

Yapılacak en basit olarak yukarıda adını yazdığım dosyaları ilgili sistemin SYSTEM32 klasorune veya programın EXE'sinin olduğu yere kopyalamaktır.


<<Project menüsünden Options kısmını aç ve Packages tabındaki "Build with runtime packages" daki işareti kaldır. Programı tekrar derle çalışacaktır. >>
Bu daha mantıklı ama exe'nin boyutunu biraz büyütüyor.


Başarılar
---
Bakmakla usta olunsaydı kediler kasap olurdu.
---
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Mesaj gönderen heskin35 »

Çok saolun arkadaşlar.
Mustafa hocam bu şekilde hallettik ama dosya boyutunun artması haricinde ileriye yönelik başka bi soruna neden olurmu yoksa. Müsait bi zamanda Delphi'yi kaldırıp tekrar yüklemem daha mantıklı mı olur ?
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7604
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Bir sıkıntıya neden olmaz, bu bir seçenek sadece. Nedir ne değildir dersen,

:ara build with runtime packages :)

Kolay gelsin.
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Mesaj gönderen heskin35 »

Tamamdır üstad. ;)
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Arkadaşlar tekrar tekrar söylüyorum. EXE nin boyutunun büyümesi niye size rahatsızlık veriyor. Bana mantıklı bir izahat yapana 1,5 adana kebap ısmarlıyorum. Hem de acılı. :)
heskin35
Üye
Mesajlar: 132
Kayıt: 30 Haz 2004 09:48

Mesaj gönderen heskin35 »

Diskete sığmıyor. :P
Desem acılıyı hakediyor muyum. :D işin şakası bi yana aslında o kadar önemli değil. Ama sadece boyutun 21 kat artması dikkatimi çekti sadece :oops: :lol:
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Selam,

Bence Exe'nin boyutundan ziyade programla birlikte birden fazla program (exe, dll vs gibi) dağıtılıyorsa önem kazanıyor, çünkü aynı işlemi yapan kodlar, boş yere belleğe yerleşiyor. Yazdıklarım biraz karışık gibi görünebilir ama basit bir örnekle açıklayım.

Örneğin yazdığınız program plug-in destekli ve programla beraber 10 tane plug-in dağıtıyorsunuz. Bu plug-in'lerin de Delphi'de yazıldığını kabul ediyoruz. Eğer run-time package'leri kullanmazsak, bunların hepsi en iyi ihtimalle 400 KB olacaktır. Bir de ana programımız var. Ve bellekte bir sürü gereksiz yer işgal edecekler. Oysa run-time package kullanacak olsak, her biri sanırım 40-50 KB falan olacaktır (Sayılar önemli değil, sadece oran olarak düşünün). Ana program çalıştığında run-time dosyaları zaten belleğe yükleyecek ve Windows'un çalışma sisteminden dolayı da aynı DLL'ler (bpl paketleri de DLL sonuçta) tekrar tekrar yüklenmeyecek. Bu da bellekten tasarruf anlamına geliyor. Belki 1-2 plug-in için geçerli değil, ama Photoshop veya 3D Max gibi neredeyse tamamen plug-in üzerine kurulu programlarda ciddi bir fark olacaktır.

Tabii şöyle bir durum da var. Eğer program sadece bir tane Exe'den oluşuyorsa, o zaman run-time paketleri kullanmak iyi bir şey değil (Tamamen kişisel bir yaklaşım, bunun kesin doğru olduğunu iddia etmiyorum). Bunun -bence- iki temel sebebi var. 1. Run-Time Package'ler ne olursa olsun daha fazla yer tutar. Yani Exe'nin içine gömüldüğü zaman 3 MB ise, gömülmediği zaman sizin toplamda 10 MB dosya dağıtmanız gerekir. Tabii bellekte de benzer şekilde yer işgal edeceklerini söylemeye gerek yok. 2. Run-Time package'larda ne olursa olsun bir hız kaybı söz konusudur (Buradaki hız kayıpları oyun gibi gerçekten de aşırı hıza ihtiyaç duyulan programlarda anlaşılır), çünkü DLL'den kod çalıştırmak için mecburen ara değişkenler oluşturulur. Ayrıca bu büyük paketlerin de yüklenme süreleri, dosya boyutundan dolayı, daha uzundur.

Şimdilik aklıma gelenler bunlar. Sonuçta programı run-time paketlerle beraber dağıtmak, tamamen projeyle ilgili bir durum. Bu arada yazarken aklıma geldi, program güncellemelerini de düşünmek gerekiyor :)

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Boyutu artıyor, çünkü derleyici tüm gerekli paket-kütüphaneleri exe nin içerisine ekliyor. Sen yok programın geliştirme aşamasında, defalarca asıl kullanılacak bilgisayara taşımak durumunda kalacağım diyorsan, yukarıdaki ve ilgili linkteki paketleri bir kereliğine ilgili bilgisayara kopyalayıp kısa exe yı kolayca taşıyabilirsin.. Kararlı hale geldiğinde de tüm paketlerle derlersin..

Paketsiz derlemenin bir sıkıntısı da yeni bir bileşen kurduysan onun .bpl sini de taşıman gerekmesidir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Birkaç bişey de ben söyleyim bari :)
İlk önce sıklıkla düşünüldüğü gibi *.bpl leri exe ye gömmek kesinlikle hız kaybına yol açmaz. Hatta bazen hızlı çalışması için yazdığımız kodlar bazen exe boyutunu bile büyütebilir.

örneğin aşağıdaki kodlardan ilki daha çok yer kaplamasına rağmen
koşul bir kez çalışacağı için daha hızlıdır. İkincisinde ise kod ilkine göre daha kısa olduğu halde döngünün her adımında koşul çalışacağı için daha yavaştır.

Kod: Tümünü seç

var
  a : Boolean;
  x, y, z : Integer;
begin
  if a then
  begin
    for x := 0 to 99 do
      y := y + 1;
  end
  else
  begin
    for x := 0 to 99 do
      z := z + 1;
  end
end;

Kod: Tümünü seç

var
  a : Boolean;
  x, y, z : Integer;
begin
  for x := 0 to 99 do
    if a then
      y := y + 1
    else
      z := z + 1;
end;
belki bu örnekteki fark hissedilmeyecek düzeydedir ama örnek geliştirilebilir. Kısacası büyük boyut herzaman yavaşlığa eşit değildir.
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Sanırım ters anlaşıldı. Asıl söylemek istediğim şu: BPL dosyalarını exe'ye gömdüğünüz zaman daha hızlı çalışır, en kaba mantıkla bile şunu düşünebiliriz aslında: Paketlerdeki kodlar exe'ye gömülürken compiler bazı fonksiyonları sizin kodunuzun içinde çalıştırabilir (Garip bir cümle biliyorum, ama C'deki inline fonksiyonları ve makroları düşünerek yazıyorum bunu) Hadi bunu da geçtil, Windows'un, BPL (ya da DLL) fonksiyonları çağırılırken yaptığı bellek kontrollerini falan da düşünmek gerekiyor.

Ayrıca koddaki satır sayısı ile performans arasında kesin bir bağlantı olmadığını da biliyorum. Lazio'nun verdiği örnek çok da güzel bir örnek. Bunu resim işleme programındaki efektlerden birisi olarak düşündüğümüzde ciddi bir performans farkı olduğu daha net anlaşılacaktır.
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

@Opt2000 ben senin yazdıklarına istinaden yazmamıştım ama yinede bildiğim kadarıyla bpl leri exe ye gömmenin hız açısından hiç bir farkı olmaz. (Belleğe yüklendikten sonra) Çünkü Belleğe yüklenen bir kodun nerden yüklendiği önemli değildir. Exe ulaşacağı koda bellek üzerinden ulaşacağı için bpl den mi yoksa kendi içinden yüklenen bir koda mı ulaştığının önemi yoktur.
@Opt2000 tam olarak anlatmak istediğim şey aslında Makrolar ve önişlemcilerdi. Makrolar kodu her ne kadar büyütselerde hız açısında bir foksiyonun dezavantajlarını giderirler.
Opt2000 yazdı:Windows'un, BPL (ya da DLL) fonksiyonları çağırılırken yaptığı bellek kontrollerini falan da düşünmek gerekiyor.
şimdi burda bahsettiğin ilk yüklenme ise exe, kendisinde linkli olan bpl leri bir kez kontrol eder oda yüklemek için. Daha sonra yükleyeceği için (-ki bu aşamada daha öncede bahsettiğim gibi nerden yüklediğinin pek önemi yoktur.) tüm işlemlerini çağırma vs bellekten yapar.
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Mesaj gönderen Opt2000 »

Burada anlatacaklarım, aslında kesin bilgilere değil, bildiklerimden çıkardıklarım üzerine olacak. Bu yüzden yazdıklarımı kesin doğru olarak düşünmeyin, hatta yanlışım varsa düzeltirseniz sevinirim :)

Windows, normalde uygulamaları çalıştırırken, her uygulama için sanal bir bilgisayar oluşturuyor. Daha doğrusu, her program için ayrı bir bellek alanı açıyor ve siz bu bellek alanı içinde çalışıyorsunuz. Dolayısıyla programınız çöktüğü zaman genelde sistem diğer programların çökmesini engelleyebiliyor. Ama ortak kullanım anlamına gelen BPL ve DLL'ler, sizin programınızla aynı bellek alanına yüklenemez. Aksi takdirde zaten DLL, BPL mantığını kaybedersiniz, çünkü aynı DLL'i kullanan programlar, DLL'leri iki kere yüklemek zorunda kalır. Sonuçta A programı, B programının bellek alanına erişemez, çünkü buna işletim sistemi izin vermez. Sanırım buraya kadar olan kısımda her DLL için işletim sisteminin farklı bir bellek alanı yaratacağını açıklayabilmiş oluyorum.

İşte işletim sisteminin kontrolleri derken anlatmak istediğim de burasıydı. Sizin programınız, aslında kendisine ait olmayan bir adrese ulaşmaya çalışıyor. Burada işletim sistemi devreye giriyor ve sizin kullanmak istediğiniz adresin geçerliliğini kontrol ediyor. Elbette sistemin buna yönetlik optimizasyonları vardır, ama kendi kodunuz çalışırken bu kontrol yapılmıyor, çünkü bu kontroller zaten compile edilirken hallediliyor.

Aynı zamanda şunu da eklemek gerekiyor, Delphi'de bir DLL yarattığınızda kocaman bir uyarı commenti görüyorsunuz:Eğer string tipi veri aktarımı yapacaksanız, Borlndmm.dll (adını tam hatırlamıyorum) gibi bir dosyayı da dağıtmanız gerekir. Diğer bir değişle, araya Borland'ın çevirimleri falan giriyor, büyük ihtimalle Delphi String'i Null terminated String'lere çevirerek uyumluluğu sağlıyor. Yani sizin yazdığınız kod, aslında sizin yazdığınız gibi çalışmıyor, ama aynı işi yapıyor :) (Bu mesajlarda sürekli garip cümleler kuruyorum, kusuruma bakmayın)

Şimdilik çıkmam gerekiyor, eğer aklıma bir şeyler gelirse eklerim

Herkese kolay gelsin
Bahadır Alkaç
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Sanal bilgisayar yanlış bir tanım olmuş. V8086 modu gibi algılanabilir ki alakası yok :) Protected mode diyoruz buna.

Doğru DLL ve BPL'ler aslında aynıdır. Windows bunları bellekte bir yere yükler. Uygulama ulaşmak istediğinde bir tabloya bakarak buraya erişim hakkımızın olup olmadığına karar verir. Belleğin belirli bir bölgesine bu sayede readonly veya read-write hakkı verebiliriz.
Cevapla