• C#访问非托管DLL


    来至:http://bbs.mini188.com/showtopic-161.aspx
    前段时间写了一个读卡器程序,使用到了一个DLL。在.NET 中调用DLL还是相当简单的。我也是转别人的代码,自己的不写。下面就是代码:

    C#中要使用动态链接库中的导出函数,只能在程序中根据DllAtribute显示调用,无法在运行阶段动态加载,但是我们可以利用WIN32 API的LoadLibrary和FreeLibrary打到目的,问题是根据GetProcAddress()函数获取到的导出函数的地址无法在C#中利用,网上很多方法多是利用对函数调用栈的操作来达到在C#中操作的目的.    其实如果导出函数没有返回值,完全可以利用另一个API函数达到动态绑定DLL库的目的:

     
    LRESULT CallWindowProc( WNDPROC lpPrevWndFunc,
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
    );


    如果导出函数无形参也无返回值的话,可以直接调用CallWindowProc(FunctionName,0,0,0,0),如果我们需要向导出函数传递简单参数的话,也可以自定义一个消息,用消息封装实参。
    [DllImport("kernel32")]
    public extern static int LoadLibrary(string lpLibFileName);
    [DllImport(
    "kernel32")]
    public extern static bool FreeLibrary(int hLibModule);
    [DllImport(
    "kernel32", CharSet=CharSet.Ansi)]
    public extern static int GetProcAddress(int hModule, string lpProcName);
    [DllImport(
    "user32", EntryPoint="CallWindowProc")] 
    public static extern int CallWindowProc(int lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);

    private void button1_Click(object sender, System.EventArgs e)
    {
    int hmod=LoadLibrary("*****.dll");
    int pFname=GetProcAddress(hmod, "*****");
    CallWindowProc(pFname,
    0,0,0);
    FreeLibrary(hmod);
    }
  • 相关阅读:
    《孙子兵法》(前六篇)读书笔记
    写代码的指导思想:如何写出易测、清晰、健壮的牢固代码
    如何从业务代码中抽离出可复用的微组件
    碎碎念集萃二八
    订单同步工程标准化改造事记
    代码的味道
    批量导出51电子发票的pdf文件
    LODOP具体的分类的简短问答
    lodop打印透明图简短问答
    LODOP打印公章的白色透明2
  • 原文地址:https://www.cnblogs.com/5207/p/851601.html
Copyright © 2020-2023  润新知