专栏首页mini188C#访问非托管DLL

C#访问非托管DLL

前段时间写了一个读卡器程序,使用到了一个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);

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够。于是再次翻看了一下书里的内容,突然有点打开脑门的感觉...

    用户1105954
  • 学习AOP之深入一点Spring Aop

    上一篇《学习AOP之认识一下SpringAOP》中大体的了解了代理、动态代理及SpringAop的知识。因为写的篇幅长了点所以还是再写一篇吧。接下来开始深入一点...

    用户1105954
  • 技术笔记:Indy IdSMTP支持腾讯QQ邮箱邮件发送

    1、腾讯QQ邮箱的授权码问题 因为腾讯邮箱折腾了个底朝天,其要搞什么授权码登录第三方客户端,否则会报这个错误: 'Error: 请使用授权码登录。详情请看: ...

    用户1105954
  • 迷宫的最短路径

    题意:给定一个大小为N * M的迷宫,迷宫由通道与墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需要的最下步数。

    杨鹏伟
  • HDU1878 欧拉回路

    Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路? Inp...

    attack
  • 06--图解数据结构之并查集

    张风捷特烈
  • HDU 2389 二分图最大匹配之Hopcroft-Karp优化 O(n^0.5*m)

    T个测试用例, 时间time, n个人,接下来n行是坐标 和 每个人的速度 v。 m,接下来m行是 雨伞的坐标。

    用户2965768
  • AcWing 166. 数独(dfs,位运算 剪枝集萃)

    glm233
  • 【综合笔试题】难度 4/5,一道结合了「二分」的图论题

    这是 LeetCode 上的「778. 水位上升的泳池中游泳(困难)」,难度为 Hard。

    宫水三叶的刷题日记
  • Leetcode 1815. 得到新鲜甜甜圈的最多组数(模拟退火)

    glm233

扫码关注云+社区

领取腾讯云代金券