BPL Ortak Unit Kullanımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

BPL Ortak Unit Kullanımı

Mesaj gönderen Lost Soul »

S.A.
BPL içindeki forma erişme (Yarısı çözüldü :) ) başlığında bpl içindeki herhangi bir forma erişim ile ilgili soru sormuştum.
Sonra gene çözümü aşağıdaki gibi çözmüştüm.
Lost Soul yazdı:Problemi aşağıdaki kod ile çözdüm

Kod: Tümünü seç

var s: String;
PCommon : HModule;
AForm : Tform;
begin
s:=  extractfilepath(application.ExeName)+'Common.bpl';
PCommon:=LoadPackage(s);
  if PCommon <> 0 then
  begin
    Aform := Application.FindComponent('cariliste') as TForm;
      Aform.ShowModal;
    if PCommon<>0 then
    try
    UnloadPackage(PCommon);
    except
    end;
    if PCommon<>0 then
    try
    FinalizePackage(PCommon);
    except
    end;
  end;
end;
Bu işlem normal uygulamada sorunsuz çalışıyor.
Ancak bu kodu DLL içinde kullandığım zaman aşağıdaki gibi bir hatayla karşılaşıyorum

Access violation at address 017A5930 in module 'CommonInterFace.dll'. Read of address 00000000.

dll için ayrıca bişey mi yapmam gerekiyor.
ancak yukarıda belirttiğim gibi fonksiyonu dll den çağırdığım zaman yukarıda da belirttiğim gibi Acces violation hatası ile karşılaşmştım.

Baktım olcağı yok CommonInterface.dll oluşturmak yerine CommonInterFace.pas isimli unit oluşturdum.
Buraya kadar herşey çok güzel ve sorunsuz çalıştı.
Ancak ne zamanki aynı uniti (CommonInterFace.pas) diğer bpl dosyama da import etiim o zaman iş bozuldu :)

Bir stok, cari ve fatura için ayrı ayrı BPL modüllerim var.

her biri tek başına güzel güzel çalışıyor.
ama ne zamanki birini çağırıp sonra da başka bir modülü çağırsam işte o zaman windows'un o gıcık hata sesi eşliğinde

Cannot load package 'carikart.' It contains unit 'CommonInterFace,'which is also contained in package 'StokKart'
hatası alıyorum.

hatanın sebebi her iki bileşende de CommonInterFace unitinin bulunması

şimdi
İkisinde aynı isimde unitin (ki bu tek bir dosya ve her unite uses kısmında referans verilmiş) bulunmasından dolayı hatayı verdiğini biliyoruz.
1. her pakette aynı isimli unit'e referans verirken (atıyorum : CommonInterFace as CariCommon) şeklinde bir isim değişikliği yapabilir miyiz. Yapsak bile bu çözüm olur mu.

2. Bu olmadı BPL içindeki forma erişme (Yarısı çözüldü :) ) başlığındaki dll içerisinden çaprıldığında neden hata verdiğini ve nasıl çözülebileceğini söyleyebilir misiniz.

3. Ya da bu uniti çakışma yaşamadan sorunsuz şekilde nasıl kullanabilceğimi söyleyebilir misiniz.

4. Başka tekliflere de açığım.

Önerileriniz için şimdiden teşekkürler.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: BPL Ortak Unit Kullanımı

Mesaj gönderen Lost Soul »

bu arada CommonInterFace.pas dosyası içeriği aşağıdaki gibi

Kod: Tümünü seç

unit CommonInterFace;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes,Forms,
  Dialogs, ExtCtrls,Controls,pFIBDataSet;

Type TCI = Class
  private
    { Private declarations }
  public
    { Public declarations }
    Function CariListele(Path:String) : Integer;
    Function StokListele(Path:String) : Integer;
  end;

var
CI : TCI;
PCommon,PStokListe : HModule;
AForm : Tform;
  
implementation

Function TCI.CariListele(Path:String) : Integer;
var i : integer;
begin
i:=-1;
PCommon:=LoadPackage(Path+'Common.bpl');
  if PCommon <> 0 then
  begin
    Aform := Application.FindComponent('cariliste') as TForm;
    Aform.ShowModal;
    result:=i;
    if Aform.ModalResult<>mrok then exit;
      with TpFIBDataSet(Aform.FindComponent('CommonCariListe')) do
      Begin
      i:=fieldByName('ID').AsInteger;
      End;
    if PCommon<>0 then
    try
    UnloadPackage(PCommon);
    except
    end;
    if PCommon<>0 then
    try
    FinalizePackage(PCommon);
    except
    end;
  end;
result:=i;  
end;

Function TCI.StokListele(Path: string) : Integer;
var i : integer;
begin
i:=-1;
PStokListe:=LoadPackage(Path+'Common.bpl');
  if PStokListe <> 0 then
  begin
    Aform := Application.FindComponent('stokliste') as TForm;
    Aform.ShowModal;
    result:=i;
    if Aform.ModalResult<>mrok then exit;
      with TpFIBDataSet(Aform.FindComponent('CommonStokListe')) do
      Begin
      i:=fieldByName('ID').AsInteger;
      End;
    if PStokListe<>0 then
    try
    UnloadPackage(PStokListe);
    except
    end;
    if PStokListe<>0 then
    try
    FinalizePackage(PStokListe);
    except
    end;
  end;
result:=i;  
end;

end.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: BPL Ortak Unit Kullanımı

Mesaj gönderen Lost Soul »

Sanırım soruyu uzun yazdım :roll:
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: BPL Ortak Unit Kullanımı

Mesaj gönderen sadettinpolat »

bpl de ayni uniti kullanan birden fazla bpl dosyasini bende ayni anda yukleyememistim. bahsettigin hatayi veriyordu. mecburen bir bpl yi yuklemeden once eskisini unload edip yenisini yukleyerek problemi cozebilmistim. ayni anda ayni unitleri kullanan birden fazla bpl kullanman gerekiyorsa sanirim baska bir alternatif bulman gerekecek.

moduler bir yapi kurmak icin Remobject firmasina ait olan hydra adli bileseni kullanabilirsin alternatif olarak..
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
Opt2000
Üye
Mesajlar: 216
Kayıt: 09 Tem 2003 10:04

Re: BPL Ortak Unit Kullanımı

Mesaj gönderen Opt2000 »

Selam,

Bu sorunun iki tane çözümü var aslında.

1. Ortak unit'lerin hepsini ayrı bir BPL'de toplamak. Aslında Borland/CodeGear da bunu tavsiye ediyor.
2. Bir iki tane compiler directive vardı, ama işin doğrusu net hatırlamıyorum. Unit'in başına o directive'i yazacak olursan sorun çözülüyordu. Ama bu tavsiye edilen bir yöntem değil.

Kolay gelsin,
Bahadır Alkaç
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: BPL Ortak Unit Kullanımı

Mesaj gönderen Lost Soul »

öncelikle sabırla okuyup verdiğiniz cevaplara teşekkür ederim.
Opt2000 yazdı:Selam,
1. Ortak unit'lerin hepsini ayrı bir BPL'de toplamak. Aslında Borland/CodeGear da bunu tavsiye ediyor.
Bahadır Alkaç
bpl içindeki unit'e ait fonksiyonu çağırmaya bir örnek verebilir misiniz. DLL deki gibi pointer ile mi çağırıyoruz daha mı farklı. Şimdiye kadar hiç denemedim bpl deki fonksiyona erişmeyi.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: BPL Ortak Unit Kullanımı

Mesaj gönderen Lost Soul »

denedim. bpl deki fonksiyonlara da dll gibi erişiliyormuş.
Herkese teşekkür ederim. Sağolun arkadaşlar.
Cevapla