kernel32里的CreateFileA怎么转换成C#啊。
2条回答 默认 最新
- VRJerry 2024-01-24 21:30关注
也可以用其他方法,不过你说的这个函数只是会返回一个句柄的指针,具体要如何操作还需要配合其他API函数进行处理了
如果只是针对这个函数,可以声明一个公开静态的工具类(例如我这个名叫DllImportHelper的),包括如下内容进行使用。主要包括:
1、定义好常量或者枚举,用于对各类需要输入的文件参量Flag进行处理;
2、使用DllImport导入相关的核心动态库,比如你这个在kernel32里面
3、对于正确的函数名,声明对应的变量类型,需要具体去阅读API的文档,比如DWORD就相当于32位无符号整数,C的指针就相当于IntPtr或者用整数也应该可以代替等,这个具体需要阅读windows的文档,如果要求完整使用这个函数的功能就更需要去看文档了,因为会关联很多关于权限的问题或结构体,都需要对应的去解决
4、进行进一步的封装或者处理,因为声明的类型等原因可能并不能明确知道使用什么样的值,需要对函数进行重载重新封装,来进一步在C#环境下使其可读性更好。如:重载的CreateFileA和重新封装的OpenFile方法。public static class DllImportHelper { [DllImport("kernel32.dll")] static extern IntPtr CreateFileA( string fileName, uint desiredAccess, uint shareMode, IntPtr lpSecurityAttributes, uint creationDisposition, uint FlagsAndAttributes, IntPtr hTemplateFile ); [DllImport("kernel32")] static extern bool CloseHandle( IntPtr hObject // handle to object ); [Flags] public enum Access_Mask : uint { DELETE=0x00010000, READ_CONTROL=0x00020000, WRITE_DAC=0x00040000, WRITE_OWNER=0x00080000, SYNCHRONIZE=0x00100000, STANDART_RIGHTS_REQUIRED=0x000F0000, STANDARD_RIGHTS_ALL = 0x001F0000, SPECIFIC_RIGHTS_ALL= 0x0000FFFF, GENERIC_ALL=0x10000000, GENERIC_EXECUTE=0x20000000, GENERIC_WRITE=0x40000000, GENERIC_READ=0x80000000 } [Flags] public enum ShareModeMask : uint { None=0x00000000, FILE_SHARE_DELETE=0x00000004, FILE_SHARE_READ=0x00000001, FILE_SHARE_WRITE=0x00000002 } public enum CreationDisposition : uint { CREATE_ALWAYS=2, CREATE_NEW=1, OPEN_ALWAYS=4, OPEN_EXISTING=3, TRUNCATE_EXISTING=5 } [Flags] public enum FileAttributesAndFlags : uint { FILE_ATTRIBUTE_READONLY= 0x00000001, FILE_ATTRIBUTE_HIDDEN= 0x00000002, FILE_ATTRIBUTE_SYSTEM= 0x00000004, FILE_ATTRIBUTE_ARCHIVE= 0x00000020, FILE_ATTRIBUTE_NORMAL= 0x00000080, FILE_ATTRIBUTE_TEMPORARY= 0x00000100, FILE_ATTRIBUTE_OFFLINE= 0x00001000, FILE_ATTRIBUTE_ENCRYPTED= 0x00004000, FILE_FLAG_BACKUP_SEMANTICS= 0x02000000, FILE_FLAG_DELETE_ON_CLOSE= 0x04000000, FILE_FLAG_NO_BUFFERING = 0x20000000, FILE_FLAG_OPEN_NO_RECALL= 0x00100000, FILE_FLAG_OPEN_REPARSE_POINT= 0x00200000, FILE_FLAG_OVERLAPPED= 0x40000000, FILE_FLAG_POSIX_SEMANTICS= 0x01000000, FILE_FLAG_RANDOM_ACCESS= 0x10000000, FILE_FLAG_SESSION_AWARE= 0x00800000, FILE_FLAG_SEQUENTIAL_SCAN= 0x08000000, FILE_FLAG_WRITE_THROUGH= 0x80000000 } public static IntPtr CreateFileA( string fileName, Access_Mask access, ShareModeMask shareMode, IntPtr lpSecurityAttributes, CreationDisposition creationDisposition, FileAttributesAndFlags FlagsAndAttributes, IntPtr hTemplateFile) => CreateFileA(fileName, (uint)access, (uint)shareMode, lpSecurityAttributes, (uint)creationDisposition, (uint)FlagsAndAttributes, hTemplateFile); public static IntPtr CreateFileA( string fileName, Access_Mask access, ShareModeMask shareMode, CreationDisposition creationDisposition, FileAttributesAndFlags FlagsAndAttributes) => CreateFileA(fileName, (uint)access, (uint)shareMode, IntPtr.Zero, (uint)creationDisposition, (uint)FlagsAndAttributes, IntPtr.Zero); public static IntPtr OpenFile(string fileName) { var handle = CreateFileA( fileName, Access_Mask.GENERIC_READ, ShareModeMask.None, CreationDisposition.OPEN_EXISTING, FileAttributesAndFlags.FILE_ATTRIBUTE_NORMAL ); return handle; } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 短剧的sdk在哪里接入
- ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
- ¥60 找人回答kibana8.14.3二次集成开发,自定义插件ui导航栏如何设置
- ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零
- ¥15 不同模型怎么用同一个shader
- ¥15 安卓启动没有ais proxy与v4l2的log打印
- ¥15 go怎么读取mdb文件里面的数据
- ¥60 Matlab联合CRUISE仿真编译dll文件报错
- ¥15 脱敏项目合作,ner需求合作
- ¥15 脱敏项目合作,ner需求合作