下载 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来用了
前些日子突发奇想。长假碰电脑的时间基本都耗在这个东西上了,最窘的是写好后才发现网上竟然有类似代码。。不过我的代码比他短小,姑且发上来献献丑吧动态调用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来用了
解决方案 »
- 现在程序员转行都做什么啊?有没有成功的案例
- 请问如何用VB调用出Office工具栏的某一功能!谢谢!!!
- VB6.0如何最简单的编写自定义属性和方法事件
- 如何得到access的列表框一行(各列)的数据?不使用recordset对象
- 怎么样才能使Combo控件内不能输入东西而只能选择下拉框内的选项?
- 弹出窗体怎么引用主窗体的函数?
- 怎么修改时会报错?进来看看。
- 服务器向所有客户端发消息时,客户端怎么没有事件发生,但是……
- 写二进制文件到注册表只能写类似Chr$(&H1) + Chr$(&H2) + Chr$(&H3) + Chr$(&H4)如何写以下文件?
- 在VB中动态的修改资源文件中的内容。(如果你是高手请帮小弟一把!。。。)
- FtpPutFile函数执行成功,但只上传了0字节的文件,昨晚还可以上传文件的,代码没改动过,什么回事?
- 求助。。。想用VB实现两个功能,一是点击command1控件能生成一个command2,再点击继续生成二是,怎样实现两个控件的线连接,最好可以对线编号
可以自己写个函数..函数里面随便写点垃圾代码
然后自己用操作PE文件的方式,在内存中找到这个自己编写的函数的跳转地址..把你找到的dll的入口地址填进去,按照调用自己函数的方式直接调用..在调试器里么弄过成功了,实际还没操作过