c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
remi
Üye
Mesajlar: 5
Kayıt: 21 Eki 2015 08:28

c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen remi »

örnek c# projesi bu linkte:

http://api.mesajpaneli.com/json_api/download/CSharp.rar

MesajPaneli.dll adlı dll'i delphide kullanmak istiyorum.Şöye söyliyeyim.Standart fonksiyon içeren bir dll olsaydı yapardım.Nitekim delphi'de

Kod: Tümünü seç

function DoPost(URL:string;isPostBase64:Boolean;isReturnBase64:Boolean):Integer; stdcall; external 'MesajPaneli.dlll';
yazabiliyorum,ama hiç bir şey ifade etmiyor,zira class tanımı yapılmalı diye tahmin ediyorum.Sonra şunu düşündüm.Eğer c# dll bir class içeriyorsa onu com nesnesi gibi düşünüp

Kod: Tümünü seç

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe c:\YEDEK\MesajPaneli.dll /tlb:MesajPaneli.tlb
dll'den tlb dosyası oluşturayım ve Delphi'den Project->Import Type Library'den .tlb uzantılı dosya ekleyip ve "Create Unit" ilr bir ActiveX oluşturayım.Fakat böyle çalışmadı.Yardımcı olabilecek herkese çok teşekkürler.


c#kodu:

Kod: Tümünü seç

 smsData MesajPaneli = new smsData();
			MesajPaneli.user = new UserInfo("UserName", "Password");

			Console.Write("Lütfen referans numarasını girin. (0 veya ref no): ");
			int RefNo = Convert.ToInt32(Console.ReadLine());
			MesajPaneli.refno = RefNo;

			MesajPaneli.tarih.basla = "2014-09-01 00:00:00";
			MesajPaneli.tarih.bitis = "2014-09-30 23:59:00";
			MesajPaneli.limit = 1;

			ReturnValue ReportList = MesajPaneli.DoPost("http://api.mesajpaneli.com/json_api/report/", true, true);
burda smsData MesajPaneli.dll içinde tanımlı kod aşağıda:

Kod: Tümünü seç

#region Assembly MesajPaneli, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null
// C:\Users\admin\Desktop\web service sample\SmsVitriniDemo\DLL\MesajPaneli.dll
#endregion

using System.Collections.Generic;
using MesajPaneli.Models;
using MesajPaneli.Models.JsonPostModels;

namespace MesajPaneli.Business
{
    public class smsData
    {
        public int limit;
        public string msgBaslik;
        public List<msgdata> msgData;
        public int refno;
        public Tarih tarih;
        public UserInfo user;

        public smsData();

        //
        // Summary:
        //     Adresten gelen cevabı Json formatında geri döndürür.
        //
        // Parameters:
        //   URL:
        //     WebApi adresi.
        public ReturnValue DoPost(string URL, bool isPostBase64, bool isReturnBase64);
    }
}

Kod: Tümünü seç

#region Assembly MesajPaneli, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null
// C:\Users\admin\Desktop\web service sample\SmsVitriniDemo\DLL\MesajPaneli.dll
#endregion

namespace MesajPaneli.Models.JsonPostModels
{
    public class UserInfo
    {
        public string name;
        public string newpass;
        public string pass;

        //
        // Summary:
        //     Kullanıcı bilgileri
        //
        // Parameters:
        //   namex:
        //     Kullanıcı Adı
        //
        //   passx:
        //     Kullanıcı Şifresi
        public UserInfo(string namex, string passx);
        //
        // Parameters:
        //   namex:
        //     Kullanıcı Adı
        //
        //   passx:
        //     Kullanıcı Şifresi
        //
        //   newpassx:
        //     Yeni Şifre
        public UserInfo(string namex, string passx, string newpassx);
    }
}
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen mrmarman »

Bir soru

- SMSData XML yapısını kendin doldurup direkt "http://api.mesajpaneli.com/json_api/" adresine post etsen olmuyor mu ? Bana olur gibi gedi. Çünkü C# kodunda yapılan da bu.
Resim
Resim ....Resim
remi
Üye
Mesajlar: 5
Kayıt: 21 Eki 2015 08:28

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen remi »

Sağol üstadım,MesajPaneli.xml adlı dosya var fakat ben xml yapısı nasıl doldurulur ve nasıl post edilir onu tam çözemedim :shock: ,kendi yaptığım aşağıda,
kullanıcı adı ve şifre yanlış olsada önemli olan dönen mesajdır,"yanlış kullanıcı" mesajı gelir,gerçek bir kullanıcı adı ve şifre üzerinden test etmek istiyorum diyorsanız web adresinde ücretsiz üye olup max 10 kontör alabiliyorsunuz:

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,MSXML_TLB;

type
   
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;

    function HTTPPoster(prmPostAddress: string; prmSendData: WideString): WideString;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.HTTPPoster(prmPostAddress: string; prmSendData: WideString): WideString;
var
  XMLSender: TXMLHTTPRequest;
begin
  try
    XMLSender := TXMLHTTPRequest.Create(Application);
    XMLSender.open('POST', prmPostAddress, False);
    XMLSender.send(prmSendData);
    Result := XMLSender.responseText;
  except
    Result := '';
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var xml,ServiceAddress,ReturnVal:string;
   tel,mesaj,kullanici,sifre:string;
begin
    kullanici:='55555';
    sifre:='1111';
    ServiceAddress := 'http://api.mesajpaneli.com/json_api/';
    tel:='536111111';
    mesaj:='deneme mesajı';

xml:='';
xml:=xml+'<?xml version="1.0"?>';
xml:=xml+'<doc>';
xml:=xml+'<assembly>';
xml:=xml+'<name>MesajPaneli</name>';
xml:=xml+'</assembly>';
xml:=xml+'<members>';
xml:=xml+'<member name="T:MesajPaneli.Models.JsonPostModels.msgdata">';
xml:=xml+'<summary>';
xml:=xml+'Mesaj içeriği';
xml:=xml+'</summary>';
xml:=xml+'</member>';
xml:=xml+'<member name="M:MesajPaneli.Models.JsonPostModels.msgdata.#ctor(System.String,System.String)">';
xml:=xml+'<summary>';

xml:=xml+'</summary>';
xml:=xml+'<param name="telx">'+tel+'</param>';
xml:=xml+'<param name="msgx">'+mesaj+'</param>';
xml:=xml+'</member>';
xml:=xml+'<member name="M:MesajPaneli.Business.smsData.DoPost(System.String,System.Boolean,System.Boolean)">';
xml:=xml+'<summary>';
xml:=xml+'Adresten gelen cevabı Json formatında geri döndürür.';
xml:=xml+'</summary>';
xml:=xml+'<param name="URL">'+ServiceAddress+'</param>';
xml:=xml+'<returns></returns>';
xml:=xml+'</member>';
xml:=xml+'<member name="T:MesajPaneli.Models.ReturnValue">';
xml:=xml+'<summary>';
xml:=xml+'Ortak özellikler';
xml:=xml+'</summary>';
xml:=xml+'<summary>';
xml:=xml+'Sms gönderdikten sonraki dönecek veri yapısı.';
xml:=xml+'</summary>';
xml:=xml+'<summary>';
xml:=xml+'Refund Data Geri Dönüş Bilgisi';
xml:=xml+'</summary>';
xml:=xml+'</member>';
xml:=xml+'<member name="M:MesajPaneli.Models.JsonPostModels.UserInfo.#ctor(System.String,System.String)">';
xml:=xml+'<summary>';
xml:=xml+'Kullanıcı bilgileri';
xml:=xml+'</summary>';
xml:=xml+'<param name="namex">'+kullanici+'</param>';
xml:=xml+'<param name="passx">'+sifre+'</param>';
xml:=xml+'</member>';
xml:=xml+'<member name="M:MesajPaneli.Models.JsonPostModels.UserInfo.#ctor(System.String,System.String,System.String)">';
xml:=xml+'<summary>';
            
xml:=xml+'</summary>';
//xml:=xml+'<param name="namex">Kullanıcı Adı</param>';
//xml:=xml+'<param name="passx">Kullanıcı Şifresi</param>';
//xml:=xml+'<param name="newpassx">Yeni Şifre</param>';
xml:=xml+'</member>';
xml:=xml+'</members>';
xml:=xml+'</doc>';

ReturnVal := HTTPPoster(ServiceAddress, xml);

memo1.Text:=  ReturnVal;

end;



end.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen mrmarman »

Merhaba.

PHP kodlarına baktım onda daha açık olduğundan herşey ortada...

Kod: Tümünü seç

		$request = "data=" . base64_encode(json_encode($request));
....
		return json_decode(base64_decode($result),TRUE); 
ile anlaşılan şöyle:
- Öncelikle gönderin MIME yani Base64 olmalı.

Kod: Tümünü seç

xml:= TIdEncoderMIME.EncodeString(xml, IndyTextEncoding_UTF8); // Uses IdCoderMIME, IdGlobal eklenecek
- Gelen değerleri de aldığın gibi okuyamazsın, yine Base64 ile Decode etmen lazım.

Kod: Tümünü seç

  strGelen := TIdDecoderMIME.DecodeString(strGelen, IndyTextEncoding_UTF8);
- Ayrıca büyük bir ihtimal şifreni direkt değil MD5 ile kodlayıp göndermen lazım.

- Bu konuda firma ile görüşüp gönderilmiş ve alınmış birer JSON içeriği isteyebilirsin. Sonra bunu aynı yaptığın gibi doldurup kullanırsın.

- XML yapı sadece DLL ile anlaşmak için kurulmuş görünüyor. Yani bu XML aslen API url'sine gönderilecek olan değil, DLL'nin rahatlıkla bileşenlerine ayırabilmesi için bir ara çözüm olarak tasarlandığını değerlendiriyorum.

- Firma gönderirse JSON'u buraya da yaz ki sonucu beraber değerlendirelim.
Resim
Resim ....Resim
remi
Üye
Mesajlar: 5
Kayıt: 21 Eki 2015 08:28

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen remi »

Yardımınız için çok teşekkür ederim.

https://smsvitrini.com/cozumler/api

adresindeki api'ye birebir delphi'ye uyarladım ve bu delphi kodu çalışıyor,burdan sms gönderebiliyorum:

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var s:string;
   ceptel,isim,smsMesaj:string;
   str:TstringList;
   response:TStringStream;
begin
   ServiceAddress := 'http://api.smsvitrini.com/index.php';

   smsMesaj:= (trim(Memo2.Text));
   isim:= trim(edit2.Text);
   ceptel:=(trim(edit3.Text));

   //"islem=1&user=xxx&pass=yyy&mesaj=Deneme&numaralar=5321112233,5424445566,5056661144&baslik=850"
   if ceptel<>'' then begin

      str := TStringList.Create;
      Response:= TStringStream.Create('');
      try
         str.Clear;
         IdHTTP1.Disconnect;
         str.Add('islem=1');
         str.Add('&user='+kullanici);
         str.Add('&pass='+sifre);
         str.Add('&mesaj='+smsMesaj);
         str.Add('&numaralar='+ceptel);
         str.Add('&baslik='+orginator);
         IdHTTP1.Post(ServiceAddress,str,Response);
         memo1.text := Response.DataString;
      except
         on e: exception do begin
            memo1.text:='';
         end;
      end;
      str.Free;
   end;


end;
fakat bu api yetersiz kaldı,şöyle ki: Ben toplu gönderimde her cep telfonuna ayrı mesaj göndermek istiyorum,yani

mesaj1,tel1
mesaj2,tel2
mesaj3,tel3

bunlaral görüştüm,bu apinin yetersiz kaldığını ve bu işlemi bu api ile yapılamayacağını söylediler ve bu adresteki php/c# ile yapılacağını söylediler

http://api.mesajpaneli.com/json_api/usage

sorun bu, :?: :(
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen mrmarman »

Madem diyaloğun var.
Şöyle bir yapıyı gönder ve hatanın nerede olduğunu söylesinler.
PHP'den okuyarak çıkardığım JSON sonuç şöyle.. :idea:
Aşağıdaki yapıyı BASE64 ile kodlayıp yollayınca

Kod: Tümünü seç

{"user":{"name":"5321111111","pass":"123456"},"msgBaslik":"850","msgData":{"tel":"5323333333","msg":"Test Mesajidir"}}
cevap olarak

Kod: Tümünü seç

{"status":false,"error":"Post Datas\u0131 Eksik veya Hatal\u0131"}
şeklinde dönüş oluyor. Yani sistem çalışıyor. Tek içeriğin doldurulması kalıyor. :)

PHP kodunu buradan hatırlatayım, başka okuyanlar da yorumlarlar

Kod: Tümünü seç

<?php 
	$mesajData['user'] = array(
		'name' => 'kullaniciAdi',
		'pass' => 'sifre'
	);
	$mesajData['msgBaslik'] = '850';
	$mesajData['msgData'][] = array(
		'tel' => '531xxxxxxx',  
		'msg' => 'Mesaj Metni'
	);
	$mesajData['msgData'][] = array(
		'tel' => '531xxxxxxx',  
		'msg' => 'Mesaj Metni 2'
	);

	$mesajInfo = MesajPaneliGonder($mesajData);

	var_dump($mesajInfo);

	// === Gonderim Fonksiyonu ===
	function MesajPaneliGonder($request){
		$request = "data=" . base64_encode(json_encode($request));
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, 'http://api.mesajpaneli.com/json_api/');
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1) ;
		curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
		curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		$result = curl_exec($ch);
		curl_close($ch);
		return json_decode(base64_decode($result),TRUE);
	}
?>
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen mrmarman »

Müjde Çalıştı :bravo:
Evet bir proje açıp denemeye karar verdim.
Daha iyisi ücretsiz 10 mesaj hakkı veriyorlarmış.. :D Ben de bir tane hesap açtım.

Giden :

Kod: Tümünü seç

{
  "user":{"name":"532xxxxxxx","pass":"123456"},
  "msgBaslik":"850",
  "msgData":{
    "0":{"tel": "532xxxxxx1","msg": "Test Mesajidir"},
    "1":{"tel": "532xxxxxx2","msg": "Test Mesajidir"},
    "2":{"tel": "532xxxxxx3","msg": "Test Mesajidir"}
  }
}
Gelen :

Kod: Tümünü seç

{"status":true,"amount":1,"type":"Numeric","credits":7,"ref":2598xxx8}
Sen şimdi kendi login bilgilerinde bir kaç deneme yaparsın.
Bir test formuna (3) tane TEdit (3) tane de TMemo koy

Kod: Tümünü seç

USES IdHttp, IdCoderMIME, IdGlobal;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Text       := '532xxxxxxx';
  Edit2.Text       := '123456';

  Edit3.Text       := '532xxxxxx1';
  Memo1.Lines.Text := 'Test Mesajidir';
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
Const
  strApiURL = 'http://api.mesajpaneli.com/json_api/';
Var
  strData, strGelen : String;
  Param : TStringList;
  Resp  : TStringStream;
begin
  strData :=  '{'#13
              + '"user":{'
                + '"name":"'  +Edit1.Text +'"'
                +','
                + '"pass":"'  +Edit2.Text +'"'
              + '}'
              +','#13
              + '"msgBaslik":"850"'
              +','#13
              + '"msgData":{'#13

                + '"0":{'
                  + '"tel": "'   + Trim(Edit3.Text)+'"'
                  +','
                  + '"msg": "'   + Trim(Memo1.Lines.Text) +'"'
                + '}'
                +#13

              + '}'#13
            + '}';
  Memo2.Lines.Text := strData;
  strData := TIdEncoderMIME.EncodeString(strData, IndyTextEncoding_UTF8); // Uses IdCoderMIME, IdGlobal

  With TIdHttp.Create(nil) do
  begin
    Resp  := TStringStream.Create('');
    Param := TStringList.Create;
    Param.Add( 'data=' + strData );
      Post(strApiURL, Param, Resp);
      strGelen := TIdDecoderMIME.DecodeString(Resp.DataString, IndyTextEncoding_UTF8);
    Free;
    Resp.Free;
    Param.Free;
  end;
  Memo3.Lines.Text := strGelen;
end;

EDIT:
JSON için yapıya nasıl ulaştık.., PHP'deki array yapısını print_r ile açılımı aldık.

Kod: Tümünü seç

Array
(
    [user] => Array
        (
            [name] => kullaniciAdi
            [pass] => sifre
        )

    [msgBaslik] => 850
    [msgData] => Array
        (
            [0] => Array
                (
                    [tel] => 531xxxxxxx
                    [msg] => Mesaj Metni
                )

            [1] => Array
                (
                    [tel] => 531xxxxxxx
                    [msg] => Mesaj Metni 2
                )

        )

)
Resim
Resim ....Resim
remi
Üye
Mesajlar: 5
Kayıt: 21 Eki 2015 08:28

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen remi »

Açıkçası umudumu kesmiştim,şimdi test ettim çalışıyor,
Tam istediğim buydu

Kod: Tümünü seç

strData :=
  '{ '+
  '"user":{"name":"'+Edit1.Text+'","pass":"'+Edit2.Text+'"},'+
  '"msgBaslik":"850",'+
  '"msgData":{'+
    '"0":{"tel": "53611111","msg": "Test Mesajidir1 ali"},'+
    '"1":{"tel": "54311111","msg": "Test Mesajidir2 can"},'+
    '"2":{"tel": "55511111","msg": "Test Mesajidir2 zeki"}'+
  '}'+
  '}';
çok teşekkür ederim,Allah razı olsun,elinize sağlık,iyiki varsınız...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: c# class içrene dll dosyasını Delphi'de nasıl kullanırım?

Mesaj gönderen mrmarman »

Rica ederim.
Benim için de iyi bir deneyim oldu.
AVEA kurumsal ile yıllık toplu 300.000 SMS'lik anlaşmamız var.
WebService üzerinden otomasyon projesi geliştirdiğimden, bu da biraz farklı geldi ve ilgimi çekti. Orada işler XML üzerinden yürüyor.

Türkçe karakter sıkıntısı yaşıyorum. Burada json ile MIME kodlu göndermesi kısmı hoşuma gitti, çünkü XML içerisinde Unicode ve özel karakter sıkıntısı var. Benim projede de benzeri bir açılım yapmayı düşünüyorum.

Başarılar. :)
Resim
Resim ....Resim
Cevapla