●●VB6转VS2005,AddressOf取得Funtion或Sub地址的问题●●

Paradise_heida 2006-10-07 03:57:51

VB6的原代码:

API函数的定义:
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

API函数的调用:
lpPrevWndProc = SetWindowLong(lhWnd, GWL_WNDPROC, AddressOf WindowProc)

转到VS2005后,
lpPrevWndProc = SetWindowLong(lhWnd, GWL_WNDPROC, AddressOf WindowProc)
中,AddressOf WindowProc编译错误,因为SetWindowLong的第三个参数是Long型,而AddressOf是个Sub,没有返回值,类型不符。

请问如果解决?或者怎样才能取得WindowProc的地址?
谢谢!!!
...全文
340 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaircat 2006-10-08
  • 打赏
  • 举报
回复
要用委托,不能用AddressOf,因为返回的不是地址,而是一个Token...
Knight94 2006-10-08
  • 打赏
  • 举报
回复
你可以用Delegate试试
Private Delegate Sub WindowProcHandle(...)

<DllImport("user32")> _
Private Shared Function SetWindowLong(ByVal hWnd As IntPtr, _
ByVal nIndex As Integer, _
<MarshalAs(UnmanagedType.FunctionPtr)> ByVal FunAddr As WindowProcHandle) As Integer
End Function

调用时候最后一个参数可以如下形成
Dim FunAddr As New WindowProcHandle( AddressOf WindowProc)
Paradise_heida 2006-10-08
  • 打赏
  • 举报
回复

完全可以了!
谢谢Knight94(愚翁)的帮助指导!!!
结贴!!!
Knight94 2006-10-08
  • 打赏
  • 举报
回复
yun~

change
Private Delegate Sub WindowProcHandle(...)

with
Private Delegate Function WindowProcHandle(ByVal lhWnd As Integer, ByVal luMsg As Integer, ByVal lwParam As Integer, ByVal llParam As Integer) As Integer
Paradise_heida 2006-10-08
  • 打赏
  • 举报
回复
一个问题是WindowProcHandle与WindowProc没有相同的署名,另一个问题是WindowProcHandle定义的参数不知道应该定义成什么,请赐教!!谢谢!!
Paradise_heida 2006-10-08
  • 打赏
  • 举报
回复

刚刚试过,现在有两个问题:

1,Dim FunAddr As New WindowProcHandle( AddressOf WindowProc)这一句,编译错误信息是WindowProcHandle与WindowProc的署名(signature)不同,

2,Private Delegate Sub WindowProcHandle(...)这一句定义中的参数小弟不知道应该怎么写。

我的WindowProc函数的代码如下:
Public Function WindowProc(ByVal lhWnd As Integer, ByVal luMsg As Integer, ByVal lwParam As Integer, ByVal llParam As Integer) As Integer

'Message确认
If (luMsg = &H7BS) Then

''Message为&H7B
Debug.Print(VB6.TabLayout("Message: " & lhWnd, luMsg, lwParam, llParam))

Else
''Message为&H7B以外

On Error Resume Next

'WindowHandle的判断
If (IsWindow(lhWnd)) Then

'正常
WindowProc = CallWindowProc(colPrevWndProc.Item(CStr(lhWnd)), lhWnd, luMsg, lwParam, llParam)

End If

On Error GoTo 0

End If

End Function
Paradise_heida 2006-10-08
  • 打赏
  • 举报
回复
多谢 Knight94(愚翁) 大哥再次拔刀相助!!!

小弟马上按照你的方法去试试,稍后结贴。
  • 打赏
  • 举报
回复
顶帖才是硬道理
stone_soup 2006-10-07
  • 打赏
  • 举报
回复
UP
Paradise_heida 2006-10-07
  • 打赏
  • 举报
回复
sx_lxh(路漫漫)的两个方法都没有效果。

AddressOf本身是一个过程(Sub),它没有返回值,SetWindowLong定义成什么类型都行不通。

我想,是不是应该找到替代方法,而不是只改动API函数的参数类型。
sx_lxh 2006-10-07
  • 打赏
  • 举报
回复
也试试
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hwnd As Int32, _
ByVal nIndex As Int32, _
ByVal dwNewLong As Int32) As Int32
sx_lxh 2006-10-07
  • 打赏
  • 举报
回复
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hwnd As Int32, _
ByVal nIndex As Int32, _
ByVal dwNewLong As IntPtr) As Int32

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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