delphi dll 源码:
type
char10 = array[0..9] of char;
TMydata = packed record
id: Integer;
name: char10;
married: Boolean;
salary: Double;
end;
PMydata = ^TMydata;
const
RESSTR: array[0..4] of string = ('HELLO', 'COLOR', 'DELPHI', 'shared', 'library');
NO_RESULT= 'no result';
var
mydata: TMydata;
{$R *.res}
// 返回字符串指针
function getResStr(aindex: Integer): PChar; stdcall;
begin
if aindex < Length(RESSTR) then
begin
Result := pchar(RESSTR[aindex]);
end
else
begin
Result := pchar(NO_RESULT);
end;
end;
// 返回结构体指针
function getMydata: PMydata; stdcall;
begin
with mydata do
begin
id := 123;
name := 'obama';
married := false;
salary := 1200;
end;
Result := @mydata;
end;
exports getResStr, getMydata;
begin
end.
[DllImport("dllres.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr getMydata();
public struct Mydata
{
public int id; //0
public string name; //4
public bool married; //24
public double salary; //25
public Mydata(byte[] data)
{
if (data != null && data.Length == 33) {
id = BitConverter.ToInt32(data, 0);
name = Encoding.Unicode.GetString(data, 4, 20).Replace("/0",""); // 去掉尾部的0字符
married = BitConverter.ToBoolean(data, 24);
salary = BitConverter.ToDouble(data, 25);
}
else {
id = 0;
name = String.Empty;
married = false;
salary = 0;
}
}
public override string ToString()
{
return String.Format("id: {0}, name: {1}, married: {2}, salary: {3}",
id, name, married, salary);
}
}
private static void Main(string[] args)
{
Console.WriteLine(Marshal.PtrToStringAuto(getResStr(0)));
byte[] data = new byte[33];
Marshal.Copy(getMydata(), data, 0, 33);
Mydata mydata = new Mydata(data);
Console.WriteLine(mydata);
}
}
新闻热点
疑难解答