DLL de XML işlemi sorunu.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

DLL de XML işlemi sorunu.

Mesaj gönderen vkamadan »

merhaba ,
normal uygulamalarda çalışan bir XML okuma fonksiyonu DLL içinden çağrılan ve sorunsuzca gösterilen bir formd kullanılmak istendiğinde şu mesajı alıyorum

.... . EOleSysError with message 'CoInitialize Çağrılmamış' .....


çok ilginç bir durum sorun nerede olabilir. unutmadan DLL yi dinamik yükleyerek kullanıyorum.
iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Arkadaşlar Borland'ın sitesinde konu ile ilgili şöyle bir bilgi buldum
Question:

I have an application that uses the XML components. This application worked just fine until I decided to make it multi-threaded. Now I am getting a "CoInitialize has not been called" error when I try and use an XML component.

Answer:

Microsoft's XML parser, which the XML components use by default, is a COM-based parser, which means that COM needs to be initialized before you can use them. Delphi calls the CoInitialize function for you when an application starts up, but that function only initializes COM on the thread it was called from. You should put a call to CoInitialize at the beginning of your TThread descendant's Execute method and a matching CoUnInitialize at the end.
yani DLL içindeki COM kullanan XML fonksiyonun kullanmadan önce CoInitialize fonksiyonunu çağırmış olmamız gerkiyormuş. ama CoInitializeEx (pvReservez:Pointer;ColInit:Integer):HRESULT;
şeklinde bir function var bunu ne şekilde ve nerde kullanamam gerektiğini çözemedim. teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

COM objelerle işlem yapacaksan bu function'ı çağırman gerekiyor.

Uses 'a ActiveX unitini ekle. Şöyle kullan:

Kod: Tümünü seç

CoInitialize(nil);
try
  // Buraya XML kodun gelecek
finally
  CoUnInitialize;
end;
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba @coderlord,
çok teşekkür ederim. bahsettiğini gibi kullanıcnca sorunum çözüldü iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba @coderlord ,
tam çözüme ulaştığımı düşündüğüm sırada "Access violation at adress.. " hatası alıyorum kullandığım kod şu şekilde

Kod: Tümünü seç

library isvicreDLL;
uses
  SysUtils,
  Classes,ActiveX,isvicre;
{$R *.res}
function LoadXMLData(FileName:String):String;export;
var
XMLPolice:IXMLPolicelistType;
begin
  CoInitialize(nil);
  try
  XMLPolice := Loadpolicelist(FileName);
  Result :=XMLPolice.Isvicrepolice.Policeno;
  finally
    CoUninitialize;
  end;
end;
exports  LoadXMLData;

begin
end.


bu şekilde tanımladığımda Host application dan çağırdığımda sadece yukarıdaki bellek hatasını alıyorum fonksiyondan değer dönmüyor , ama try finally end bloğuna almadan ve CoUninitialize yi çağırmadan kullanırsam fonksiyon değer döndürüyor ama ondan sonra bellek hatasını veriyor yani

Kod: Tümünü seç

function LoadXMLData(FileName:String):String;export;
var
XMLPolice:IXMLPolicelistType;
begin
  CoInitialize(nil);

  XMLPolice := Loadpolicelist(FileName);
  Result :=XMLPolice.Isvicrepolice.Policeno;

end;
DLL yi çağırdığım procedureyi de göndereyim çağırmam da hatalı olabilir.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
Handle:Integer;
GetPoliceNo:TGetPoliceNo;
begin
   try
     Handle := SafeLoadLibrary('isvicreDLL.dll');
     if Handle>0 then
      begin
        @GetPoliceNo := GetProcAddress(Handle ,'LoadXMLData');
        if @GetPoliceNo<>nil then ShowMessage(GetPoliceNo(edit1.Text));
      end;
   finally
      FreeLibrary(Handle);
   end;
end;
teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

vkamadan yazdı:

Kod: Tümünü seç

  XMLPolice := Loadpolicelist(FileName);
Bilirsin Windows string kullanmaz PCHAR kullanır. Filename parametreni PChar türüne dönüştürerek göndermeyi denesene. Yani PChar(FileName) şeklinde.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Pardon ya IXMLPolicelistType interface'inde string olarak geçiyorsa eğer yemez onu tabi.

Oldum olası COM olayına kılım. :)
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba ,
denedim yine olmadı :(
yanlışmı biliyorum acaba eğer DLL yi delphide yazmış ve Delphide kullanıyorsam tip ile ilgili sıkıntı olmuyordu.

çağırma şeklini değiştiriyorum şu şekilde çağırmak istediğimde yine bellke hatası alıyorum

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
HInst:THandle;
FPointer:TFarProc;
GetPoliceNo:TGetPoliceNo;
begin
 HInst := SafeLoadLibrary('isvicreDLL.dll');
 if HInst>0 then
  try
   FPointer :=GetProcAddress(HInst,PChar('LoadXMLData'));
    if FPointer <> nil then
     begin
       ShowMessage(GetPoliceNo(edit1.Text));
     end else ShowMessage('Yüklenmedi');
  finally
   FreeLibrary(HInst);
  end;
end;
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

arkadaşlar sonunda kısmi bir çözüm ürettim ,
DLL yi dinamik yüklemeden yani uygulama açılışında yükleyince sorun kalmadı. ama benim dinamik olarak kullanmam daha yararlı olacak.
şu anki kullanım şekli;

Kod: Tümünü seç

function LoadXMLData(FileName:String):String;
stdcall; external 'isvicreDLL.dll';
iyi çalışmalar. bu demek oluyorki dinamik kullanım proceduremizde bir sorunvar dinamik kullanım için önerilerinizi bekliyorum.
Volkan KAMADAN
www.polisoft.com.tr
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

IBX 'in GDS32.DLL'den dynamic yüklemesini incelesene. Unit adı tam aklımda değil. Sana güzel bir örnek olur.
Cevapla