Konuyu Oyla:
  • Derecelendirme: 4.5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
PAnsiChar ile başım dertte (Çözüldü)
#1
function Ar_Dll_Function(const TerminalNo: PAnsiChar; const Description: PAnsiChar):Integer;

function Ar_Dll_Function(const TerminalNo: PAnsiChar; const Description: PAnsiChar):Integer;
var MyFunct : function(const TerminalNo: PAnsiChar; const Description: PAnsiChar):Integer;cdecl;
begin
  Result := 0;

  @MyFunct:=GetProcAddress(HInst,'ar_dll_function');
  if Assigned(MyFunct) then
    Result := MyFunct(TerminalNo, Description);
end;

şeklinde tanımlanmış örnek bir dll fonksiyonunda iki adet PAnsiChar parametre mevcut. Bu parametrelere string i PAnsiChara çevirerek değerleri gönderiyorum.
Çevirici fonksiyonum:

function SP(const s:string): PAnsiChar;
var
UTF8Str: RawByteString;
begin
Result := #0;
SetCodePage(UTF8Str, 0, False);
UTF8Str := UTF8Encode(s);
Result := PAnsiChar(AnsiString(UTF8Str));
end;

İki fonksiyonun birbiri ile kullanımı:

result := Ar_Dll_Function(SP(dTermNo),SP(descr));

Debugta Dll fonksiyonun çalıştırılmasına kadar geldiğimde ilk parametrede problem yok. Ama ikinci parametre ya ilk parametre ile aynı oluyor ya da ikinci parametreye fonksiyon ismini yazıyor.

//örnek olarak parametreler :
dtermno:='AT0000058863'; descr:='NAKİT'; 
//Fonksiyona geldiğinde parametreler 
TerminalNo:='AT0000058863'; const Description:='AT0000058863'; //ya da
TerminalNo:='AT0000058863'; const Description:='ar_dll_function'; //oluyor



Yukarıda verdiğim örneklerle problemimi anlatmaya çalıştım. Çözümü ile alakalı yardımlarınız bekliyorum. 
İyi çalışmalar, kolay gelsin. Teşekkürler...
Cevapla
#2
Bu kısmı:
result := Ar_Dll_Function(SP(dTermNo),SP(descr));

Şu şekilde dener misiniz:
var
  p1, p2: PAnsiChar;
begin
  p1 := SP(dTermNo);
  p2 := SP(descr);
 result := Ar_Dll_Function(p1, p2);
 //...

Bir de SP fonksiyonuna gerek yok gibi gözüküyor. Onun yerine direk
p1 := PAnsiChar(AnsiString(dTermNo));
şeklinde kullanabilirsiniz.
There's no place like 127.0.0.1
WWW
Cevapla
#3
(20-12-2017, Saat: 17:35)SimaWB Adlı Kullanıcıdan Alıntı: Bu kısmı:
result := Ar_Dll_Function(SP(dTermNo),SP(descr));

Şu şekilde dener misiniz:
var
  p1, p2: PAnsiChar;
begin
  p1 := SP(dTermNo);
  p2 := SP(descr);
 result := Ar_Dll_Function(p1, p2);
 //...

Bir de SP fonksiyonuna gerek yok gibi gözüküyor. Onun yerine direk
[ars=delphi]p1 := PAnsiChar(AnsiString(dTermNo));
[/ars]
şeklinde kullanabilirsiniz.
 
İlginiz için teşekkürler. Dediğinizi uygulamıştım. Onda da sonuca ulaşamadım. Ama AnsiString yerine UTF8String ile sorunumu çözdüm.

p1 := PAnsiChar(UTF8String(dTermNo));
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Fastreport İçindekiler Sayfası Oluşturma [ÇÖZÜLDÜ] bydelphi 1 181 18-03-2024, Saat: 12:11
Son Yorum: bydelphi
  Çok Satırlı Filtreleme [Çözüldü] bünyamin68 12 1.253 14-02-2024, Saat: 22:42
Son Yorum: mustafaozpinar
  [ÇÖZÜLDÜ] macos işletim sistemine program yazmak shooterman 5 451 02-02-2024, Saat: 09:54
Son Yorum: shooterman
  COZULDU veritabani prg yerine ne kullanabilirim. sadikacar60 8 694 29-01-2024, Saat: 18:41
Son Yorum: sadikacar60
  DbGrid'de Seçili Satırların Fast Reportta Raporlanması [ÇÖZÜLDÜ] bünyamin68 4 637 17-12-2023, Saat: 15:08
Son Yorum: bünyamin68



Konuyu Okuyanlar: 1 Ziyaretçi