Sayfayı Yazdır | Pencereyi Kapat

c# da delphi ile yazılan dll kullanma

Nereden Yazdırıldığı: Datakent
Kategori: Diğer bölümler
Forum Adı: C# & ASP.NET
Forum Tanımlaması: C# ve ASP.NET ile ilgili soru / sorun ve paylaşım bölümü
URL: http://forum.datakent.com/forum_posts.asp?TID=2308
Tarih: 24.Nisan.2024 Saat 16:48


Konu: c# da delphi ile yazılan dll kullanma
Mesajı Yazan: aziz.alkurt
Konu: c# da delphi ile yazılan dll kullanma
Mesaj Tarihi: 10.Subat.2012 Saat 19:10
Yazdığım fonksiyon saçma da olsa kullanımı göstermek için mükkemmel ölçüde

Delphi tarafı
-------------------------------------------------------------------------------------------
library Project2;
uses SysUtils,Classes;
type TByteArr = array of byte;
var MemStr:TMemoryStream;

function prepareFile(zx:TByteArr; out k:integer):Pointer;export; stdcall;
var b:byte;
begin
MemStr := TMemoryStream.Create;
b:=$61;
MemStr.Write(b,1);
MemStr.Write(zx[0],length(zx));
k:=MemStr.size;
Result:=MemStr.Memory;
end;
procedure DisposeMemStr();export; stdcall;
begin
 FreeAndNil(MemStr);
end;

function isMemStrNULL():boolean;export; stdcall;
begin
  if Assigned(MemStr) then
  Result:=false
  else
  Result:=true;
end;
exports prepareFile,DisposeMemStr,isMemStrNULL;
begin
end.
-------------------------------------------------------------------------------------------

C# tarafı
-------------------------------------------------------------------------------------------
        [DllImport("d:/dlls/Project2.dll", EntryPoint = "prepareFile", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public static extern IntPtr prepareFile(byte[] bytes,ref int l);
        [DllImport("d:/dlls/Project2.dll", EntryPoint = "DisposeMemStr", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public static extern void DisposeMemStr();
        [DllImport("d:/dlls/Project2.dll", EntryPoint = "isMemStrNULL", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public static extern bool isMemStrNULL();
        static void Main(string[] args)
        {
            byte[] bytes = File.ReadAllBytes("d:/denemeImp3.txt");
            int l = 0;
            IntPtr b = prepareFile(bytes,ref l);
            byte[] bx = new byte[ l ];
            Marshal.Copy(b, bx, 0,l);
            File.WriteAllBytes("d:/denemeImp2.txt",bx);
            bool x = isMemStrNULL();
            DisposeMemStr();
            x= isMemStrNULL();
        }
-------------------------------------------------------------------------------------------


delphiden aldığım memorystreamın başlagıç adresi (Pointer) ve uzunluğu. Bu ikisini bildiğim zaman zaten Marshall ile RAM dan onu okuyabiliyorum. Delphide MemStr nesnesini global yapmamın sebebi
işlemim bittikten sonra memory den uçurmak için. Bu işlem sonrası istiyorsanız Marshall ile o adresde anlamlı data var mı diye bakabilirsiniz.

-----------
Calling a Delphi DLL from C#, Use DLL compiled in Delphi 7 in C#



Cevaplar:
Mesajı Yazan: murat turan
Mesaj Tarihi: 15.Subat.2012 Saat 16:31
güzel çalışma

-------------
http://www.kasatakip.com - Kasa Takip  |  http://www.caritakip.com - Cari Takip  |  http://www.evraktakip.com - Evrak Takip  |  http://www.etasqlmobil.com - ETA SQL Mobil



Sayfayı Yazdır | Pencereyi Kapat