繁体   English   中英

C#从C ++纠正托管代码

[英]C# Correct managed code from C++

我必须在我的C#应用​​程序中使用此外部函数“ GetOpenedFiles”(更多信息,请访问: http : //www.codeproject.com/KB/shell/OpenedFileFinder.aspx )。 我不知道可以写此函数的包装器:

void GetOpenedFiles(LPCWSTR lpPath, OF_TYPE Filter, OF_CALLBACK CallBackProc, UINT_PTR pUserContext);

原始C ++代码(OpenFilefinder.h)

enum OF_TYPE
{
    FILES_ONLY = 1,
    MODULES_ONLY = 2,
    ALL_TYPES = 3
};

struct OF_INFO_t
{
    DWORD dwPID;
    LPCWSTR lpFile;
    HANDLE hFile;
};

typedef void (CALLBACK* OF_CALLBACK)(OF_INFO_t OpenedFileInf0, UINT_PTR uUserContext );


extern "C" __declspec(dllexport) void ShowOpenedFiles( LPCWSTR lpPath );
extern "C" __declspec(dllexport) void GetOpenedFiles( LPCWSTR lpPath, 
                                                      OF_TYPE Filter,
                                                      OF_CALLBACK CallBackProc,
                                                      UINT_PTR pUserContext );

我的C#应用​​程序:

    public enum OF_TYPE : int
    {
        FILES_ONLY = 1,
        MODULES_ONLY = 2,
        ALL_TYPES = 3
    }

    public struct OF_INFO_t
    {
        ?????? dwPID;
        ?????? lpFile;
        ?????? hFile;
    }

    [DllImport("OpenFileFinder.dll", EntryPoint = "GetOpenedFiles")]
    static extern void GetOpenedFiles(??????? lpPath, OF_TYPE filter, ????? CallBackProc, ????? pUserContext);

如何在C#应用程序中正确使用此dll函数?

编辑:

这是我的最新代码段,但从不调用回调函数:

namespace Open64
{
    class Program
    {

        public Program()
        {
            GetOpenedFiles("C:\\", OF_TYPE.ALL_TYPES, CallbackFunction, UIntPtr.Zero);
        }

        //void GetOpenedFiles(LPCWSTR lpPath, OF_TYPE Filter, OF_CALLBACK CallBackProc, UINT_PTR pUserContext);

        public enum OF_TYPE : int
        {
            FILES_ONLY = 1,
            MODULES_ONLY = 2,
            ALL_TYPES = 3
        }

        public struct OF_INFO_t
        {
            Int32 dwPID;
            String lpFile;
            IntPtr hFile;
        }

        public delegate void CallbackFunctionDef(OF_INFO_t info, IntPtr context);

        [DllImport("OpenFileFinder.dll", EntryPoint = "GetOpenedFiles")]
        static extern void GetOpenedFiles(string lpPath, OF_TYPE filter, CallbackFunctionDef CallBackProc, UIntPtr pUserContext);

        public void CallbackFunction(OF_INFO_t info, IntPtr context)
        {
            Console.WriteLine("asd");
        }

        [STAThread]
        static void Main()
        {
            new Program();
        }
    }

}

这就是您封送以下类型的方式:

DWORD => Int32
LPCWSTR => String
HANDLE => IntPtr
UINT_PTR => UIntPtr
public struct OF_INFO_t
{
   Int32 dwPID;
   String lpFile;
   IntPtr hFile;
}

public delegate void CallbackFunctionDef(OF_INFO_t info, UIntPtr context);

[DllImport("OpenFileFinder.dll", EntryPoint = "GetOpenedFiles")]
static extern void GetOpenedFiles(string lpPath, OF_TYPE filter, CallbackFunctionDef CallBackProc, UIntPtr pUserContext);

编辑:这是完整的程序

class Program
{
    public Program()
    {
        GetOpenedFiles("C:\\", OF_TYPE.ALL_TYPES, CallbackFunction, UIntPtr.Zero);
        Console.ReadKey();
    }

    //void GetOpenedFiles(LPCWSTR lpPath, OF_TYPE Filter, OF_CALLBACK CallBackProc, UINT_PTR pUserContext);

    public enum OF_TYPE : int
    {
        FILES_ONLY = 1,
        MODULES_ONLY = 2,
        ALL_TYPES = 3
    }

    [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
    public struct OF_INFO_t
    {
        public Int32 dwPID;
        public String lpFile;
        public IntPtr hFile;
    }

    public delegate void CallbackFunctionDef(OF_INFO_t info, IntPtr context);

    [DllImport("OpenFileFinder.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "GetOpenedFiles")]
    static extern void GetOpenedFiles(string lpPath, OF_TYPE filter, CallbackFunctionDef CallBackProc, UIntPtr pUserContext);

    public void CallbackFunction(OF_INFO_t info, IntPtr context)
    {
        //List the files
        Console.WriteLine(info.lpFile);
    }

    [STAThread]
    static void Main()
    {
        new Program();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM