1. You don't know the type LPVOID points to, so we can use IntPtr or byte[] for general purpose.2. C# doesn't support optional parameters, so we need to put nulls. [DllImport("yourdll.dll")] extern static bool YL_DeviceIoControl( int dwIoControlCode, byte[] lParam1, byte[] lParam2, byte[] lParam3, byte[] lParam4, ref int lpBytesReturned);public void Test() { //const int YL_IOCTL_GEN_GETRINGNO = 0; byte[] bs = new byte[]{0}; int byteReturned = 0; YL_DeviceIoControl(YL_IOCTL_GEN_GETRINGNO, bs, null, null, null, ref byteReturned); byte b = bs[0]; //<---- }
HANDLE
void*
System.IntPtr
在 32 位 Windows 操作系统上为 32 位,在 64 位 Windows 操作系统上为 64 位。
BYTE
unsigned char
System.Byte
8 位
SHORT
short
System.Int16
16 位
WORD
unsigned short
System.UInt16
16 位
INT
int
System.Int32
32 位
UINT
unsigned int
System.UInt32
32 位
LONG
long
System.Int32
32 位
BOOL
long
System.Int32
32 位
DWORD
unsigned long
System.UInt32
32 位
ULONG
unsigned long
System.UInt32
32 位
CHAR
char
System.Char
用 ANSI 修饰。
LPSTR
char*
System.String 或 System.Text.StringBuilder
用 ANSI 修饰。
LPCSTR
Const char*
System.String 或 System.Text.StringBuilder
用 ANSI 修饰。
LPWSTR
wchar_t*
System.String 或 System.Text.StringBuilder
用 Unicode 修饰。
LPCWSTR
Const wchar_t*
System.String 或 System.Text.StringBuilder
用 Unicode 修饰。
FLOAT
Float
System.Single
32 位
DOUBLE
Double
System.Double
64 位
见它们的对应关系。
[DllImport("yourdll.dll")]
extern static bool YL_DeviceIoControl(
int dwIoControlCode,
byte[] lParam1, byte[] lParam2, byte[] lParam3, byte[] lParam4,
ref int lpBytesReturned);public void Test()
{
//const int YL_IOCTL_GEN_GETRINGNO = 0; byte[] bs = new byte[]{0};
int byteReturned = 0;
YL_DeviceIoControl(YL_IOCTL_GEN_GETRINGNO, bs, null, null, null, ref byteReturned); byte b = bs[0]; //<----
}
http://www.pinvoke.net/