Dll out parametresi ile Pointer kullanma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
pairs34
Üye
Mesajlar: 4
Kayıt: 14 Haz 2014 01:42

Dll out parametresi ile Pointer kullanma

Mesaj gönderen pairs34 »

Merhaba arkadaşlar bir dll yazmak istiyorum parametre olarak out parametresini kullanıyorum dışarıya veri aktarmam lazım yani gelen pointer a değer giricem.

Fakat. Bİr türlü yapamadım.

Resim

bu şekilde oluşturuyorum fakat ca := 1; dediğimde hata veriyor başka bir dilden dll i çağırırken pointer gönderiyorum.

Resim

bu resimdeki gibi left ve right diye iki pointer gönderiyorum bunlara değer atayamadım malesef.

Delphiden gelen pointer a nasıl değer atayabilirim.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Dll out parametresi ile Pointer kullanma

Mesaj gönderen ikra »

eklemis oldugun resimler bende görünmüyor.
o nedenle nasil bir yol izledigini bilemiyorum.

eger bir pointer gönderiyorsan, pointere yazdigin deger türü ne ise, yine ayni sekilde okuman gerekir.

örnegin dll'ye gelen pointer'e asagidaki sekilde veri girebilirsin.

Kod: Tümünü seç

PInteger(PointerToDll)^ := 23;
Fakat pointere öncelikle Mem atamasi yapman icab edebilir. aksi taktirde adresleme hatasi alabilirsin.

Kod: Tümünü seç

GetMem(PointerToDll, SizeOf(Integer));
delphi tarafinda ise

Kod: Tümünü seç

var
  I: Integer;
begin
  I := PInteger(PointerToDll)^;
  FreeMem(PointerToDll, SizeOf(Integer));
end;
kıdemsiz üye
pairs34
Üye
Mesajlar: 4
Kayıt: 14 Haz 2014 01:42

Re: Dll out parametresi ile Pointer kullanma

Mesaj gönderen pairs34 »

ikra yazdı:eklemis oldugun resimler bende görünmüyor.
o nedenle nasil bir yol izledigini bilemiyorum.

eger bir pointer gönderiyorsan, pointere yazdigin deger türü ne ise, yine ayni sekilde okuman gerekir.

örnegin dll'ye gelen pointer'e asagidaki sekilde veri girebilirsin.

Kod: Tümünü seç

PInteger(PointerToDll)^ := 23;
Fakat pointere öncelikle Mem atamasi yapman icab edebilir. aksi taktirde adresleme hatasi alabilirsin.

Kod: Tümünü seç

GetMem(PointerToDll, SizeOf(Integer));
delphi tarafinda ise

Kod: Tümünü seç

var
  I: Integer;
begin
  I := PInteger(PointerToDll)^;
  FreeMem(PointerToDll, SizeOf(Integer));
end;
HOcam yanlış eklemişim resimleri resimler bu şekilde olacak.

Resim

Resim
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Dll out parametresi ile Pointer kullanma

Mesaj gönderen ikra »

örnegin bir record yada class üzernde islem yapmak istiyorsan parametre olarak pointer kullanman gerekir.
girecegin veri tipleri sartlara bagli farkliliklar gösteriyorsa yine pointer kullanman gerekir.
girecegin veri tipi sayisal ise pointer kullanman gerekmez, direkt integer, cardinal vs. seklinde kullanabilirsin.
islem yapacagin tip string ise, char kullanman gerekir.

senin yapmak istedigin integer deger atamak ve veri tipi sarta bagli farkliliklar göstermiyor.
o nedenle pointer kullanman gereksiz olur.

out parametresi procedure icin düsünülmüstür. function'da ise result kullanman gerekir.

Kod: Tümünü seç

procedure Islem(out parametre: Integer);
begin
  parametre := Deger;
end;

function Islem: Integer;
begin
  Resul := Deger;
end;
kıdemsiz üye
pairs34
Üye
Mesajlar: 4
Kayıt: 14 Haz 2014 01:42

Re: Dll out parametresi ile Pointer kullanma

Mesaj gönderen pairs34 »

ikra yazdı:örnegin bir record yada class üzernde islem yapmak istiyorsan parametre olarak pointer kullanman gerekir.
girecegin veri tipleri sartlara bagli farkliliklar gösteriyorsa yine pointer kullanman gerekir.
girecegin veri tipi sayisal ise pointer kullanman gerekmez, direkt integer, cardinal vs. seklinde kullanabilirsin.
islem yapacagin tip string ise, char kullanman gerekir.

senin yapmak istedigin integer deger atamak ve veri tipi sarta bagli farkliliklar göstermiyor.
o nedenle pointer kullanman gereksiz olur.

out parametresi procedure icin düsünülmüstür. function'da ise result kullanman gerekir.

Kod: Tümünü seç

procedure Islem(out parametre: Integer);
begin
  parametre := Deger;
end;

function Islem: Integer;
begin
  Resul := Deger;
end;

Hocam kolay gelsin. Bİlgilendirmeniz için telekkürler. Fakat birşey daha sormak istiyorum. Pointer gereksiz dediniz ya ben geriye birden çok değer göndermek istiyorum o yüzden pointer kullanayım dedim. Pointer da birden fazla değer yollayıp içini dolduramazmıyım.Örnek olarak resimde left ve right değerlerini yollamışım delphide o gelen pointer da hem left hemde right için nasıl değer ataması yapabilirim.
pairs34
Üye
Mesajlar: 4
Kayıt: 14 Haz 2014 01:42

Re: Dll out parametresi ile Pointer kullanma

Mesaj gönderen pairs34 »

Kod: Tümünü seç

procedure Isim(out ca : Pointer);
begin
      PInteger(ca)^ := 25;
end;
HOcam bu haliyle çok süper bi şekilde çalıştırabildim.Ve veriyi herhangi bir dilden gönderdiğim pointer a aktara bildim. Normal şartlarda tek değer yollarken işime yaramayacak bu fakat.

Kod: Tümünü seç

local POINT = MemoryEx.DefineStruct{INT("X")};
local tPOINT = POINT:New();
local pPOINT = tPOINT:GetPointer();
result = DLL.CallFunction("AutoPlay\\Docs\\Project1.dll", "Isim", pPOINT , DLL_RETURN_TYPE_INTEGER, DLL_CALL_STDCALL);
tret = tPOINT.X;
tPOINT:Free();
ben burda pointer olarka sadece tek değer olan X i tanımlamışım ve bu X delphiye giderek değeri alıp geri geliyor.

Fakat bu şekilde birden çok değer yani hem x hemde y yolladıgım zaman delphi tarafında buna nasıl müdahale etmem gerkeir.

Kod: Tümünü seç

local POINT = MemoryEx.DefineStruct{INT("X");INT("Y")};
local tPOINT = POINT:New();
local pPOINT = tPOINT:GetPointer();
result = DLL.CallFunction("AutoPlay\\Docs\\Project1.dll", "Isim", pPOINT , DLL_RETURN_TYPE_INTEGER, DLL_CALL_STDCALL);
tret = tPOINT.X;
tPOINT:Free();
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Dll out parametresi ile Pointer kullanma

Mesaj gönderen ikra »

dll ile projen icin ortak bir unit kullan.
bu unit icinde record tanimla

Kod: Tümünü seç

TMyRecord = record
  x: Integer;
  Y: Integer;
end;
daha sonra projenden dll'ye

Kod: Tümünü seç

procedure
  var R: TMyRecord;
begin
  call_dll_procedure(Pointer(R));
  ShowMessage(IntToStr(R.X));
  ShowMessage(IntToStr(R.Y));
end;
dll tarafinda ise

Kod: Tümünü seç

procedure dll_procedure(var Parametre: Pointer);
begin
  TMyRecord(Parametre).X := 25;
  TMyRecord(Parametre).Y := 57;
end;
kıdemsiz üye
Cevapla