如何在.NET里面调用win32 API

来源:互联网 发布:软件服务创业 编辑:程序博客网 时间:2024/04/29 15:57

下面是示例在C#里面调用win32api中的 CreateFile 和 CloseHandle 这两个函数。

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace copytest
{
 /// <summary>
 /// FileAccess 的摘要说明。
 /// </summary>
 public class OpenFileApi
 {

  private const uint GENERIC_READ = 0x80000000;
  private const uint GENERIC_WRITE = 0x40000000;

  private const int CREATE_NEW = 1;
  private const int CREATE_ALWAYS = 2;
  private const int OPEN_EXISTING = 3;
  private const int OPEN_ALWAYS = 4;

  private const int FILE_SHARE_READ = 0x1;
  private const int FILE_SHARE_WRITE = 0x2;

  private const uint FILE_ATTRIBUTE_READONLY = 0x1;
  private const uint FILE_ATTRIBUTE_HIDDEN = 0x2;
  private const uint FILE_ATTRIBUTE_SYSTEM = 0x4;
  private const uint FILE_ATTRIBUTE_DIRECTORY = 0x10;
  private const uint FILE_ATTRIBUTE_ARCHIVE = 0x20;
  private const uint FILE_ATTRIBUTE_NORMAL = 0x80;
  private const uint FILE_ATTRIBUTE_TEMPORARY = 0x100;
  private const uint FILE_ATTRIBUTE_COMPRESSED = 0x800;
  private const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
  private const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;

  private const int INVALID_HANDLE_VALUE = -1;

  private int filehandle;

  //声明API的语句。(关键!)
  [DllImport("kernel32.dll")]
  private static extern int CreateFile
  (
   string lpFileName, //File name
   uint dwDesiredAccess, //Access mode
   int dwShareMode, //Share mode
   int lpSecurityAttributes, //SD
   int dwCreationDisposition, //How to create
   uint dwFlagsAndAttributes, //File attributes
   int hTemplateFile //Handle to template file
  );

  [DllImport("kernel32.dll")]
  private static extern bool CloseHandle
  (
   int hObject //Handle to object
  );


  public OpenFileApi()
  {
   filehandle=INVALID_HANDLE_VALUE;
   nobuffermode=false;
  }

  ~OpenFileApi()
  {
   Close();
  }

  public FileStream Open(String filepath,FileMode mode, FileAccess access,FileShare share)
  {
   uint dwDesiredAccess;  //Access mode
   int dwShareMode;   //Share mode
   int lpSecurityAttributes; //SD
   int dwCreationDisposition; //How to create
   uint dwFlagsAndAttributes; //File attributes

   if (filehandle != INVALID_HANDLE_VALUE)
   {
    CloseHandle(filehandle);
   }

   switch (access)
   {
    case FileAccess.Read:
     dwDesiredAccess=GENERIC_READ;
     break;
    case FileAccess.Write:
     dwDesiredAccess=GENERIC_WRITE;
     break;
    default:
     dwDesiredAccess=GENERIC_READ | GENERIC_WRITE;
     break;
   }

   switch (share)
   {
    case FileShare.Read:
     dwShareMode=FILE_SHARE_READ;
     break;
    case FileShare.Write:
     dwShareMode=FILE_SHARE_WRITE;
     break;
    case FileShare.ReadWrite:
     dwShareMode=FILE_SHARE_READ | FILE_SHARE_WRITE;
     break;
    default:
     dwShareMode=0;
     break;
   }

   switch (mode)
   {
    case FileMode.Open:
     dwCreationDisposition=OPEN_EXISTING;
     break;
    case FileMode.OpenOrCreate:
     dwCreationDisposition=OPEN_ALWAYS;
     break;
    case FileMode.CreateNew:
     dwCreationDisposition=CREATE_NEW;
     break;
    default: 
     dwCreationDisposition=CREATE_ALWAYS;
     break;
   }

   lpSecurityAttributes=0;
   

   dwFlagsAndAttributes=FILE_ATTRIBUTE_NORMAL;

   filehandle=CreateFile(filepath,
     dwDesiredAccess,
     dwShareMode,
     lpSecurityAttributes,
     dwCreationDisposition,
     dwFlagsAndAttributes,
     0);

   if (filehandle != INVALID_HANDLE_VALUE)
   {
    FileStream newfs = new FileStream((IntPtr)filehandle,access);
    return(newfs);
   }
   else
   {
    throw new Exception("File cannot open.");
    //return(null);
   }
  }

  public void Close()
  {
   if (filehandle!=INVALID_HANDLE_VALUE)
   {
    CloseHandle(filehandle);
    filehandle=INVALID_HANDLE_VALUE;
   }
  }


 }
}

原创粉丝点击