在VS.Net 平台下调用Win API 函数或Win32 DLL


在VS.Net 平台下调用Win API 函数或Win32 DLL 我们在做项目时,常常要用到别的公司开发的硬件产品,  而有关对硬件产品的控制的
在VS.Net 平台下调用Win API 函数或Win32 DLLDEMO 又常常是用VC6.0编写的,我们如何将他们编写的DLL应用到我们现在的.net环境中些,
在VS.Net 平台下调用Win API 函数或Win32 DLL微软为我们提供了”平台调用服务 (P
/Invoke)”来方便的使用它们.
在VS.Net 平台下调用Win API 函数或Win32 DLL
在VS.Net 平台下调用Win API 函数或Win32 DLL    通过平台调用服务,托管代码可以调用本机(非 ActiveX) DLL 中实现的非托管函数。
在VS.Net 平台下调用Win API 函数或Win32 DLLP
/Invoke 语义方面的用法与在 .NET Framework 完整版中相同, 但 .NET Framework 精简
在VS.Net 平台下调用Win API 函数或Win32 DLL版对于非托管和托管代码之间封送的对象和类型只提供有限的支持。 
在VS.Net 平台下调用Win API 函数或Win32 DLL    P
/Invoke 位于 System.Runtime.InteropService 命名空间中。在应用程序代码中,应
在VS.Net 平台下调用Win API 函数或Win32 DLL该声明要调用的非托管函数。此操作可以通过 DllImport 属性执行。说明包括模块名称(
在VS.Net 平台下调用Win API 函数或Win32 DLL特定的 DLL 文件名)、入口点名称(要调用的非托管函数的名称)、调用约定和 
在VS.Net 平台下调用Win API 函数或Win32 DLLSetLastError 标志。调用约定描述了将参数传递给非托管方法的方式。在 .NET Framework
在VS.Net 平台下调用Win API 函数或Win32 DLL精简版中,所支持的唯一调用约定是 WinAPI 约定,此约定与 C
++ 中的 __cdecl 约定对应。
在VS.Net 平台下调用Win API 函数或Win32 DLL默认情况下,C# 将 SetLastError 标志设置为 
false。     将其设置为 true 允许您调用 
在VS.Net 平台下调用Win API 函数或Win32 DLLMarshal.GetLastWin32Error,以检索引发的上一个非托管错误。
在VS.Net 平台下调用Win API 函数或Win32 DLL
在VS.Net 平台下调用Win API 函数或Win32 DLL
在VS.Net 平台下调用Win API 函数或Win32 DLL    例如,要调用非托管 DLL(即 coredll.dll)中的 FindWindow 函数,应在项目中
在VS.Net 平台下调用Win API 函数或Win32 DLL包含以下代码:
在VS.Net 平台下调用Win API 函数或Win32 DLL[DllImport(
"coredll.dll","FindWindow",SetLastError=true)]
在VS.Net 平台下调用Win API 函数或Win32 DLL
public extern IntPtr FindWindow(string ClassName, string WindowName);
在VS.Net 平台下调用Win API 函数或Win32 DLL    我们在调用它们时更多是要注意非托管数据类型与托管数据类型之间的对应关系,是传
在VS.Net 平台下调用Win API 函数或Win32 DLL值还是传地址。 如果处理不好 , 即便只有一个错误,你的程序就有可能无法运行。 好在
在VS.Net 平台下调用Win API 函数或Win32 DLLvs.net2005对你转换的错误会有一些提示,不过你还是要小心为好。
在VS.Net 平台下调用Win API 函数或Win32 DLL如unsigned 
int BaseAddr  对应转换成 
在VS.Net 平台下调用Win API 函数或Win32 DLL    [MarshalAs(UnmanagedType.U4)] Uint32  BaseAddr;
在VS.Net 平台下调用Win API 函数或Win32 DLL    你不可将其转换成:
在VS.Net 平台下调用Win API 函数或Win32 DLL    [MarshalAs(UnmanagedType.U1)] 
byte  cx;
在VS.Net 平台下调用Win API 函数或Win32 DLL    虽然 Byte 为 8位无符号整数.
在VS.Net 平台下调用Win API 函数或Win32 DLL    详细的说明请参看MSDN。本文只是学习笔记,仅供参考。希望也能给大家带来方
在VS.Net 平台下调用Win API 函数或Win32 DLL便。

在VS.Net 平台下调用Win API 函数或Win32 DLL//================================================
在VS.Net 平台下调用Win API 函数或Win32 DLL
//1在VS.Net 平台下调用Win API 函数或Win32 DLL..Pinvoke:从托管代码中调用非托管函数
在VS.Net 平台下调用Win API 函数或Win32 DLL
//=================================================
在VS.Net 平台下调用Win API 函数或Win32 DLL
[DllImport(S"winmm.dll",CharSet=CharSet::Auto )]     //按原名称进行引用
在VS.Net 平台下调用Win API 函数或Win32 DLL
static bool sndPlaySound(String * pstrWaveFile,int nSoundFlag);
在VS.Net 平台下调用Win API 函数或Win32 DLL
//在托管定义中为非托管函数指定一个别名。DllImport属性指定参数EntryPoint可以
在VS.Net 平台下调用Win API 函数或Win32 DLL
用来指定非托管函数
在VS.Net 平台下调用Win API 函数或Win32 DLL
//的真实名称
在VS.Net 平台下调用Win API 函数或Win32 DLL
[DllImport(S"winmm.dll",CharSet=CharSet::Auto ,EntryPoint=S"sndPlaySound")]
在VS.Net 平台下调用Win API 函数或Win32 DLL
//按原名称进行引用
在VS.Net 平台下调用Win API 函数或Win32 DLL
static bool myPlayer(String * pstrWaveFile,int nSoundFlag);
在VS.Net 平台下调用Win API 函数或Win32 DLL
//====按原函数名称进行调用======
在VS.Net 平台下调用Win API 函数或Win32 DLL
 sndPlaySound(S"c:\\WavFiles\\Windows XP 注销音.wav",0);
在VS.Net 平台下调用Win API 函数或Win32 DLL
//====按自定义名称进行调用======
在VS.Net 平台下调用Win API 函数或Win32 DLL
 myPlayer (S"c:\\WavFiles\\Windows XP 注销音.wav",0);
在VS.Net 平台下调用Win API 函数或Win32 DLL
在VS.Net 平台下调用Win API 函数或Win32 DLL字符串封送处理和名称匹配
在VS.Net 平台下调用Win API 函数或Win32 DLL    CharSet 字段接受以下值:
在VS.Net 平台下调用Win API 函数或Win32 DLL    CharSet.Ansi(默认值) 
在VS.Net 平台下调用Win API 函数或Win32 DLL    •    字符串封送处理 
在VS.Net 平台下调用Win API 函数或Win32 DLL    平台调用将字符串从托管格式 (Unicode) 封送为 ANSI 格式。 
在VS.Net 平台下调用Win API 函数或Win32 DLL    •    名称匹配 
在VS.Net 平台下调用Win API 函数或Win32 DLL    在 DllImportAttribute.ExactSpelling 字段为 
true(它是 Visual Basic 2005 中的
在VS.Net 平台下调用Win API 函数或Win32 DLL默认值)时, 平台调用将只搜索您指定的名称。例如,如果指定 MessageBox,则平台调用
在VS.Net 平台下调用Win API 函数或Win32 DLL将搜索 MessageBox,如果它找不到完全相同的拼写则失败。 
在VS.Net 平台下调用Win API 函数或Win32 DLL   当 ExactSpelling 字段为 
false(它是 C++ 和 C# 中的默认值)时,平台调用将首先
在VS.Net 平台下调用Win API 函数或Win32 DLL搜索未处理的别名 (MessageBox), 如果找不到未处理的别名,   则将搜索已处理的名称 
在VS.Net 平台下调用Win API 函数或Win32 DLL(MessageBoxA)。请注意,ANSI 名称匹配行为与 Unicode 名称匹配行为不同。 
在VS.Net 平台下调用Win API 函数或Win32 DLL    CharSet.Unicode 
在VS.Net 平台下调用Win API 函数或Win32 DLL    •    字符串封送处理 
在VS.Net 平台下调用Win API 函数或Win32 DLL    平台调用会将字符串从托管格式 (Unicode) 复制为 Unicode 格式。 
在VS.Net 平台下调用Win API 函数或Win32 DLL    •    名称匹配 
在VS.Net 平台下调用Win API 函数或Win32 DLL    当 ExactSpelling 字段为 
true(它是 Visual Basic 2005 中的默认值)时,平台调
在VS.Net 平台下调用Win API 函数或Win32 DLL用将只搜索您指定的名称。例如,如果指定 MessageBox,则平台调用将搜索 MessageBox,
在VS.Net 平台下调用Win API 函数或Win32 DLL如果它找不到完全相同的拼写则失败。 
在VS.Net 平台下调用Win API 函数或Win32 DLL    当 ExactSpelling 字段为 
false(它是 C++ 和 C# 中的默认值)时,平台调用将首先
在VS.Net 平台下调用Win API 函数或Win32 DLL搜索已处理的名称 (MessageBoxW), 如果找不到已处理的名称,   则将搜索未处理的别名 
在VS.Net 平台下调用Win API 函数或Win32 DLL(MessageBox)。请注意,Unicode 名称匹配行为与 ANSI 名称匹配行为不同。 
在VS.Net 平台下调用Win API 函数或Win32 DLL    CharSet.Auto 
在VS.Net 平台下调用Win API 函数或Win32 DLL    •    平台调用在运行时根据目标平台在 ANSI 和 Unicode 格式之间进行选择。

 

在VS.Net 平台下调用Win API 函数或Win32 DLL//================================================
在VS.Net 平台下调用Win API 函数或Win32 DLL
//2在VS.Net 平台下调用Win API 函数或Win32 DLL..在托管C++应用程序中利用Pinvoke接收回调通知.
在VS.Net 平台下调用Win API 函数或Win32 DLL
//=================================================
在VS.Net 平台下调用Win API 函数或Win32 DLL
//利用Pinvoke您可以注册托管的回调处理程序函数,并把它传递给支持回调的非托管函数.
在VS.Net 平台下调用Win API 函数或Win32 DLL
//EnumWindows API 函数的原型
在VS.Net 平台下调用Win API 函数或Win32 DLL
//BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);
在VS.Net 平台下调用Win API 函数或Win32 DLL
//为EnumWindows API 函数的第一个参数“WNDENUMPROC”(一个回调函数的指针)声明一
在VS.Net 平台下调用Win API 函数或Win32 DLL
//个委托。
在VS.Net 平台下调用Win API 函数或Win32 DLL
    __delegate bool EnumWindowsProcCallBack(long hWnd,long lParam);
在VS.Net 平台下调用Win API 函数或Win32 DLL    
//定义一个常量,用于定义Windows标题的最大长度.
在VS.Net 平台下调用Win API 函数或Win32 DLL
    #define Max_Title_Chars 512
在VS.Net 平台下调用Win API 函数或Win32 DLL    
//为Windows API函数EnumWindows (USER32.DLL)    提供一个托管函数定义, 并利用
在VS.Net 平台下调用Win API 函数或Win32 DLL    
//DllImport属性指定导出
在VS.Net 平台下调用Win API 函数或Win32 DLL    
//EnumWindows()的DLL;
在VS.Net 平台下调用Win API 函数或Win32 DLL
[DllImport(S"user32.dll")]
在VS.Net 平台下调用Win API 函数或Win32 DLL
static bool EnumWindows(EnumWindowsProcCallBack *pfnCallBack,long lParam);
在VS.Net 平台下调用Win API 函数或Win32 DLL
//为Windows API函数GetWindowText (USER32.DLL)提供一个托管函数定义.
在VS.Net 平台下调用Win API 函数或Win32 DLL
[DllImport(S"user32.dll")]
在VS.Net 平台下调用Win API 函数或Win32 DLL
static int GetWindowText(long hWnd,StringBuilder *lpstrTitle,int nMaxCount);
在VS.Net 平台下调用Win API 函数或Win32 DLL
//定义一个代表回调处理程序的托管函数,EnumWindowsProcCallBack委托将指向这个托函
在VS.Net 平台下调用Win API 函数或Win32 DLL
//数的定义, 所以还要有相同的签名。我们利用此回调处理程序来显示窗口的标题,这个
在VS.Net 平台下调用Win API 函数或Win32 DLL
//标题可以从EnumWindows()所传递的窗口句柄获得.
在VS.Net 平台下调用Win API 函数或Win32 DLL
static bool DisplayWindowTitle(long hWnd,long lParam)
);    

在VS.Net 平台下调用Win API 函数或Win32 DLL//============================================================
在VS.Net 平台下调用Win API 函数或Win32 DLL
//3在VS.Net 平台下调用Win API 函数或Win32 DLL利用Pinvoke为非托管DLL中的函数传递结构.
在VS.Net 平台下调用Win API 函数或Win32 DLL
//在托管代码调用一个非托管代码时,时常需要传递一个非托管结构或者一个用户定义的数
在VS.Net 平台下调用Win API 函数或Win32 DLL
//据类型作为参数。在这种情况下,您就需要建立一个托管类或者结构,这个类或者结构要
在VS.Net 平台下调用Win API 函数或Win32 DLL
//与非托管结构的物理布局和字节顺序保持一致,这样的话你建立的这个类或结构就可以代
在VS.Net 平台下调用Win API 函数或Win32 DLL
//替非托管结构传递结非托管函数。您还可以通过利用StructLayout属性对一个托管类或者
在VS.Net 平台下调用Win API 函数或Win32 DLL
//结构进行物理布局,从而进行另外的控制.

LayoutKind 枚举: 控制当导出到非托管代码时对象的布局。

成员:

 

成员名称

说明

Auto

运行库自动为非托管内存中的对象的成员选择适当的布局。使用此枚举成员定义的对象不能在托管代码的外部公开。尝试这样做将引发异常。 

Explicit

对象的各个成员在非托管内存中的精确位置被显式控制。每个成员必须使用 FieldOffsetAttribute 指示该字段在类型中的位置。 

Sequential

对象的成员按照它们在被导出到非托管内存时出现的顺序依次布局。这些成员根据在 StructLayoutAttribute.Pack 中指定的封装进行布局,并且可以是不连续的。


备注

此枚举与 StructLayoutAttribute 一起使用。默认情况下,公共语言运行库将使用 Auto 布局值。为减少与 Auto 值关联的布局相关问题,C#Visual Basic C++ 编译器为值类型指定了 Sequential 布局。

 

示例:参数中有回调函数的WINAPI 函数在托管环境中的调用

(其中createThread (…) 函数中第三个参数就需要调用自定义的WINAPI 函数)
//非托管函数的托管调用声明

[StructLayout(LayoutKind.Sequential)]  //在本例中没有用到它.

public struct SECURITY_ATTRIBUTES

{

uint nLength;

 IntPtr lpSecurityDescriptor;

 UInt32 bInheritHandle;

 } ;

[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]

public static extern IntPtr CreateEvent(IntPtr lpEventAttributes, Boolean bManualReset, Boolean bInitialState, [MarshalAs(UnmanagedType.LPStr)]  String lpName);

 

[DllImport("kernel32")]

public static extern IntPtr CreateThread(

IntPtr lpThreadAttributes,

uint dwStackSize,

ThreadProc lpStartAddress, // ThreadProc as friendly delegate

IntPtr lpParameter,

uint dwCreationFlags,

out uint dwThreadId);

//函数原型可参看msdn

定义:自定义WINAPI函数在托管环境下的声明

//stdcall   //c++中的 自定义的WINAPI 函数:   DWORD WINAPI Fun1Proc(LPVOID lpParameter)

static int  Fun1Proc(IntPtr  lpParameter)

{

MessageBox.Show ("thread is running");

       return 0;

}

// Thread proc, to be used with Create*Thread

public delegate int ThreadProc(IntPtr param);

//使用:

using DWORD =System.Int32 ;

 using WORD =System.Int16 ;

 using HANDLE = System.IntPtr;

 using HWND = System.IntPtr;

 using HDC = System.IntPtr;

 using PVOID = System.IntPtr;

using LPVOID = System.IntPtr;

HANDLE hThread=IntPtr.Zero;

  uint x = 0;

  ThreadProc proc = new ThreadProc(Fun1Proc);

hThread = CreateThread(

  IntPtr.Zero,

  0,

  proc, hEvent,

  0, // flags

  out x);

 WaitForSingleObject (hThread,unchecked((uint)-1));

 CloseHandle (hThread);

 MessageBox.Show ( "main thread is running" );

 

//CreateEvent 函数原型
//CreateEvent, Win API, as implemented in kernel32.dll:

HANDLE CreateEvent(

  LPSECURITY_ATTRIBUTES lpEventAttributes,

  BOOL bManualReset,

  BOOL bInitialState,

  LPCTSTR lpName

);


//WINAPI 函数在托管环境下的声明示例
 
[DllImport("kernel32.dll, SetLastError=true ")]

static extern IntPtr CreateEvent(IntPtr lpEventAttributes,

       bool bManualReset, bool bInitialState,

       [MarshalAs(UnmanagedType.LPStr) string lpName);

 

VB.NET

Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA"(_

           ByVal dwFlags As Integer, ByRef lpSource As Object, _

           ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, _

           ByVal lpBuffer As String, ByVal nSize As Integer, _

           ByRef Arguments As Integer) As Integer

C# definition

[DllImport("kernel32.dll", SetLastError=true)]

   static extern int FormatMessageA ( int dwFlags, ref object lpSource,

   int dwMessageId, int dwLanguageId, string lpBuffer,

   int nSize, ref int Arguments)

Managed C++. NET

[DllImport("KERNEL32.DLL",EntryPoint="MoveFileW",

   SetLastError=true,CharSet=CharSet::Unicode,ExactSpelling=true,

   CallingConvention=CallingConvention::StdCall)]

   static bool MoveFile( String^ src, String^ dst );

 

更为详细的介绍请看:

WIN  API查看器

http://www.codeproject.com/csharp/APIBrowser.asp

 

<<A Closer Look at Platform Invoke>>

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconacloserlookatplatforminvoke.asp

 

<<Marshaling Data with Platform Invoke>>

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconmarshalingdatawithplatforminvoke.asp

 

http://www.pinvoke.net/

 

http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=75122f62-5459-4364-b9ba-7b5e6a4754fe

 

 

附录1Windows Data Type .NET Data Type 的对应关系

Windows Data Type

.NET Data Type

BOOL, BOOLEAN

Boolean or Int32

BSTR

String

BYTE

Byte

CHAR

Char

DOUBLE

Double

DWORD

Int32 or UInt32

FLOAT

Single

HANDLE (and all other handle types, such as HFONT and HMENU)

IntPtr, UintPtr or HandleRef

HRESULT

Int32 or UInt32

INT

Int32

LANGID

Int16 or UInt16

LCID

Int32 or UInt32

LONG

Int32

LPARAM

IntPtr, UintPtr or Object

LPCSTR

String

LPCTSTR

String

LPCWSTR

String

LPSTR

String or StringBuilder*

LPTSTR

String or StringBuilder

LPWSTR

String or StringBuilder

LPVOID

IntPtr, UintPtr or Object

LRESULT

IntPtr

SAFEARRAY

.NET array type

SHORT

Int16

TCHAR

Char

UCHAR

SByte

UINT

Int32 or UInt32

ULONG

Int32 or UInt32

VARIANT

Object

VARIANT_BOOL

Boolean

WCHAR

Char

WORD

Int16 or UInt16

WPARAM

IntPtr, UintPtr or Object

 

附录2: 托管数据类型与非托管数据类型对比表

Unmanaged type in Wtypes.h

Unmanaged C language type

Managed class name

Description

HANDLE

void*

System.IntPtr

32 bits

BYTE

unsigned char

System.Byte

8 bits

SHORT

short

System.Int16

16 bits

WORD

unsigned short

System.UInt16

16 bits

INT

int

System.Int32

32 bits

UINT

unsigned int

System.UInt32

32 bits

LONG

long

System.Int32

32 bits

BOOL

long

System.Int32

32 bits

DWORD

unsigned long

System.UInt32

32 bits

ULONG

unsigned long

System.UInt32

32 bits

CHAR

char

System.Char

Decorate with ANSI.

LPSTR

char*

System.String or System.StringBuilder

Decorate with ANSI.

LPCSTR

Const char*

System.String or System.StringBuilder

Decorate with ANSI.

LPWSTR

wchar_t*

System.String or System.StringBuilder

Decorate with Unicode.

LPCWSTR

Const wchar_t*

System.String or System.StringBuilder

Decorate with Unicode.

FLOAT

Float

System.Single

32 bits

DOUBLE

Double

System.Double

64 bits

 

 

附录3: C/C++C#的数据类型对应关系

C/C++

C#

HANDLE, LPDWORD, LPVOID, void*

IntPtr

LPCTSTR, LPCTSTR, LPSTR, char*, const char*, Wchar_t*, LPWSTR

String [in], StringBuilder [in, out]

DWORD, unsigned long, Ulong

UInt32, [MarshalAs(UnmanagedType.U4)]

bool

bool

LP<struct>

[In] ref <struct>

SIZE_T

uint

LPDWORD

out uint

LPTSTR

[Out] StringBuilder

PULARGE_INTEGER

out ulong

WORD

uInt16

Byte, unsigned char

byte

Short

Int16

Long, int

Int32

float

single

double

double

NULL pointer

IntPtr.Zero

Uint

Uint32

 

 

当结构体中是一个数据类型指针时,采用.net对应的数据类型替换.

当结构体中的变量是另一个结构体的指针时,采用IntPtr类型来操作.

 

应用示例:
FlashWindow

 

附录4:  VB6.0中的数据类型

 

数据类型

存储空间大小

范围

Byte

1 个字节

0 255

Boolean

2 个字节

True False

Integer

2 个字节

-32,768 32,767

Long
(长整型)

4 个字节

-2,147,483,648 2,147,483,647

Single
(
单精度浮点型)

4 个字节

负数时从 -3.402823E38 -1.401298E-45;正数时从 1.401298E-45 3.402823E38

Double
(
双精度浮点型)

8 个字节

负数时从 -1.79769313486232E308
-4.94065645841247E-324
;正数时从4.94065645841247E-324 1.79769313486232E308

Currency
(
变比整型)

8 个字节

-922,337,203,685,477.5808 922,337,203,685,477.5807

Decimal

14 个字节

没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001

Date

8 个字节

100 1 1 日 到 9999 12 31

Object

4 个字节

任何 Object 引用

String
(
变长)

10 字节加字符串长度

0 到大约 20 亿

String
(
定长)

字符串长度

1 到大约 65,400

Variant
(
数字)

16 个字节

任何数字值,最大可达 Double 的范围

Variant
(
字符)

22 个字节加字符串长度

与变长 String 有相同的范围

用户自定义
(利用 Type

所有元素所需数目

每个元素的范围与它本身的数据类型的范围相同。

 

附录5:  VB.NET中的数据类型

Visual Basic 类型

公共语言运行库类型结构

名义存储分配

取值范围

Boolean

System.Boolean

2 个字节

True False

Byte

System.Byte

1 个字节

0 255(无符号)。

Char

System.Char

2 个字节

0 65535(无符号)。

Date

System.DateTime

8 个字节

0001 1 1 日凌晨 0:00:00 9999 12 31 日晚上 11:59:59

Decimal

System.Decimal

16 个字节

0 +/-79,228,162,514,264,337,593,543,950,335 之间不带小数点的数;
0
+/-7.9228162514264337593543950335 之间带 28 位小数的数;最小非零数为
+/-0.0000000000000000000000000001 (+/-1E-28)

Double
(双精度浮点型)

System.Double

8 个字节

负值取值范围为 -1.79769313486231570E+308 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 1.79769313486231570E+308

Integer

System.Int32

4 个字节

-2,147,483,648 2,147,483,647

Long
(长整型)

System.Int64

8 个字节

-9,223,372,036,854,775,808 9,223,372,036,854,775,807

Short

System.Int16

2 个字节

-32,768 32,767

Object

System.Object(类)

4 个字节

任何类型都可以存储在 Object 类型的变量中。

Single
(单精度浮点型)

System.Single

4 个字节

负值取值范围为 -3.4028235E+38 -1.401298E-45;正值取值范围为 1.401298E-45 3.4028235E+38

String
(变长)

System.String(类)

取决于实现平台

0 到大约 20 亿个 Unicode 字符。

用户定义的类型
(结构)

(从System.ValueType继承)

取决于实现平台

结构中的每个成员都有由自身数据类型决定的取值范围,并与其他成员的取值范围无关。

 

 附录:


在VS.Net 平台下调用Win API 函数或Win32 DLLVB常用函数的说明  
在VS.Net 平台下调用Win API 函数或Win32 DLL
======================================================================
在VS.Net 平台下调用Win API 函数或Win32 DLL
Abs 函数 返回数的绝对值。  
在VS.Net 平台下调用Win API 函数或Win32 DLL
And 运算符 执行两个表达式的逻辑连接。   
在VS.Net 平台下调用Win API 函数或Win32 DLLArray 函数 返回含一数组的 变体 。   
在VS.Net 平台下调用Win API 函数或Win32 DLL
Asc 函数 返回字符串首字母的 ANSI 字符代码。   
在VS.Net 平台下调用Win API 函数或Win32 DLL赋值运算符 (
=) 给变量或属性赋值。   
在VS.Net 平台下调用Win API 函数或Win32 DLL
Atn 函数 返回数的反正切值。   
  

相关文章:

  • 2021-06-25
  • 2021-10-28
  • 2021-11-28
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-10-30
  • 2022-01-09
  • 2021-07-02
  • 2021-08-20
相关资源
相似解决方案