{高三党分享}VB使用函数指针动态调用DLL

myjisgreat 2011-10-07 06:07:42
下载 http://download.csdn.net/download/myjisgreat/3662575


前些日子突发奇想。长假碰电脑的时间基本都耗在这个东西上了,最窘的是写好后才发现网上竟然有类似代码。。。。。不过我的代码比他短小,姑且发上来献献丑吧

动态调用DLL的前两步VB都可以做到,LoadLibrary & GetProcAddress得到函数指针。可是由于VB不支持函数指针的调用,貌似到这一步就走不下去了。
不过因为VB内部函数、DLL函数(包括API函数)都使用STDCALL调用方式,我们可以手动把参数送入堆栈,然后CALL这个函数,也就达到了效果(不过要用汇编完成)
这就直接交给VC的dll完成吧

long WINAPI __stdcall CallProc(long addr,long *Param,long Count)
{

long i;long par;

for (i=Count;i>=1;i--)
{ par=*Param;
__asm{
push par
}
Param--;

}

__asm{
call addr
mov i,eax
}

return i;

}

这个函数将参数一一PUSH进堆栈,然后CALL(网上代码用VB+汇编完成,代码量巨大,个人觉得不值)


于是VB调用就很简单了,VB中把参数填入Long类型的数组中,调用CallProc,addr代表函数指针, pPrarm代表刚刚填好的参数数组的最后一个参数的地址(用VarPtr取得),conut代表参数数量,比如
Dim hModule As Long, pProc As Long,p(1) as Long
hModule = LoadLibrary("user32")
pProc = GetProcAddress(hModule, "FlashWindow")
If pProc <> 0 Then
p(0)=Me.Hwnd 'FlashWindow第一个参数
p(1)=1000 'FlashWindow第2个参数
Form1.Print CallProc(pProc, VarPtr(p(1)),2)
Else
MsgBox "err"
End If
FreeLibrary hModule



为方便调用,我简单封装了一个VB函数
Public Function StdCall(lpAddr As Long, ParamArray Param()) As Long
Dim p() As Long
If UBound(Param) <> -1 Then
ReDim p(0 To UBound(Param))
Dim i As Integer
For i = 0 To UBound(Param)
p(i) = Param(i)
Next i
StdCall = CallProc(lpAddr, VarPtr(p(UBound(Param))), UBound(Param) + 1)
Else
StdCall = CallProc(lpAddr, 0, 0)
End If
End Function

比如上面的FlashWindow就可以StdCall pProc,Me.Hwnd,1000来用了
...全文
340 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2011-10-17
  • 打赏
  • 举报
回复
看看,学习
王二.麻子 2011-10-17
  • 打赏
  • 举报
回复
一定要嵌汇编进去嘛..
可以自己写个函数..函数里面随便写点垃圾代码
然后自己用操作PE文件的方式,在内存中找到这个自己编写的函数的跳转地址..把你找到的dll的入口地址填进去,按照调用自己函数的方式直接调用..

在调试器里么弄过成功了,实际还没操作过
myjisgreat 2011-10-15
  • 打赏
  • 举报
回复
我觉得还行啊
嗷嗷叫的老马 2011-10-07
  • 打赏
  • 举报
回复
拖上一个DLL的话,这是很多人所不愿意的
myjisgreat 2011-10-07
  • 打赏
  • 举报
回复
长假结束了,受不鸟啊,明天就考试
源码链接: https://pan.quark.cn/s/a4b39357ea24 微信小程序是由腾讯公司设计的一种轻量级应用开发平台,主要面向移动设备,旨在为用户带来无需下载安装即可直接使用的应用服务体验。在微信小程序的开发实践中,"模仿美团菜单 swiper分类菜单"是一项常见的技术应用,其目的是达成与美团外卖应用相似的交互模式,使用户能够轻松地浏览和挑选各种商品或服务。 在微信小程序的技术体系中,`swiper`组件属于轮播图功能模块,通常用于呈现多张图片或卡片式的切换界面,能够达成动态滑动展示不同分类菜单的功能。在模拟美团菜单的应用情境下,`swiper`组件一般与`swiper-item`组件协同工作,每一个`swiper-item`对应一个分类,用户可通过左右滑动来切换不同的分类菜单。 为了达成这样的功能,首先需要在微信小程序的`json`配置文档中引入`swiper`组件,并在`wxml`结构文档中构建相应的布局代码,将每个分类以`swiper-item`的形式进行组织。同时,需要在`wxss`样式文档中定义恰当的样式,保证分类菜单的视觉呈现符合设计规范。 接下来,我们将在`js`逻辑文档中处理`swiper`的切换逻辑,通过监听`bindchange`事件来识别当前选中的分类,并根据这一信息动态获取对应的子菜单信息。为了达成类似美团的层级菜单功能,可能还需要借助`picker`或`navigator`组件来展示二级分类或商品详情。 在开发阶段,需要关注以下关键点: 1. 数据绑定:保证数据与界面之间的双向链接准确无误,以便在选择分类时即时更新显示内容。 2. 动态加载:针对大量数据,可能需要采取异步加载机制,防止一次性加载过多内容引发性能瓶颈...

7,788

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧