为什么不't此P/Invoke签名工作

Why doesn't this P/Invoke signature work?

本文关键字:Invoke 工作 为什么不      更新时间:2023-10-16

我试图从WinApi函数封送C#代码。。但我理解。。为什么她不工作!文件路径-正确,句柄被占用。有人能帮我吗?

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Linq;
using System.Text;
namespace ChangeFileTime
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetFileTime(IntPtr hFile, ref long lpCreationTime,
                                                            ref long lpLastAccessTime, 
                                                            ref long lpLastWriteTime);
        [DllImport("kernel32.dll")]
        public static extern IntPtr CreateFile(string lpFilename,
                                              uint dwDesiredAccess,
                                              uint dwShareMode,
                                              IntPtr SecurityAttributes,
                                              uint dwCreationDisposition,
                                              uint dwFlagsAndAttributes,
                                              IntPtr hTemplateFile);

        [DllImport("kernel32.dll")]
        public static extern bool CloseHandle(IntPtr hObject);
        static void Main(string[] args)
        {
            const uint GENERIC_READ = 0x80000000;
            const uint OPEN_EXISTING = 3;
            const uint FILE_SHARE_WRITE = 0x00000002;
            const uint FILE_ATTRIBUTE_NORMAL = 128;
            IntPtr ptr = CreateFile("C:\file.txt", GENERIC_READ,
                                                    FILE_SHARE_WRITE,
                                                    IntPtr.Zero,
                                                    OPEN_EXISTING,
                                                    FILE_ATTRIBUTE_NORMAL,
                                                    IntPtr.Zero);
            DateTime creation_time = new DateTime(1990, 12, 14);
            long file_time = creation_time.ToFileTime();
            DateTime time = DateTime.FromFileTime(file_time);
            SetFileTime(ptr, ref file_time, ref file_time, ref file_time);
            int a = 20;
        }
    }
}

我想我弄错了。。我试着写C++代码,她做得很好。。但是为什么C#不起作用呢?

来自MSDN:

句柄必须是使用带有的CreateFile函数创建的FILE_WRITE_ATTRIBUTES

这应该有效:

const uint FILE_WRITE_ATTRIBUTES = 0x0100;
IntPtr ptr = CreateFile("C:\file.txt", FILE_WRITE_ATTRIBUTES, //...