前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#访问非托管DLL

C#访问非托管DLL

作者头像
用户1105954
发布2018-01-12 17:59:36
1.4K0
发布2018-01-12 17:59:36
举报
文章被收录于专栏:mini188

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

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

代码语言:javascript
复制
LRESULT CallWindowProc( WNDPROC lpPrevWndFunc,

    HWND hWnd,

    UINT Msg,

    WPARAM wParam,

    LPARAM lParam

);

如果导出函数无形参也无返回值的话,可以直接调用CallWindowProc(FunctionName,0,0,0,0),如果我们需要向导出函数传递简单参数的话,也可以自定义一个消息,用消息封装实参。

代码语言:javascript
复制
[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);

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2007-08-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档