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#
|