.NET Compact Framework 下Win32 API P/Invoke 的使用

简介:

由于CF是一个精简(Compact)的.NET Framework,因此在开发CF应用时有一部分功能MS并没有在CF中实现,需要直接调用Win32的API来实现。由于Win32的API是面向native代码的,一般会提供一个DLL库以及相应header文件。使用C++是十分容易和简单调用这些API,但是使用C# .NET就没那么幸运了。C#调用Win32的API往往要借助于P/Invoke的帮助,下面讲述一下P/Invoke 的使用。

API的引入

调用Win32的API需要引入相应的DLL,Wince下大部分的API存在于coredll.dll里面,同时DllImport不仅仅支持Win32 API,他可以支持任何native 的DLL的引入。

 

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

 

错误情况处理

调用Win32的API一般通过返回值表示调用结果,推荐使用Exception代替返回值的方式表达错误和异常情况。

复制代码
int  lStatus  =  RasHangUp(rasSession);
if  (lStatus  !=   0 )
{
   throw   new  ApplicationException( " RasHangUp( "   +  rasSession  +   " ) failed with error code:  "   +  lStatus);
}
复制代码

 

参数的转换

调用Win32的API大部分工作就是在对调用参数进行类型转换,这些参数基于.NET的角度叫做unmanaged type(native type),对应于.NET built-in 的managed type.例如调用查询所有WiFi网卡信息的接口,入口参数为LPWSTR和PINTFS_KEY_TABLE,LPWSTR是字符串指针( Long Pointer to Wide String),而PINTFS_KEY_TABLE是一个结构体。

复制代码
DWORD WZCEnumInterfaces(
  LPWSTR pSrvAddr,
  PINTFS_KEY_TABLE pIntfs
);

typedef struct
{
DWORD dwNumIntfs;
PINTF_KEY_ENTRY pIntfs;
} INTFS_KEY_TABLE, *PINTFS_KEY_TABLE;

复制代码

在CF.NET中会转化成下面接口,其中INTFS_KEY_TABLE为一个自定义的结构体。

复制代码
[DllImport( " wzcsapi.dll " )]
public   static   extern   uint  WZCEnumInterfaces( string  pSrvAddr,  ref  INTFS_KEY_TABLE pIntfs);

        public struct INTFS_KEY_TABLE : IDisposable
        {
            private uint dwNumIntfs;
            public IntPtr pIntfs;
            public INTFS_KEY_TABLE(uint size)
            {
                this.dwNumIntfs = size;
                if (size != 0)
                {
                    this.pIntfs = Marshal.AllocHGlobal((int)(Marshal.SizeOf(typeof(IntPtr)) * size));
                }
                else
                {
                    this.pIntfs = IntPtr.Zero;
                }
            }

            public string this[uint i]
            {
                get
                {
                    return Marshal.PtrToStringUni((IntPtr)Marshal.ReadInt32(this.pIntfs, (int)(i * 4)));
                }
            }
            public uint Count
            {
                get
                {
                    return this.dwNumIntfs;
                }
            }
            public void Dispose()
            {
                if (this.pIntfs != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(this.pIntfs);
                }
            }
        }
复制代码

所有类型转换都是基于基本类型,所以要进行类型转换要从基本类型入手。

c++ int类型(int, short, long, uint)直接转

c++ float类型(double, float)直接转

byte转成uint

bool要转成int

enum转成uint

 

复制代码
public   enum  INTF_FLAGS :  uint
{
            INTF_ALL 
=   0xffffffff ,

            INTF_ALL_FLAGS 
=   0x0000ffff ,
            
///   <summary>
            
///  mask for the configuration mode (NDIS_802_11_NETWORK_INFRASTRUCTURE value)
            
///   </summary>
            INTF_CM_MASK  =   0x00000007 ,
}
复制代码

 

char不能转,因为c++里面的char是1byte,而.NET是2bytes

对于结构体的转换可以自定义一个结构,例如上列子的INTFS_KEY_TABLE。如果结构体里面还包含结构体可以使用byte[]或者IntPtr来表示,因为c++里面的struct就是内存加上offset。

这些我做P/Invoke找到的一些规律,但是发现不同API,转换还是有点不一样,上面只是列出一般情况,特殊情况还要根据列子进行调整。

参考文献

Marshalling: Using native DLLs in .NET

DllImportAttribute Class

 

.NET Compact Framework, WinCE, Windows Mobile开发系列 


    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/01/09/1371836.html,如需转载请自行联系原作者


相关文章
|
5月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
1263 2
|
8月前
|
C++ Windows
.NET Framework安装不成功,下载`NET Framework 3.5`文件,Microsoft Visual C++
.NET Framework常见问题及解决方案汇总,涵盖缺失组件、安装失败、错误代码等,提供多种修复方法,包括全能王DLL修复工具、微软官方运行库及命令行安装等,适用于Windows系统,解决应用程序无法运行问题。
1246 3
|
5月前
|
开发框架 安全 .NET
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
.NET Framework是Windows平台的开发框架,包含CLR和FCL,支持多种语言开发桌面、Web应用。常用版本有3.5、4.5.2、4.8.1,系统可同时安装多个版本,确保软件兼容运行。
1276 0
Microsoft .NET Framework 3.5、4.5.2、4.8.1,适用于 Windows 版本的 .NET,Microsoft C Runtime等下载
|
6月前
|
C++
提示缺少.NET Framework 3.5 安装错误:0x80070002、0x800F0950\0x80004002
.NET Framework常见问题及解决方法汇总,
810 0
|
8月前
|
C++ Windows
WindowsDLL修复专家,MSVCP**、DLL修复vcruntime**、DLL修复、`.Net Framework`缺失、DirectX类DLL修复、VC运行库修复
Windows DLL修复专家是一款专为解决因DLL文件缺失、版本错误导致的软件或游戏无法运行问题的系统工具。它支持一键扫描和修复各类DLL异常,涵盖MSVCP、vcruntime、.NET Framework、DirectX等多种常见问题。具备自动检测、备份还原功能,确保修复过程安全可靠。适用于软件报错、系统异常及新系统适配场景,降低用户手动修复门槛,提升系统稳定性与兼容性。
345 3
|
7月前
.NET Framework 3.5离线安装包合集下载
本文介绍了如何获取和安装.NET Framework运行库离线合集包。用户可通过提供的链接下载安装包,安装过程简单,按提示逐步操作即可完成。安装时可选择所需版本,工具会自动适配架构,无需手动判断,方便高效。
5876 0
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
567 5
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
613 0
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
331 7