Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
erkankurtaga
Üye
Mesajlar: 62
Kayıt: 04 Oca 2009 06:36

Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen erkankurtaga »

Yaşadığım problemi C/C++ Dll indeki bir fonskiyona gönderilen paramtrenin Dll den dışarıya çok farklı değerlere dönmesi ile alakalı.
Problemimi aşağıda ayrıntılı bir şekilde anlatmaya çalıştım. Umarım anlaşılmışımdır. Herkese çok teşekkürler.

Dlldeki Record Tanımlaması;

Kod: Tümünü seç

typedef struct _tagCommParam
{
char ip[16];
int port;
byte commType;
int timeout;
}
COMPARAM;
Delphi de Yapılan Tanım

Kod: Tümünü seç

  PComParam = ^TComParam;

  TComParam = record
    ip:string[16];
    port:SmallInt;
    commType:Byte;
    timeout:SmallInt;
  end;
Dll Fonksiyonu

Kod: Tümünü seç

int DeviceMatch(COMPARAM *comParam)
Delphi Tanımı

Kod: Tümünü seç

function DeviceMatch(HInst:THandle; cParam:PComParam) : Integer;
var
  MyFunct  : function (cParam:PComParam) : Integer; cdecl;
begin
  Result := RET_FAIL;

  try
    MyFunct:=GetProcAddress(HInst,'DeviceMatch');
    if Assigned(MyFunct) Then
      Result := MyFunct(cParam);
  except
  end;
end;
Kullanım

Kod: Tümünü seç

var  PPrm :TComParam; aPPrm:PComParam;
	
PPrm  := ip:'192.168.0.30';port:9001;comtype:1;timeout:30 ;
aPPrm := Addr(PPrm);  =>$18F518:ip:'192.168.0.30';port:9001 $2329;comtype:1;timeout:30 $1E
	
ok := DeviceMatch(aPPrm)=0;
fonksiyon Dll in olduğu dizine Debug.Txt açıp içerisine fonsiyonla gönderilen parametreyi aşağıdaki gibi yazıyor.
DeviceMatch IP:192.168.0.30 Port :589889536 TO: 538436638 ComType :1
Dosyada "Port:" parametresi 9001 ve "TO:" parametresi de 30 yazması gerekirken yukarıdaki gibi çıktı veriyor.

Acaba bu durum nasıl düzeltilir. Yardımcı olabilecek misiniz? İyi çalışmalar,kolay gelsin...
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen ikra »

Her iki record'un tuttugu alan farkli gibi geldi bana. Birinde port integer digerinde smallint kullanmissin. Bu durumda birinde 4 byte digerinde 2 byte yer alacaktir.
kıdemsiz üye
erkankurtaga
Üye
Mesajlar: 62
Kayıt: 04 Oca 2009 06:36

Re: Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen erkankurtaga »

İlginiz için teşekkür ederim. Veri Tipini İnteger da versem bu sefer byte tipinde olan alan için taşma oluyor. 4 byte tipindeki baska bir tip de single onu kullanmak gerek herhalde. :roll:
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen ikra »

Portu her iki tarafta da word kullan. Timeout da eger max 255 olacaksa byte kullanilabilinir. Imkan varsa ortak unitte tanimla recordu, her ikisi de delphi olur. Ip ise Char tipinde array olabilir ama bu durumda sizeof ile kontrol edip ansi mi uni mi dikkat etmen gerekir. Cünkü uni'de char 2 byte anside ise 1 byte yer kaplar.
Diger secenek ise ip'i byte tipinde array tutup oktetler halinde birlestirmek olabilir.
Baktik calismiyor, cay demler alternatifler düsünürüz : )
Kolay gelsin.
kıdemsiz üye
erkankurtaga
Üye
Mesajlar: 62
Kayıt: 04 Oca 2009 06:36

Re: Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen erkankurtaga »

Dll hazır bir dll source u bende degil. Delphi deki record tanımını Dll deki tanıma uydurmak gerekiyor. O record ip 16 byte port ve timeout 4er byte cım type da 1 byte olmak üzere toplamda 25 byte oluyo. Port ve timeout alanlarını single o olarak kullandim. 4 byte olarak bir tek o var. Yalnız söyle bir durumla karşılaştım. Int olarak tanımladığımda pointer olan veride hex olarak değerleri de vardı sayıların. Single yqpınca hex değerler gitti port ve timeoutta. Aklima ister istemez. Sayi degerlerin belleğe hex olarak yazılmadıgı oldu.Bakalım yarın bu sekilde deneyeceğim single tanım ile. Bakalım nasıl olacak. :roll: :roll: :roll:
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen SimaWB »

erkankurtaga yazdı:Port ve timeout alanlarını single o olarak kullandim. 4 byte olarak bir tek o var.
1- Verdiğiniz kodda single kullanmamışsınız. SmallInt kullanmışsınız ki bu 2 byte'tır.
2- Integer da 4 byte değil midir? Yada Cardinal - Longword....

Eğer Dll'de record 25 byte ise siz kendi Record'unuzun boyutunu kontrol ettiniz mi? (SizeOf(TComParam))

"packed record" araştırmanızı tavsiye ederim.

Ayrıca DLL'den fonksiyonu çağırma şeklinizin de sonuçları ciddi değiştireceğini biliyorsunuzdur umarım (cdecl, stdcall, register, pascal)

Aşağıdaki record 25 byte'tır:

Kod: Tümünü seç

TComParam = packed record
  ip: array[1..16] of AnsiChar;
  port: Integer;
  commType: Byte;
  timeout: Integer;
end;
There's no place like 127.0.0.1
erkankurtaga
Üye
Mesajlar: 62
Kayıt: 04 Oca 2009 06:36

Re: Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen erkankurtaga »

Single için bir tek o var derken integerdan sonra demiştim. Ayrıca Cardinal vs denedim. Recordun genişliğini hiç ölçmedim. Bunu Deneyeceğim. Teşekkürler. İp yi string[16] tanımladım ve o sekilde gönderiyorum. Bir sıkıntı yok sadece 4 byte olan integer değerlerde sıkıntı yaşıyorum. İnteger tanımladığım değerler hex değerlerde içeriyordu pointer record da ama single ile bu değerleri göremedim. İlginç gelmişti. Çünkü ilk defa böyle bir olayla karşılaştım :) . Fonksiyonları da dll den cdecl ile çağırıyorum.
erkankurtaga
Üye
Mesajlar: 62
Kayıt: 04 Oca 2009 06:36

Re: Delphideki Recordundaki Integer Değerlerinin Dllde Değişmesi

Mesaj gönderen erkankurtaga »

Herkese çok teşekkürler. Özellikle SimaWB size de çok teşekkürler. Örnek gönderdiğiniz record tanımı problemimi çözdü. Çok teşekkürler.
Cevapla