VisualC#中调用WindowsAPI的要点

VisualC#中调用WindowsAPI的要点,第1张

VisualC#中调用WindowsAPI的要点,第2张

在。net框架SDK文档,关于调用Windows API的说明比较零散,稍微全面一点的是关于Visual Basic的。net本文中C#调用API的要点总结如下,希望能给没用过c# API的朋友一些帮助。另外,如果Visual Studio。net安装后,在C:\ Program Files \ Microsoft Visual Studio目录下调用API的例子很多。NET \ FrameworkSDK \ Samples \ Technologies \ Interop \ Platform Invoke \ WinAPIs \ CS。

一、通话格式

使用系统。Runtime . InteropServices//引用这个名字空,简化下面的代码
...
//使用DllImportAttribute属性引入api函数。注意声明的空方法,也就是方法体是空。
[DllImport(" user 32 . dll ")]
public static extern ReturnType function name(type arg 1,type arg2,...);
//调用和调用其他方法没有区别。

您可以使用字段进一步描述功能,用逗号分隔,例如:

[ DllImport( "kernel32 ",EntryPoint="GetVersionEx" )]

DllImportAttribute属性的公共字段如下:

1.CallingConvention指示将方法参数传递给非托管实现时使用的CallingConvention的值。

召开会议。调用方清理堆栈。它使您能够使用变参数调用函数。
calling conventi on . stdcall:被调用方清理堆栈。这是从托管代码调用非托管函数的默认约定。

2.CharSet控制调用函数的名称版本,并指示如何将字符串参数封送到方法。

该字段被设置为一个字符集值。如果CharSet字段设置为Unicode,则所有字符串参数在传递给非托管实现之前都会转换为Unicode字符。这也导致字母“W”被附加到DLL入口点的名称上。如果此字段设置为ANSI,则字符串将被转换为Ansi字符串,并且字母“A”将被追加到DLL入口点的名称中。大多数Win32 API都使用这种附加“w”或“a”的约定。如果CharSet设置为Auto,则转换依赖于平台(在Windows NT上为Unicode,在Windows 98上为Ansi)。字符集的默认值是Ansi。CharSet字段还用于确定将从指定的DLL导入哪个版本的函数。字符集的名称匹配规则。Ansi和CharSet。Unicode有很大不同。对于Ansi,如果EntryPoint设置为“MyMethod”并且存在,则返回“MyMethod”。如果DLL中没有“MyMethod”,但存在“mymethod”,则返回“mymethod”。Unicode的情况正好相反。如果EntryPoint设置为“MyMethod”并且存在,则返回“MyMethodW”。如果“MyMethodW”在DLL中不存在,但“MyMethod”存在,则返回“MyMethod”。如果使用Auto,则匹配规则取决于平台(在Windows NT上为Unicode,在Windows 98上为Ansi)。如果ExactSpelling设置为true,则仅当DLL中存在“MyMethod”时,才会返回“MyMethod”。

3.EntryPoint指示要调用的DLL入口点的名称或序列号。

如果您的方法名称不想与api函数同名,请务必指定此参数,例如:

[DllImport("user32.dll ",CharSet="CharSet。Auto ",entry point = " MessageBox ")]
public static extern int MsgBox(int ptr hWnd,string txt,string caption,int type);

4.ExactSpelling指示是否应修改非托管DLL中入口点的名称,以与CharSet字段中指定的CharSet值相对应。如果为true,则当DllImportAttribute。CharSet字段设置为CharSet的Ansi值,并且当DllImportAttribute。CharSet字段设置为CharSet的Unicode值。该字段的默认值为false。

5.PreserveSig指示托管方法签名不应转换为返回HRESULT的非托管签名,并且可能有一个额外的[out,retval]参数对应于返回值。

6.SetLastError指示被调用方将在从属性化方法返回之前调用Win32 API SetLastError。True表示调用方将调用SetLastError,默认情况下为false。运行时封送拆收器将调用GetLastError并缓存返回值,以防止它被其他API调用覆盖。用户可以通过调用GetLastWin32Error来检索错误代码。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VisualC#中调用WindowsAPI的要点

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情