DLL de XML işlemi sorunu.
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
DLL de XML işlemi sorunu.
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.
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
www.polisoft.com.tr
Arkadaşlar Borland'ın sitesinde konu ile ilgili şöyle bir bilgi buldum
şeklinde bir function var bunu ne şekilde ve nerde kullanamam gerektiğini çözemedim. teşekkürler.
yani DLL içindeki COM kullanan XML fonksiyonun kullanmadan önce CoInitialize fonksiyonunu çağırmış olmamız gerkiyormuş. ama CoInitializeEx (pvReservez:Pointer;ColInit:Integer):HRESULT;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.
şeklinde bir function var bunu ne şekilde ve nerde kullanamam gerektiğini çözemedim. teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
COM objelerle işlem yapacaksan bu function'ı çağırman gerekiyor.
Uses 'a ActiveX unitini ekle. Şöyle kullan:
Uses 'a ActiveX unitini ekle. Şöyle kullan:
Kod: Tümünü seç
CoInitialize(nil);
try
// Buraya XML kodun gelecek
finally
CoUnInitialize;
end;
merhaba @coderlord,
çok teşekkür ederim. bahsettiğini gibi kullanıcnca sorunum çözüldü iyi çalışmalar.
çok teşekkür ederim. bahsettiğini gibi kullanıcnca sorunum çözüldü iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
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
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
DLL yi çağırdığım procedureyi de göndereyim çağırmam da hatalı olabilir.
teşekkürler.
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;
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;
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr
Bilirsin Windows string kullanmaz PCHAR kullanır. Filename parametreni PChar türüne dönüştürerek göndermeyi denesene. Yani PChar(FileName) şeklinde.vkamadan yazdı:Kod: Tümünü seç
XMLPolice := Loadpolicelist(FileName);
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
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
www.polisoft.com.tr
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;
iyi çalışmalar. bu demek oluyorki dinamik kullanım proceduremizde bir sorunvar dinamik kullanım için önerilerinizi bekliyorum.
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';
Volkan KAMADAN
www.polisoft.com.tr
www.polisoft.com.tr