对于简单参数的函数,C#可以通过变量的映射来实现
但是如果参数比较复杂,比如:
Shell32.dll中的
int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
这个函数的参数是个结构体,它如何在C#中调用呢?附上结构体的声明如下:
typedef struct _SHFILEOPSTRUCT {
    HWND hwnd;
    UINT wFunc;
    LPCTSTR pFrom;
    LPCTSTR pTo;
    FILEOP_FLAGS fFlags;
    BOOL fAnyOperationsAborted;
    LPVOID hNameMappings;
    LPCTSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

解决方案 »

  1.   

    在C#中声明一个结构,注意其中的属性一个不能少,还要使用内存大小一致,情况需要的话需要[StructLayout(LayoutKind.Sequential)]申明。    UINT wFunc;
        LPCTSTR pFrom;
        LPCTSTR pTo;
        FILEOP_FLAGS fFlags;
        BOOL fAnyOperationsAborted;
        LPVOID hNameMappings;
        LPCTSTR lpszProgressTitle;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        public Uint32 wFunc;
        public String pFrom;
        public String pTo;
        public FILEOP_FLAGS fFlags; //????这个是什么?
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        public String lpszProgressTitle;
    }还有CharSet需要设置为ansi,不然好像得不到字符串
    给个东西参考下:http://www.codeproject.com/csharp/essentialpinvoke.asp
      

  2.   

    错了,就是这个
    [StructLayout(LayoutKind.Sequential)]
    public struct SHFILEOPSTRUCT
    {
        public IntPtr hwnd;
        public Uint32 wFunc;
        public String pFrom;
        public String pTo;
        public FILEOP_FLAGS fFlags; //????这个是什么?
        public bool fAnyOperationsAborted;
        public IntPtr hNameMappings;
        public String lpszProgressTitle;
    }
      

  3.   

    你可以去www.pinvoke.net去查找相关的声明
      

  4.   

    参看
    http://www.pinvoke.net/default.aspx/shell32/SHFileOperation.html