Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphide ki sınıfı C# ta kullanma
#1
Merhaba Delphide yazmış olduğum bir sınıf kütüphanesini C# ta referans ekleyip nasıl instance alıp kullanabilirim. Örnek kod yazarsanız sevinirim henüz Delphide yeniyim
Cevapla
#2
(23-07-2017, Saat: 11:57)ilhan03 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba Delphide yazmış olduğum bir sınıf kütüphanesini C# ta referans ekleyip nasıl instance alıp kullanabilirim. Örnek kod yazarsanız sevinirim henüz Delphide yeniyim

Merhaba,
DelphiCan'a hoş geldiniz.
Delphi'de henüz yeniyim diyorsunuz, fakat harici bir kütüphane yazacak kadar kendinizi geliştirmişsiniz. Bu anlamda platformumuza katkınızı bekliyoruz.
Talep etmiş olduğunuz yardım, tamamen C# kodlama tekniğidir.
DelphiCan'da, yalnızca Delphi ve Object Pascal paylaşımları yapılmaktadır. Dikat ettiyseniz, diğer yazılım dillerine ait bir bölümüz yok.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
Fesih hocam bana sorarsanız arkadaş yaman ve güzel bir soru sormuş.

Bildiğim kadarıyla, nasıl yapılabileceği ile ilgili fikir vereyim.

- Delphi'de yazdığınız sınıf kütüphanesini DLL projesine çevirebilirsiniz.

- DLL projesi içersinde yazdığınız sınıflar haricinde, export direktifli fonksiyonlar ekleyerek, harici uygulamalardan bu fonksiyonları çağırılabilir hale getirebilirsiniz.

- C#'da instance almak yerine, bu işi DLL içersinde export direktifi ile işaretlediğiniz fonksiyonlar içersinde yapabilirsiniz.Aynı şekilde referansı(instance) yok etme işini de DLL içinde yapabilirsiniz.Hafızada tahsis ve yok etme işini DLL içersinde ki fonksiyonlar içinde yapmak, hem sizin hem de yazacağınız DLL'i kullanan kişi için daha kolay olacaktır.

- Delphi'den export direktifi ile işaretliğiniz fonksiyonları, başka bir programlama dilinden çağırabilmek için, hangi programlama dilinde geliştirme yapıyorsanız en temelde Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol, Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol Windows API fonksiyonlarını kullanabiliyor olmalısınız.

- C# programlama dilinde bu API fonksiyonlarını Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol attribute yardımıyla kullanabilirsiniz.
Yapmaya çalıştığınız managed code içinden unmanaged code kullanmak, kısaca p-invoke diye ifade edilir.Bahsettiklerim ile ilgili arama yaparsanız pek çok örneğe rastlayabilirsiniz.

Bunların dışında alternatif olarak com gibi yöntemler kullanılabilir.
My name is nobody.
WWW
Cevapla
#4
ismail bey teşekkür ederim önerdiğiniz yöntem fonksiyon ve prosedür kullanımında işe yarayan bir yöntem ancak sınıfı intance alıp kullanabilmek için delphide yazdığım sınıfı(DLL) COM nesnesine dönüştürmem gerekiyor. Bunu diğer dillerde proje seçeneklerinden yapabiliyorum ancak Delphi de bilmiyorum. C# ın nesne olarak görebilmesi için referanslardan eklemeliyim diye düşünüyorum.
Cevapla
#5
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol  buraya bir gözatabilirsiniz.
Bahsettiğim yöntem COM nesnesi kullanımına göre biraz daha karmaşık gelebilir.Fakat avantaj olarak COM'a register etme gibi işlerle uğraşmazsınız.
Gördüğüm kadarıyla COM'da kullansanız mevcut sınıflarınızı sarmalamanız gerekecek gibi.
My name is nobody.
WWW
Cevapla
#6
Basitçe COM nesnesi üretimi ve .net içersinde kullanımı ile ilgili yaptığım testtir.
- Delphi'de yeni bir "ActiveX Library" projesi açılır. Project1.ridl sekmeli bir ekran gelecek.

01.png

- File - New - ActiveX ile açılan menüden "Com Object" seçerek hokkabazın açılması sağlandıkdan, sonra gelen ekranda sınıf ve interface bilgileri doldurulur.

02.png

- Yukarıdaki ekranda tamam dedikten sonra proje görüntüsü aşağıdaki gibi gibi olması beklenir.

03.png

- Bu ekranda IHababamSinifi interface üzerinde sağ tıklayınıp method, property vs eklenebilir.Ekledikten sonra "Refresh implementation" butonuna tıklanmalıdır.Bu işlemden sonra interface ve sınıfa ilgili methodlar eklenir.Sonrasında bu methodların içersini dilersek doldurabiliriz.

04.png

Unit2.pas
unit Unit2;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
 Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl;

type
 THababamSinifi = class(TTypedComObject, IHababamSinifi)
 protected
   function Method1: HResult; stdcall;
   function Method2: HResult; stdcall;
 end;

implementation

uses ComServ;

function THababamSinifi.Method1: HResult;
begin
 Result := S_OK;
 MessageBox(0, 'COM Method 1 ', '', 0);
end;

function THababamSinifi.Method2: HResult;
begin
 Result := S_OK;
 MessageBox(0, 'COM Method 2 ', '', 0);
end;

initialization

TTypedComObjectFactory.Create(ComServer, THababamSinifi, Class_HababamSinifi,
 ciMultiInstance, tmApartment);

end.


Project1_TLB.pas
unit Project1_TLB;

// ************************************************************************ //
// WARNING
// -------
// The types declared in this file were generated from data read from a
// Type Library. If this type library is explicitly or indirectly (via
// another type library referring to this type library) re-imported, or the
// 'Refresh' command of the Type Library Editor activated while editing the
// Type Library, the contents of this file will be regenerated and all
// manual modifications will be lost.
// ************************************************************************ //

// $Rev: 45604 $
// File generated on 7/28/2017 12:46:06 AM from Type Library described below.

// ************************************************************************  //
// Type Lib: C:\Users\isocan\Desktop\comobj\delphi\Project1 (1)
// LIBID: {4E622936-C383-473F-ACF5-AD2E8C0996CE}
// LCID: 0
// Helpfile:
// HelpString:
// DepndLst:
//   (1) v2.0 stdole, (C:\Windows\SysWOW64\stdole2.tlb)
//   (2) v4.0 StdVCL, (C:\Windows\SysWOW64\stdvcl40.dll)
// SYS_KIND: SYS_WIN32
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
{$ALIGN 4}

interface

uses Winapi.Windows, System.Classes, System.Variants, System.Win.StdVCL, Vcl.Graphics, Vcl.OleServer, Winapi.ActiveX;


// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:
//   Type Libraries     : LIBID_xxxx
//   CoClasses          : CLASS_xxxx
//   DISPInterfaces     : DIID_xxxx
//   Non-DISP interfaces: IID_xxxx
// *********************************************************************//
const
 // TypeLibrary Major and minor versions
 Project1MajorVersion = 1;
 Project1MinorVersion = 0;

 LIBID_Project1: TGUID = '{4E622936-C383-473F-ACF5-AD2E8C0996CE}';

 IID_IHababamSinifi: TGUID = '{8B7E34A1-8D76-4937-A5E9-65C1AEBC4D04}';
 CLASS_HababamSinifi: TGUID = '{AEAC2DA6-AC21-4D27-AB17-97ADD05539A3}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
 IHababamSinifi = interface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
 HababamSinifi = IHababamSinifi;


// *********************************************************************//
// Interface: IHababamSinifi
// Flags:     (256) OleAutomation
// GUID:      {8B7E34A1-8D76-4937-A5E9-65C1AEBC4D04}
// *********************************************************************//
 IHababamSinifi = interface(IUnknown)
   ['{8B7E34A1-8D76-4937-A5E9-65C1AEBC4D04}']
   function Method1: HResult; stdcall;
   function Method2: HResult; stdcall;
 end;

// *********************************************************************//
// The Class CoHababamSinifi provides a Create and CreateRemote method to
// create instances of the default interface IHababamSinifi exposed by
// the CoClass HababamSinifi. The functions are intended to be used by
// clients wishing to automate the CoClass objects exposed by the
// server of this typelibrary.
// *********************************************************************//
 CoHababamSinifi = class
   class function Create: IHababamSinifi;
   class function CreateRemote(const MachineName: string): IHababamSinifi;
 end;

implementation

uses System.Win.ComObj;

class function CoHababamSinifi.Create: IHababamSinifi;
begin
 Result := CreateComObject(CLASS_HababamSinifi) as IHababamSinifi;
end;

class function CoHababamSinifi.CreateRemote(const MachineName: string): IHababamSinifi;
begin
 Result := CreateRemoteComObject(MachineName, CLASS_HababamSinifi) as IHababamSinifi;
end;

end.

Project1.ridll
// ************************************************************************ //
// WARNING
// -------
// This file is generated by the Type Library importer or Type Libary Editor.
// Barring syntax errors, the Editor will parse modifications made to the file.
// However, when applying changes via the Editor this file will be regenerated
// and comments or formatting changes will be lost.
// ************************************************************************ //
// File generated on 7/28/2017 12:47:59 AM (- $Rev: 12980 $, 21122067).

[
  uuid(4E622936-C383-473F-ACF5-AD2E8C0996CE),
  version(1.0)

]
library Project1
{

 importlib("stdole2.tlb");
 importlib("stdvcl40.dll");

 interface IHababamSinifi;
 coclass HababamSinifi;


 [
    uuid(8B7E34A1-8D76-4937-A5E9-65C1AEBC4D04),
    helpstring("Interface for HababamSinifi Object"),
    oleautomation
  ]
 interface IHababamSinifi: IUnknown
 {
   [id(0x00000065)]
   HRESULT _stdcall Method1(void);
   [id(0x00000066)]
   HRESULT _stdcall Method2(void);
 };

 [
    uuid(AEAC2DA6-AC21-4D27-AB17-97ADD05539A3),
    helpstring("HababamSinifi")
  ]
 coclass HababamSinifi
 {
   [default] interface IHababamSinifi;
 };

};

Project1.dpr
library Project1;

uses
 ComServ,
 Project1_TLB in 'Project1_TLB.pas',
 Unit2 in 'Unit2.pas' {HababamSinifi: CoClass};

exports
 DllGetClassObject,
 DllCanUnloadNow,
 DllRegisterServer,
 DllUnregisterServer,
 DllInstall;

{$R *.TLB}

{$R *.RES}

begin
end.

COM nesnesi projesi derlendikten sonra oluşan DLL komut satırından aşağıdaki komut çalıştırılarak register edilir.
regsvr32 Project1.dll

.net projesinde "References" düğümü üzerine "Add Reference" -> COM -> Type Libraries tıklanır.Gelen listeden "Project1" seçilerek projeye dahil edilir. .Net tarafında sınıf ve interface'ler aşağıdaki şekildedir.

    [ClassInterface(0)]
    [Guid("AEAC2DA6-AC21-4D27-AB17-97ADD05539A3")]
    [TypeLibType(2)]
    public class HababamSinifiClass : IHababamSinifi, HababamSinifi
    {
        public HababamSinifiClass();

        public virtual void Method1();
        public virtual void Method2();
    }


    [Guid("8B7E34A1-8D76-4937-A5E9-65C1AEBC4D04")]
   [InterfaceType(1)]
   [TypeLibType(256)]
   public interface IHababamSinifi
   {
       void Method1();
       void Method2();
   }

    [CoClass(typeof(HababamSinifiClass))]
   [Guid("8B7E34A1-8D76-4937-A5E9-65C1AEBC4D04")]
   public interface HababamSinifi : IHababamSinifi
   {
   }

Kullanım:
using Project1;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace COMClient
{
   class Program
   {
       static void Main(string[] args)
       {
           IHababamSinifi instance = new HababamSinifi();
           instance.Method1();
           instance.Method2();
       }
   }
}

Projeyi çalıştırdığınızda "Any CPU" olarak derlenmişse aşağıdaki ComException hatası gelebilir.
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll
Additional information: Retrieving the COM class factory for component with CLSID {AEAC2DA6-AC21-4D27-AB17-97ADD05539A3} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

.Net projesini Any CPU yerine 32 bit olarak derlediğimde yukarıdaki hata mesajı gelmeden problemsiz çalışmakta.Nedenini bilmiyorum.
Kullandığım işletim sistemi windows 7 / 64 bit.Fakat delphi COM nesnesi için derlediğimiz DLL 32 bit. .net uygulaması Any CPU olarak derlendiğinde varsayılan olarak sistemime göre 64 bit olarak çalışıyorsa, 32 bit delphi DLL'ini kullanamıyor veya registry'e erişim ile ilgili bir problem olabilir diye tahmin ediyorum.
My name is nobody.
WWW
Cevapla
#7
üstad tamda istediğim gibi bir çalışma olmuş. birde resimleri görünseydiSmile Ama bunu kullanan arkadaşlar eminim Delphi nin kıymetini bilen kişiler olacaktır ve ne mutluki sizin gibi yardımsever kişiler var. ve şunuda ilave edeyim nette bu konuda bayadır araştırma yapıyorum Türkçe,ingilizce vs hiçbir yerde tatmin edici bir bilgiye ulaşamadım. Bu çalışma sadece Türkiye değil diğer ülkelerdeki Delphi kullanıcılarında ufukunu açacaktır. Emeğinize sağlık.
Cevapla
#8
(28-07-2017, Saat: 16:31)ilhan03 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olbirde resimleri görünseydiSmile

Resimler bende gözüküyor.
There's no place like 127.0.0.1
WWW
Cevapla
#9
(28-07-2017, Saat: 16:31)ilhan03 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olüstad tamda istediğim gibi bir çalışma olmuş. birde resimleri görünseydiSmile Ama bunu kullanan arkadaşlar eminim Delphi nin kıymetini bilen kişiler olacaktır ve ne mutluki sizin gibi yardımsever kişiler var. ve şunuda ilave edeyim nette bu konuda bayadır araştırma yapıyorum Türkçe,ingilizce vs hiçbir yerde tatmin edici bir bilgiye ulaşamadım. Bu çalışma sadece Türkiye değil diğer ülkelerdeki Delphi kullanıcılarında ufukunu açacaktır. Emeğinize sağlık.

Merhaba,
Ctrl + Shift + Delete ile browser geçmişinizi temizleyerek, sorunu çözebilirsiniz.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#10
imgur.com'a upload etmiştim.Sanırım yasaklı olduğu için o yüzden görünmüyor.
Düzgün görünenen birisi tekrar başka bir yere upload edip mesajı düzenleyebilirse iyi olabilir.
My name is nobody.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Harici dll içerisindeki metod Delphide nasıl çağırılır. yhackup 11 208 22-02-2018, Saat: 09:39
Son Yorum: yhackup
  delphide kamera arsl01 8 118 20-02-2018, Saat: 08:46
Son Yorum: esistem
  Delphide Chart Kullanımı mcuyan 2 269 11-08-2017, Saat: 02:17
Son Yorum: mcuyan
  Activex Kullanma veya oluşturma Lord_Ares 4 423 25-05-2017, Saat: 16:31
Son Yorum: Lord_Ares
  Nesneleri döngü içerisinde kullanma dnzmobile 8 522 19-04-2017, Saat: 09:57
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi