大家帮帮忙,关于API函数调用

ATH_SEG 2010-06-26 05:09:33
本人新手,最近学习API函数调用,用的是vs2010,但是运行时就会出错,说API函数调用导致堆栈不对称,希望大家帮忙解决一下

Public Class Form1
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Const VK_LEFT As Long = &H27

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Label1.Text = "Begin"
Timer1.Interval = 10
Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = "Hello"
If GetAsyncKeyState(VK_LEFT) Then
Label1.Text = "OK!"
Else
Label1.Text = "NO!"
End If
End Sub
End Class

...全文
91 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝海 2010-06-28
  • 打赏
  • 举报
回复
问题已然解决,我就不跟着凑合了,别给我分啊!
呵呵呵!
chinaboyzyq 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jadsin 的回复:]

将上面的函数声明的Long改为Integer,Integer改为Short

原因是VB.NET和VB6中整形长度不同,VB.NET中
Long Int64
Integer Int32 (相当于VB6中的Long)
Short Int16 (相当于VB6中的Integer)
[/Quote]
vb6与vb.net调用API的不同之处,网上还是可以查到的。
Tiger_Zhao 2010-06-27
  • 打赏
  • 举报
回复
用 API 本身就不是很简单。
比如 CopyMemory 的 Void* 参数,win.tlb 中就轻易给 VB 调用声明出 9 个变种函数。
lyserver 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jadsin 的回复:]
可以的,这个这是不过是测试,真的做起来最好还是用Privte
[/Quote]
同意。否则会破坏类的封装性。
ATH_SEG 2010-06-26
  • 打赏
  • 举报
回复
可以的,这个这是不过是测试,真的做起来最好还是用Privte
舉杯邀明月 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jadsin 的回复:]
将上面的函数声明的Long改为Integer,Integer改为Short

原因是VB.NET和VB6中整形长度不同,VB.NET中
Long Int64
Integer Int32 (相当于VB6中的Long)
Short Int16 (相当于VB6中的Integer)
[/Quote]
可能很多人都会忽略这个问题。
恭喜楼主…………


VS 中,在窗体模块声明API 能用 Public 啊?
ATH_SEG 2010-06-26
  • 打赏
  • 举报
回复
还是找了好久才发现的,个大家说一下吧,准备结贴
ATH_SEG 2010-06-26
  • 打赏
  • 举报
回复
将上面的函数声明的Long改为Integer,Integer改为Short

原因是VB.NET和VB6中整形长度不同,VB.NET中
Long Int64
Integer Int32 (相当于VB6中的Long)
Short Int16 (相当于VB6中的Integer)
当你在网络上抓到一些数据包,想知道这些包是哪个进程发出来的时候, 怎么办?这个小工具也许能帮一些忙。 这个工具采用的是HOOK进程的winsock API,把一些数据记录下来。 HOOK API在《windows核心编程》提到的有两种, 1.1 修改IAT。缺点:象shellcode中常用的那种根据DLL输出表来计算函数 地址的方法,修改IAT就无法HOOK到目标函数了。 1.2 修改目标函数的前几字节,跳转到我们的函数,我们的函数里面再把那 几个字节还原,调用原函数。重复。缺点:多线程环境下这种方法并不 健壮。 29A杂志里面的文章《挂钩Windows API》也提到了几种办法: (中译文见http://www.xfocus.net/articles/200403/681.html) 2.1 patch静态文件,即运行前挂钩. 2.2 也是修改IAT,跟1.1一样. 2.3 修改目标函数的前几个字节,跳转到新的函数,但不再调用原始函数,无 实际意义,作者只是做演示? 2.4 这种方法(3.2.3 保存原始函数)很COOL,其中的亮点和难点就是“获取任意 地址的指令长度”。 之前我也想用2.4这种办法,但卡在如何“获取任意地址的指令长度”上面了:( 在看到《挂钩Windows API》这篇文章之前,我取了一个比较简单有效的办法: 3.1 把目标函数的DLL COPY一份到内存中,修改原目标函数的前几字节,跳转 到我们的函数,在我们的函数中调用原函数新的COPY。

1,486

社区成员

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

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