Common datatypes

Top  Previous  Next

PInvoke > Common datatypes

 

The most simple case of calling Windows API functions from C# is, that all parameter and return types are isomorphic, i.e. they have a common representation in both managed and unmanaged memory. A simple example is the function GetCurrentThreadId. The Delphi code imports this funtion with the following lines of code:

 

 

function GetCurrentThreadId: DWORD; stdcall;

{$EXTERNALSYM GetCurrentThreadId}

 

 

implementation

 

function GetCurrentThreadId; external kernel32 name 'GetCurrentThreadId';

 

 

In C# this simply becomes to:

 

[DllImport(kernel32, SetLastError=true)]

public static extern uint /*stdcall*/ GetCurrentThread();

 

 

This function can be called in the code e.g. by:

 

uint CurThread = GetCurrentThreadId();

 

 

 

The conversion of the Delphi code also is straightforward in the following example of GetLocalTime, where a TSysteTime var parameter is passed.

 

 

  type

  _SYSTEMTIME = record

    wYear: Word;

    wMonth: Word;

    wDayOfWeek: Word;

    wDay: Word;

    wHour: Word;

    wMinute: Word;

    wSecond: Word;

    wMilliseconds: Word;

  end;

  {$EXTERNALSYM _SYSTEMTIME}

  TSystemTime = _SYSTEMTIME;

  SYSTEMTIME = _SYSTEMTIME;

  {$EXTERNALSYM SYSTEMTIME}

 

 

procedure GetLocalTime(var lpSystemTime: TSystemTime); stdcall;

{$EXTERNALSYM GetLocalTime}

 

implementation

 

procedure GetLocalTime; external kernel32 name 'GetLocalTime';

 

 

The _SYSTEMTIME structure, that Delphi2C# generates for C# only consists in fields with data types, which need no special marshalling.

 

public struct _SYSTEMTIME

{

  public ushort wYear;

  public ushort wMonth;

  public ushort wDayOfWeek;

  public ushort wDay;

  public ushort wHour;

  public ushort wMinute;

  public ushort wSecond;

  public ushort wMilliseconds;

  public static _SYSTEMTIME CreateRecord(){return new _SYSTEMTIME();}

};

 

Therefore the GetLocalTime function also is converted quite easily:

 

[DllImport(kernel32, SetLastError=true)]

public static extern void /*stdcall*/ GetLocalTime(

                          ref _SYSTEMTIME lpSystemTime);

 

 

GetLocalTime is called inside of the SysUtils.Date-function:

 

var

  SystemTime: TSystemTime;

begin

  GetLocalTime(SystemTime);

 

 

Delphi2C# automatically generates the following call:

 

 

_SYSTEMTIME SYSTEMTIME = _SYSTEMTIME.CreateRecord();

GetLocalTime(ref SYSTEMTIME);

 

 

 

 

 

 



This page belongs to the Delphi2C# Documentation

Delphi2C# home  Content