如何的P / Invoke SetFileTime与空参数? [重复](How to P/Inv

2019-07-30 05:56发布

这个问题已经在这里有一个答案:

  • 如何处理在C#null或可选的DLL结构参数 1回答

试图P /调用SetFileTime函数从我的C#程序,我使用了以下特征:

[DllImport(@"kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool SetFileTime(
    IntPtr hFile,
    ref long lpCreationTime,
    ref long lpLastAccessTime,
    ref long lpLastWriteTime);

该文件指出以下非托管签名:

BOOL WINAPI SetFileTime(
  __in      HANDLE hFile,
  __in_opt  const FILETIME *lpCreationTime,
  __in_opt  const FILETIME *lpLastAccessTime,
  __in_opt  const FILETIME *lpLastWriteTime
);

它说的第二,第三和第四个参数,他们可选配:

此参数可以是NULL,如果应用程序并不需要更改这些信息。

而这正是我想做的事:只传递三个日期时间值之一,并且已经设置到其他null

我完全失去了如何在的P / Invoke签名来表达这一点。

所以我的问题是:

这是正确的P / Invoke签名(或调用的正确方法),以能够通过nullSetFileTime函数的参数?

编辑1:

由于FileInfo类已经提供了设置文件次可写的属性,你可能会问,为什么我做我自己,而不是使用类。

其原因是,我打算用我的这个功能长路径库,它是用来克服MAX_PATH限制,因此不能使用标准的.NET函数。

因此使用FileInfo类是不是一种选择,很遗憾。

编辑2:

我已经使用由汉斯建议的解决方案解决了这个问题。 在那之后,我发现了以下功能用户提供的评论 ,说:

另外,指定用于所述参数中的一个零值具有为指定NULL相同的效果。

虽然我没有检查这是否是真实的,它仍然可能是具有矿山类似的要求别人的选项。

Answer 1:

你不能模拟与C#中的ref关键字,它总是在运行时产生一个非空指针。 您实际上不得不宣布它long* ,这需要使用不安全的关键字。 通过与参数&local-var语法或使用null

一种可能的办法来避免使用不安全的申报3个版本的这种方法的名称不同,使用的DllImport的入口点属性将它们全部映射到SetFileTime()。 指定你不想设置为IntPtr的,所以你可以通过IntPtr.Zero的那些,在一个你想,只要设置参考。 例如:

[DllImport("kernel32.dll", SetLastError = true, EntryPoint="SetFileTime", ExactSpelling=true)]
internal static extern bool SetFileCreateTime(
    IntPtr hFile,
    ref long lpCreationTime,
    IntPtr lpLastAccessTimeUnused,
    IntPtr lpLastWriteTimeUnused);

重复SetFileAccessTime和SetFileWriteTime。



文章来源: How to P/Invoke SetFileTime with null parameters? [duplicate]