UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);
这句能不能转化成VB的语句,实现相同的功能呀??请指教。

解决方案 »

  1.   

    public declare function WinExecNextHook lib "函数所在dll文件名"(byval lpCmdLine as string,byval uCmdShow as long) as long其实是引用api
      

  2.   

    不是引用API的,API中根本没有这样一个WinExecNextHook ,不过参数是与WINEXEC函数完全相同,请高手现身说法!!
      

  3.   

    在DELPHI中实现相应功能的代码是这样的:
    var WinExecNextHook : function (cmdLine: pchar; showCmd: dword) : dword; stdcall;
      

  4.   

    你那里不是用vc调用delphi写的dll函数么?
    在vb里就是和引用api方法一样的
      

  5.   

    其实我是想在VB里面用madCHook.dll,里面带有VC和DELPHI的代码。
    完整的VC例子代码如下:
    #include <windows.h>
    #include "madCHook.h"
    UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);
    UINT WINAPI WinExecHookProc(LPCSTR lpCmdLine, UINT uCmdShow)
    {
      if (MessageBox(0, lpCmdLine, "Execute?", MB_YESNO | MB_ICONQUESTION) == IDYES)
        return WinExecNextHook(lpCmdLine, uCmdShow);
      else
        return ERROR_ACCESS_DENIED;
    }
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR     lpCmdLine,
                       int       nCmdShow)
    {
      InitializeMadCHook();
      HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
      WinExec("notepad.exe", SW_SHOWNORMAL);
     UnhookAPI((PVOID*) &WinExecNextHook);
     FinalizeMadCHook();
      return true;
    }
    其中madCHook.dll中的HookAPI函数需要四个参数,前三个都还知道,但第四个就不知道在VB里如何传了!看(PVOID*) &WinExecNextHook这句应该是传的一个指针。但这句  UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);声明就不懂声明的WinExecNextHook是什么了?变量?函数?函数指针?在VB里面应该如何传第四个参数??
    请各位老大指点一二。多谢!!
      

  6.   

    VB 中函数指针用 AddressOf 运算符,参考 MSDN
      

  7.   

    AddressOf 完成不了任务,请高手指点迷津,在VB里面应该如何传第四个参数??PB都可以实现,VB应该也能实现的!
      

  8.   

    正确答案且看一楼.
    --------------------
    public declare function WinExecNextHook lib "函数所在dll文件名"(byval lpCmdLine as string,byval uCmdShow as long) as long其实是引用api
    --------------------
    就是叫你在的VB里写成
    ....lib "madCHook.dll"(byval......
      

  9.   

    可是madCHook.dll里面根本没有这个WinExecNextHook函数。
    我贴出的全部代码,实现的就是当调用WINEXEC函数来调用记事本时就出现个提示,如果点是就调用WinExecNextHook,WinExecNextHook其实执行的就是WINEXEC的功能,但并不是WINEXEC,我试着将 return WinExecNextHook(lpCmdLine, uCmdShow);改成 return WinExec(lpCmdLine, uCmdShow);结果就出循环弹出提示框的情况,从这个试验好像可以看得出来WinExecNextHook其实实现的就是WINEXEC的功能,但又不是WINEXEC,所以我怀疑UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);这句是声明的一个指向WINEXEC函数入口的一个函数指针!不知道我的猜测是不是正确,如果真是函数指针的话,那么在VB里面又如何实现相同的功能呀?请高手指点一二!!多谢!!(顺便说一句AddressOf实现不了通过指针调用函数的功能,所以在这用不上!)
      

  10.   

    1.不能用addressof.因为vb不能通过addressof的返回值调用addressof2.WinExecNextHook却是是madchook.dll里边的函数,可以选用下边试试:
    public declare function WinExecNextHook lib "madCHook.dll"(byval lpCmdLine as string,byval uCmdShow as long) as long
    public declare function WinExecNextHook lib "madCHook.dll"(byref lpCmdLine as string,byref uCmdShow as long) as long   '参数变成了引用
    public declare function WinExecNextHook lib "madCHook.dll"(byref lpCmdLine as any,byref uCmdShow as any) as long   '参数变成了可忽略
      

  11.   

    *WinExecNextHook是一个函数指针,要用它之前都要初始化
    WinExecNextHook pWinExecNextHook =NULL;
    pWinExecNextHook=Get?????Addrss()名字不太记得了,大概是这样写的,你找到类似这行的,再往上找,应该有一句=LoadLibary("xxx.dll"),这就表示WinExecNextHook存在于xxx.dll里
      

  12.   

    1.不能用addressof.因为vb不能通过addressof的返回值调用addressof===================================================================倒....现在我用给你看.....
    addressof获取地址需要曲线救国
    先声明一个函数
    public function GetAddress(byval add as Long)as Long
    GetAddress=add
    end function调用
    dim funcadd as Long
    funcadd=GetAddress(AddressOf 你的函数)
      

  13.   

    所以我怀疑UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);这句是声明的一个指向WINEXEC函数入口的一个函数指针!不用怀疑,这就是函数指针,C++调用外部函数通常都是用这种方法
    你按照我的方法翻译成函数引用声明就可以了
      

  14.   

    “不用怀疑,这就是函数指针,C++调用外部函数通常都是用这种方法
    你按照我的方法翻译成函数引用声明就可以了”
    还是不明白,请老大指点:
    一、“public function GetAddress(byval add as Long)as Long
    GetAddress=add
    end function调用
    dim funcadd as Long
    funcadd=GetAddress(AddressOf 你的函数)”
    打个比方我定义一个了函数:
    public function Sum(add1 as Long,add2 as long)as Long
    sum=add1+add2
    end function
    实现两数相加,那么利用funcadd=GetAddress(AddressOf 你的函数)如何实现函数的传参和调用?
    二、再有“public declare function WinExecNextHook lib "函数所在dll文件名"(byval lpCmdLine as string,byval uCmdShow as long) as long”
    假设WinExecNextHook 是API中的一个函数,(但API中真的没有这样一个函数,madCHook.dll的输出函数中也没有)那么:
    HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
    中的第四个参数(PVOID*) &WinExecNextHook好像是传的是指针,又如何用VB实现,用
    ADDRESSOF WinExecNextHook就会提示“必选参数”,调试不过去!
    三、从 UnhookAPI((PVOID*) &WinExecNextHook);这句取消钩子的语句上来看,((PVOID*) &WinExecNextHook应该是钩子句柄,从钩子程序的原理来讲:取消钩子的语句的参数应该是SetWindowsHookEx函数的返回值呀!可是这句UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);又怎么声明成了函数指针了?
    希望老大们多多指教!!
      

  15.   

    HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
    中的第四个参数(PVOID*) &WinExecNextHook好像是传的是指针,又如何用VB实现,用
    ADDRESSOF WinExecNextHook就会提示“必选参数”,调试不过去!
    =============================================================================
    我的代码就是为了解决这个问题的
    你要获取函数地址(指针)的时候,只要GetAddress(AddressOf WinExecNextHook)即可
      

  16.   

    二、再有“public declare function WinExecNextHook lib "函数所在dll文件名"(byval lpCmdLine as string,byval uCmdShow as long) as long”
    假设WinExecNextHook 是API中的一个函数,(但API中真的没有这样一个函数,madCHook.dll的输出函数中也没有)晕,windows标准api当然没有这个函数,那个声明是用来调用dll里面的输出函数的
    madCHook.dll里面没有这个输出?那这个函数的实现体在哪里?难道在示例代码里么?不大可能吧,你找找WinExecNextHook 的实现在哪里,我觉得他这样声明WinExecNextHook 应该是一个dll的输出函数来的。3.钩子句柄本质上就是一个函数指针
      

  17.   

    多谢VirtualDesktop老大的热情帮助!!可是还是不行!一、“我的代码就是为了解决这个问题的
    你要获取函数地址(指针)的时候,只要GetAddress(AddressOf WinExecNextHook)即可”
    可惜在VB里面只要是用declare 形式声明的函数就不能用ADDRESSOF 操作符了,
    我尝试用hdll = LoadLibrary("madCHook.dll")
    dlladd = GetProcAddress(hdll, "WinExecNextHook")
    来得到函数入口地地址,结果dlladd 为0,也就是说WinExecNextHook根本就不在madCHook.dll中。
    二、“晕,windows标准api当然没有这个函数,那个声明是用来调用dll里面的输出函数的
    madCHook.dll里面没有这个输出?那这个函数的实现体在哪里?难道在示例代码里么?不大可能吧,你找找WinExecNextHook 的实现在哪里,我觉得他这样声明WinExecNextHook 应该是一个dll的输出函数来的。”
    程序中的确是没有实现部分,所以这句我一直搞不懂~!
    不过WinExecNextHook实现的功能反倒正是被拦截的WinExec的功能,只不过是改头换面了,好给程序一个可以维持消息循环的后门,
    可以看回调部分:
    UINT WINAPI WinExecHookProc(LPCSTR lpCmdLine, UINT uCmdShow)
    {
      if (MessageBox(0, lpCmdLine, "Execute?", MB_YESNO | MB_ICONQUESTION) == IDYES)
        return WinExecNextHook(lpCmdLine, uCmdShow);
      else
        return ERROR_ACCESS_DENIED;
    }
    执行了这句return WinExecNextHook(lpCmdLine, uCmdShow);就相当于执行了return WinExec(lpCmdLine, uCmdShow);只是WinExecNextHook不会被拦截,面换成return WinExec(lpCmdLine, uCmdShow);就会陷入一个恶性循环,调用、拦截、调用、拦截……
    还要肯求各位老大们多多帮助!!
      

  18.   

    可惜在VB里面只要是用declare 形式声明的函数就不能用ADDRESSOF 操作符了
    ====================================================================
    这句什么意思究竟有没这个输出,要用vs6自带的小工具Depends查看,那东西在程序菜单-microsoft visual studio 6.0-microsoft visual studio 6.0 tools哪里可以找到
    找到后用他打开你的dll,看输出函数
      

  19.   

    可惜在VB里面只要是用declare 形式声明的函数就不能用ADDRESSOF 操作符了
    ====================================================================
    这句什么意思
    就是说ADDRESSOF 只能取自定义的函数的指针,而不能取别DLL中的的外部函数的指针!
    另外WinExecNextHook真的不在madCHook.dll中,我有他的引出函数表!!
      

  20.   

    你看看C++工程里面的LoadLibrary看看他加载了些什么dll,应该就在那几个dll里面的
      

  21.   

    要外部dll函数指针,看看能用GetProcAddress么
      

  22.   

    #include <windows.h>
    #include "madCHook.h"
    UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);
    UINT WINAPI WinExecHookProc(LPCSTR lpCmdLine, UINT uCmdShow)
    {
      if (MessageBox(0, lpCmdLine, "Execute?", MB_YESNO | MB_ICONQUESTION) == IDYES)
        return WinExecNextHook(lpCmdLine, uCmdShow);
      else
        return ERROR_ACCESS_DENIED;
    }
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR     lpCmdLine,
                       int       nCmdShow)
    {
      InitializeMadCHook();
      HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
      WinExec("notepad.exe", SW_SHOWNORMAL);
     UnhookAPI((PVOID*) &WinExecNextHook);
     FinalizeMadCHook();
      return true;
    }
    这就是完整的VC例子!再没别的语句了!!还请高手指点迷津!
      

  23.   

    “输出函数表怎么获得的??”
    DLL的作者发布DLL里带的!
      

  24.   

    下面是DELPHI的示例代码:
    program ProcessAPI;{$R ..\mad.res}uses Windows, madCodeHook;// variable for the "next hook", which we then call in the callback function
    // it must have *exactly* the same parameters and calling convention as the
    // original function
    // besides, it's also the parameter that you need to undo the code hook again
    var WinExecNextHook : function (cmdLine: pchar; showCmd: dword) : dword; stdcall;// this function is our hook callback function, which will receive
    // all calls to the original WinExec API, as soon as we've hooked it
    // the hook function must have *exactly* the same parameters and calling
    // convention as the original API
    function WinExecHookProc(cmdLine: pchar; showCmd: dword) : dword; stdcall;
    begin
      // check the input parameters and ask whether the call should be executed
      if MessageBox(0, cmdLine, 'Execute?', MB_YESNO or MB_ICONQUESTION) = IDYES then
        // it shall be executed, so let's do it
        result := WinExecNextHook(cmdLine, showCmd)
      else
        // we don't execute the call, but we should at least return a valid value
        result := ERROR_ACCESS_DENIED;
    end;begin
      // we install our hook on the API...
      // please note that in this demo the hook only effects our own process!
      HookAPI('kernel32.dll', 'WinExec', @WinExecHookProc, @WinExecNextHook);
      // now call the original (but hooked) API
      // as a result of the hook the user will receive our messageBox etc
      WinExec('notepad.exe', SW_SHOWNORMAL);
      // we like clean programming, don't we?
      // so we cleanly unhook again
      UnhookAPI(@WinExecNextHook);
    end.
    那么这句
    var WinExecNextHook : function (cmdLine: pchar; showCmd: dword) : dword; stdcall;
    和VC里的:UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);
    功能相同,但在VB里应该怎么写??请指点!
      

  25.   

    #include "madCHook.h"把madCHook.h代码贴上来
      

  26.   

    Declare Function WinExecHookProc Lib "madCHook.dll" Alias "WinExecHookProcA"(byval lpCmdLine as string,byval uCmdShow as integer)
    或者
    Declare Function WinExecHookProc Lib "madCHook.dll" Alias "WinExecHookProcW"(byval lpCmdLine as string,byval uCmdShow as integer)
    WinExecHookProcA或者WinExecHookProcW在madCHook.dll中的真实名字,你那里的函数输出表里应该有吧,没有的话用Depends察看。
      

  27.   

    我觉得上面C程序用的API函数是HookAPI和UnhookAPI两个而已。
    而WinExecHookProc仅仅是用C写的一个回调函数。
    楼主说函数输出表中没有WinExecHookProc是正确的。
    WinExecHookProc是上面Main程序自己写的程序,只不过名字很像一个dll中的函数罢了。
      

  28.   

    #include "madCHook.h"把madCHook.h代码贴上来
    头文件太大了,贴不出来,不过与HOOKAPI相关的我找出来贴到下面了:
    madCHookApi(BOOL) HookAPI(
      LPCSTR pszModule,
      LPCSTR pszFuncName,
      PVOID  pCallbackFunc,
      PVOID  *pNextHook,
      #ifdef __cplusplus
        DWORD  dwFlags = 0
      #else
        DWORD  dwFlags
      #endif
    );
      

  29.   

    各位老大,有没有会HOOKAPI的,直接贴一段代码出来让我等菜鸟学习学习,也不用这样费尽心思捉摸别人的DLL了!!多谢了!
      

  30.   

    #include <windows.h>
    #include "madCHook.h"
    UINT (WINAPI *WinExecNextHook)(LPCSTR lpCmdLine, UINT uCmdShow);//这句是声明指针变量WinExecNextHook
    UINT WINAPI WinExecHookProc(LPCSTR lpCmdLine, UINT uCmdShow)//定义一个新的函数代替回调函数就是代替WinExecNextHook保存的地址处的函数
    {
      if (MessageBox(0, lpCmdLine, "Execute?", MB_YESNO | MB_ICONQUESTION) == IDYES)
        return WinExecNextHook(lpCmdLine, uCmdShow);//如果是调用原来的回调函数
      else
        return ERROR_ACCESS_DENIED;//否返回拒绝访问
    }
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR     lpCmdLine,
                       int       nCmdShow)
    {
      InitializeMadCHook();//初始化钩子
      //用新的回调函数代替原来的,并保存系统原来函数地址
      HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
      WinExec("notepad.exe", SW_SHOWNORMAL);//运行记事本,将会调用新的函数WinExecHookProc
     UnhookAPI((PVOID*) &WinExecNextHook);//该回原来的设置
     FinalizeMadCHook();//钩子释放处理
      return true;//返回系统应该是return 0比较好吧??
    }
      

  31.   

    'WinExecNextHook是一个指针,经过
    'HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
    '之后是WinExecNextHook保存原来的系统回调函数的地址的。其实就是一个变量,在VB中直接声明Long就可以。
    '本来执行打开记事本程序的时候正常启动?
    '现在执行notepad.exe的时候需要经过WinExecHookProc函数询问如果是就使用原来的函数执行?
    '否则返回错误?翻译成VB应该是:  上面的HookAPI和下面的SetWindowLong有相似的功能
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'SetWindowLong类似于本例中的HookAPI
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    '------------下面是对应的VB----------------------
    Dim WinExecNextHook As Long, Ghw As Long
    Public Sub HookAPI(hwnd As Long)
       Ghw = hwnd
       WinExecNextHook = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WinExecHookProc)
    End Sub
    Function WinExecHookProc(ByVal hw As Long, ByVal uMsg As long, ByVal wParam As Long, ByVal lParam As Long) As Long
       If uMsg = 15 Then '需要处理的消息本例中是Execute消息这里15可替换掉
           If MsgBox("Excute?", vbYes) <> vbYes Then WinExecHookProc = 0 '拒绝访问
       End If
       WinExecHookProc = CallWindowProc(WinExecNextHook,hw, uMsg, wParam, lParam)
    End Function
    Sub unHook()
       SetWindowLong gHW, (-4), WinExecNextHook
    End Sub
    '这是程序捕捉有关程序各种的系统消息,对于本例中的Execute消息不知道是否在其中
      

  32.   

    多谢xx22nn() 和VirtualDesktop老大的热心帮助!
    xx22nn() 老大提供的是一段VB子类化的代码,子类不能实现API的拦截吧?好像只能处理窗口本身的消息。
    另外那个开发包的下载地址是:http://www.madshi.net/,就下载madCollection.exe。
    这个是个比较不错的开发包,能实现好多有用功能,可惜没有系统的帮助文件,E文偶看懂,呵呵!两位老大可以下载看一下,看完后来帮助一下偶这个小菜鸟! 再次感谢!
      

  33.   

    下载看了HookAPI是全部用字符串调用API这样出错的可能性小
    我有VB的这个例子和这个一样
    调用的时候,写上dll名字,调用的函数名字,还有参数直接调用各种API不用声明。
    HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
    上句就是调用kernel32.dll的函数WinExec
    下面是他带来的例子// Example:
    procedure InstallTextOutHooks;
    begin
      CollectHooks;
      HookAPI('gdi32.dll',    'TextOutA',    @TextOutACallbackProc,    @TextOutANextHook);
      HookAPI('gdi32.dll',    'TextOutW',    @TextOutWCallbackProc,    @TextOutWNextHook);
      HookAPI('gdi32.dll', 'ExtTextOutA', @ExtTextOutACallbackProc, @ExtTextOutANextHook);
      HookAPI('gdi32.dll', 'ExtTextOutW', @ExtTextOutWCallbackProc, @ExtTextOutWNextHook);
      FlushHooks;
    end;
      

  34.   

    xx22nn老大举的例子是DELPHI的吧!VB的话该如何传递参数?
      

  35.   

    vb也是这样的
    只有函数不同
    sub InstallTextOutHooks
    '中间一样end sub
      

  36.   

    HookAPI("库名","函数名","参数",...)
      

  37.   

    HookAPI("kernel32.dll", "WinExec", WinExecHookProc, (PVOID*) &WinExecNextHook);
    主要在于函数HookAPI的功能。
    上面这句应该是使用新的函数替换了kernel32.dll中的WinExec函数。
    你看我有VB程序类似于楼主的功能RHExplorer.exe当有程序运行时提示输入1111就可以
    你去下载看看,可以拿来冒充以下呵呵。
    http://download.csdn.net/user/xx22nn
      

  38.   

    多谢各位老大的热心帮助,xx22nn() 老大,能不能用VB写出来个间单的APIHOOK程序,比方说:就HOOK对话框函数:MESSAGEBOX,让偶也学习一下APIHOOK的写法!可以不写全局的APIHOOK,我主要是想看一下编写APIHOOK程序的路子!先谢了!
      

  39.   

    什么全局的hook很多地方就是修改内存。
    比如启动计算机后kernel32.dll调入内存,很多功能就是调用其中的函数。
    比如本例kernel32中的WinExec就是运行程序调用的函数。
    当运行程序时调用WinExec地址假设是0x00ff00bb保存的WinExec的地址
    用任何程序修改0x00ff00bb的地址为用户程序函数地址,这样每当调用kernel32的WinExec函数时
    就变成了调用用户函数。
    VB又不是不能修改内存!当然也就能实现此功能。当然不能随便修改,要用一定的API否则没有权限访问。