a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 111|回复: 1

[Visual Basic] 2012年计算机等级考试二级VB动态调用外部函数的方法(2)

[复制链接]
发表于 2012-7-31 22:10:12 | 显示全部楼层 |阅读模式
′执行Assembly Code部分   RunDll32 = CallWindowProc(GetCodeStart(hProc, Params), 0, 1, 2, 3)
( U. ]" k# H  d0 R+ }9 e  FreeLibrary hModule ′释放空间! t& S5 `: P2 k, M# W$ E/ _
  End Function* T  S/ ^+ C' U
  Private Function GetCodeStart(ByVal lngProc As Long, ByVal arrParams As Variant) As Long& [/ d$ D1 q  c
  ′---以下为Assembly部分--
7 S9 d9 T" ^/ E+ T  ′作用:将函数的参数压入堆栈4 K/ V( x9 M  g$ r: e
  Dim lngIndex As Long, lngCodeStart As Long
, j. n/ m& Z" O. ~  ′程序起始位址必须是16的倍数
  h3 A9 l( |7 B" l  ′VarPtr函数是用来取得变量的地址
' o/ L5 M, r" d) l' ]9 `! o* c  lngCodeStart = (VarPtr(m_OpCode(0)) Or &HF) + 11 \& W# V  V, r# c
  m_opIndex = lngCodeStart - VarPtr(m_OpCode(0)) ′程序开始的元素的位置
) G' h, m  T* r) L. g4 ?  ′前面部分以中断点添满8 N# \2 u9 ?' a- T2 t' K
  For lngIndex = 0 To m_opIndex - 1& F0 E  A3 W5 x/ `5 x6 |
  m_OpCode(lngIndex) = &HCC ′int 3
0 Q* {; _4 G$ i/ N  Next lngIndex8 c0 Y8 G8 g9 |1 a
  ′--------以下开始放入所需的程序----------1 s, o3 T. d8 ]+ q: ~6 d& l6 x% d
  ′将参数push到堆栈
2 n* G5 d# q) w  ′由于是STDCall CALL 参数由最后一个开始放到堆栈
2 K! ?1 C) x- L& c+ `0 c  For lngIndex = UBound(arrParams) To 0 Step -1
. q. {% `, V" d9 r4 t  ]. ^$ n9 R" C, p3 B
  AddByteToCode &H68 ′push的机器码为H68
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:13 | 显示全部楼层

2012年计算机等级考试二级VB动态调用外部函数的方法(2)

</p>  AddLongToCode CLng(arrParams(lngIndex)) ′参数地址( P5 G. f1 F6 T* K2 O1 V% |
  Next lngIndex
2 R/ R0 X: R1 g3 u- E  ′call hProc2 u! B! X# u8 z- }2 E" N: S
  AddByteToCode &HE8 ′call的机器码为HE8
' y" I; F* E/ w  ?  AddLongToCode lngProc - VarPtr(m_OpCode(m_opIndex)) - 4 ′函数地址 用call的定址" D$ L" S. r! f: p& }2 @+ Q9 S
  ′-----------结束所需的程序--------------+ K# \8 g* N$ ]5 |  k& P
  ′返回呼叫函數
$ C# J" L. N7 |8 O5 H# v  AddByteToCode &HC2 ′ret 10h
3 A; l6 L" B$ o. k& Z. V: h: f1 q  AddByteToCode &H10
7 R+ v/ }! [5 b( D  AddByteToCode &H0
& \3 U: \8 K8 m9 O( b8 X( T: C& Y  GetCodeStart = lngCodeStart
" H# |; V  ^, T- G3 [5 l7 w; J0 |5 V  End Function( ^4 X% G* u1 i% p$ R
  Private Sub AddLongToCode(lData As Long). ?3 K1 x( R9 x4 l- Q
  ′将Long类型的参数写到m_OpCode中
. y% C  G5 f1 P% x1 x) ^  CopyMemory m_OpCode(m_opIndex), lData, 4
4 G+ @( C# S# o& {3 B  m_opIndex = m_opIndex + 4! c1 D  o. _( h5 [' T
  End Sub. `; D( J3 I" m# h
  Private Sub AddIntToCode(iData As Byte)* i" I' x0 h1 n3 @) @7 U
  ′将Integer类型的参数写道m_OpCode中
" m5 P$ d7 d$ a' w, q  CopyMemory m_OpCode(m_opIndex), iData, 2
$ K0 D4 m& |5 X. H9 ]0 ^  m_opIndex = m_opIndex + 2/ A6 d- s8 t+ G8 h
  End Sub
4 G5 e. e; l( S- E! P8 L/ a. P  Private Sub AddByteToCode(bData As Byte)
" @& H9 H* e+ N9 C  ′将Byte类型的参数写道m_OpCode中
; K% G3 Q# @+ ^0 X  ]  m_OpCode(m_opIndex) = bData4 q, N3 p, X, @
  m_opIndex = m_opIndex + 1
; S  |2 X1 J6 ^/ t: \! W# C2 M! M- m  End Sub
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 05:55 , Processed in 0.152035 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表