使用PInvoke.NET插件为托管代码添加Win32 API签名

简介:
 P/Invoke(Platform invoke)即在.NET Framework中调用Win32 API的过程。其中一个困难的地方就是确定要调用方法的签名(尤其是缺乏Win32编程经历的情况下),这经常会是一个反复尝试/出错的过程。向非托管Win32 API传递不正确的数据类型或值通常会导致内存泄漏或其它不希望的结果。

    PInvoke.NET是一个wiki,用于建立正确的P/Invoke签名。wiki是一种任何人都可进行编辑的协作式网站,因此可以在那里找到数以千计的与使用P/Invoke相关的签名、示例和笔记。既然wiki可被任何人编辑,你也可以在使用这些信息的同时分享自己的经验。

    显然这个wiki及其包含的信息很有价值,而PInvoke.NET Visual Studio插件则使其更具价值。在下载、安装PInvoke.NET插件后,你就可以在Visual Studio内搜索需要的签名或向其添加新的内容。在VS内的代码文件内点击右键,会看到有两个新的菜单项:Insert PInvoke Signatures和Contribute PInvoke Signatures and Types。

    选择Insert PInvoke Signatures来插入一个新的PInvoke签名,这时会看到:
    

    使用这个简单的对话框,你可以搜索需要调用的函数。还有一个可选项,你可以包含该函数所在的模块。现在,应用程序的一个基本的能力是让计算机发出蜂鸣声。那么需要搜索一下Beep函数,看看它会出现什么。如果如下:
    
    
    在结果中会显示该函数用法的信息(Beep函数的信息是"Generates simple tones on the speaker")。你可以看到供C#和VB.NET使用的签名。注意下面的文字Alternative Managed API,它给出了一个建议,告诉你.NET Framework 2.0中的System.Console.Beep方法具有相同功能(最好还是使用托管代码)。

    对话框的底部还有一个链接,它会把你带向wiki中Beep方法的相应页面,这个页面包含了该方法的各个参数的相关文档以及一些代码示例。

    在选择了要插入的签名后,点击Insert按钮,该签名就被添加到代码中了。在Beep的示例中是这样的:

    [DllImport( " kernel32.dll " , SetLastError  =   true )]
    [
return : MarshalAs(UnmanagedType.Bool)]
    
static   extern   bool  Beep( uint  dwFreq,  uint  dwDuration);

 

    大功告成!现在就可以在代码中调用该方法了:
    Beep( 1223 1000 );

    PInvoke.NET wiki和Visual Studio插件为开发人员减少了很多痛苦,也节省了大量时间。wiki可以通过 www.pinvoke.net 访问,在该页面的左下角的Helpful Tools链接中可以找到该插件的下载。 

    PS:据说Beep函数还具有驱蚊之功效,不过需要知道相应的频率来设置第一个参数:)

                                                                                               By Anders


本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2007/01/13/pinvokeaddin.html,如需转载请自行联系原作者。

目录
相关文章
|
1月前
|
程序员 API C语言
Win32 API介绍​(COORD、GetStdHandle、GetConsoleCursorInfo 、SetConsoleCursorInfo)、<locale.h>本地化、类项
Win32 API介绍​(COORD、GetStdHandle、GetConsoleCursorInfo 、SetConsoleCursorInfo)、<locale.h>本地化、类项
|
4月前
|
监控 编译器 API
常用Win32 API的简单介绍
常用Win32 API的简单介绍
|
4月前
|
前端开发 API 数据安全/隐私保护
API接口签名验证
过去对于接口的验证我一般都是直接在登录时为用户发放token,用户在随后的操作中携带了token则允许请求。 但是这样的验证方式存在有一定的问题,如果token被泄露被他人获取,那么就会有非法请求的风险。其他人可以使用这个token自行调用接口进行请求,传入非法参数甚至进行注入攻击等,可能会造成严重的问题。
|
4月前
|
缓存 安全 NoSQL
App开放接口api安全:Token签名sign的设计与实现
在app开放接口api的设计中,避免不了的就是安全性问题,因为大多数接口涉及到用户的个人信息以及一些敏感的数据,所以对这些 接口需要进行身份的认证,那么这就需要用户提供一些信息,比如用户名密码等,但是为了安全起见让用户暴露的明文密码次数越少越好,我们一般在web项目 中,大多数采用保存的session中,然后在存一份到cookie中,来保持用户的回话有效性。
|
7月前
|
存储 算法 JavaScript
微信支付-Native下单API支付封装+签名流程解读
微信支付-Native下单API支付封装+签名流程解读
82 0
|
9月前
|
数据可视化 API
数据可视化大屏辅助插件API(2):天气接口
数据可视化大屏辅助插件API(2):天气接口
239 0
|
9月前
|
数据可视化 JavaScript 前端开发
数据可视化大屏辅助插件API(1):javascript封装时间函数
数据可视化大屏辅助插件API(1):javascript封装时间函数
61 0
|
10月前
|
Web App开发 测试技术 API
chrome插件-开发简陋的在线api测试工具
chrome插件-开发简陋的在线api测试工具
96 0
|
10月前
|
存储 编译器 API
【Win32准备】API,Win32入口程序,宽字符(下)
【Win32准备】API,Win32入口程序,宽字符
|
10月前
|
存储 编译器 API
【Win32准备】API,Win32入口程序,宽字符(上)
【Win32准备】API,Win32入口程序,宽字符

热门文章

最新文章