qq_43353945 2024-01-24 17:54 采纳率: 31.3%
浏览 7
已结题

关于C#调用C++的函数

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条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月24日

悬赏问题

  • ¥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需求合作