纯手写来段!
最近想把Delphi 写的程序转成C# ,但其中有些数据转有点麻烦,写了个Dll ,供C# 调用
1.从Delphi Dll 中获得[整数] 址传递参数
Delphi 代码如下:
procedure getVarInt(var i:Integer);stdcall;
procedure getVarInt(var i:Integer);
begin
inc(i);
end;
.Net 代码:
[DllImport(__DLLName, EntryPoint = "getVarInt", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void getVarInt(ref Int32 i);
///调用
int i = 1;
CommonDLL.getVarInt(ref i);
MessageBox.Show(i.ToString());
2.从Delphi Dll 中获得[字符串] 址传递参数
procedure getVarStr(var ADest:PAnsiChar );stdcall;
var
S: AnsiString;
c:PAnsiChar;
i,ADestSize:Integer;
begin
s:='ddfsdf' ;
ADestSize:= Length(S)*SizeOf(s[1]);
GetMem(ADest,ADestSize);
Move(S[1], ADest^,ADestSize);
end;
C# 使用
[DllImport(__DLLName, EntryPoint = "getVarStr", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void getVarStr(ref IntPtr s);
private void button3_Click(object sender, EventArgs e)
{
IntPtr Pdata = new IntPtr(0);
CommonDLL.getVarStr(ref Pdata);
string X = Marshal.PtrToStringAnsi(Pdata);
MessageBox.Show(X);
}
3.把一个文件流通过指针传给C#
delphi 代码:
//功能通过传入的文件名, 返回文件流指针 参数:文件名 ;返回字符流的长度; 字节流的指针
procedure GetStream( FileName:PAnsiChar;var L:Integer; var Pdata:Pointer);
var
stream:Tstream;
pbyte:array of Byte;
begin
stream:=TFileStream.Create(FileName,fmOpenRead);
stream.Position:=0;
SetLength(pbyte,stream.Size);
stream.Read(pbyte[0],stream.Size*sizeof(byte));
Pdata:=pbyte;
L:=stream.Size;
stream.Free;
end;
C#调用
[DllImport(__DLLName, EntryPoint = "GetStream", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void GetStream(string FName,ref int i, ref IntPtr Pdata);
private void button2_Click(object sender, EventArgs e)
{
string Fname = @"d:\434.jpg";
int L = 0;
IntPtr Pdata=new IntPtr(0);
CommonDLL.GetStream(Fname, ref L, ref Pdata);
if (L > 0)
{
FileStream fs = new FileStream(@"d:\434_2.jpg",FileMode.Create);
fs.Position = 0;
byte[] managedArray = new byte[L];
Marshal.Copy(Pdata, managedArray, 0, L);
fs.Write(managedArray,0, L * sizeof(byte));
fs.Dispose();
MessageBox.Show("OK");
}
}
以上只是抛砖引玉各位,请各位看官自行参考发挥