none
语法错误 : 缺少“;”(在“{”的前面) RRS feed

  • 问题

  • 我先创建一个头文件,在里面建立一个钩子类,代码如下
    #include <afx.h>
    class AFX_EXT_CLASS CKSHooK : public CObject
    {
           public:
        CKSHooK();
        virtual~CKSHooK();
           public:
        BOOL StartHook(HWND hWnd);
        BOOL StopHook();
    };


    在源程序中,include这个头文件,然后写如下代码出现错误。错误  error C2143: 语法错误 : 缺少“;”(在“{”的前面)
    CKSHook::CKSHook()
    {  【【就是这里的大括号出现的错误,缺少“;”(在“{”的前面)】】
    }
     
    CKSHook::~CKSHook()
    {
          if(glhmouse&&glhkey)
         {
               UnhookWindowsHookEx(glhmouse);
               UnhookWindowsHookEx(glhkey);
          }
    }

    请问为什么啊 谢谢

    2013年5月2日 12:42

答案

  • 问题找到了!

    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM LParam)

    最后缺少一个"}",导致了不匹配

    另外,

    1. 你应该使用MSDN的代码插件添加代码,这样别人阅读你代码的难度会降低;

    2. 还有就是你可以不要将类的实现也一并放在dllmain中,这个是我个人看法;3. 代码中有多处变量的大小写与定义的时候不一致!

    ----------------------------------------------------------------

    以上。


    No music, no way coolchae@gmail.com

    2013年5月27日 2:19

全部回复

  • 是否在头文件使用了#ifdef之类的预编译宏?如果有一定要有#endif

    麻烦把正确答案设为解答。

    2013年5月3日 6:44
    版主
  • 是有的 不过都有#endif  这是系统自动的 我建立的不是空项目 所以系统本身语法错误不太可能

    2013年5月4日 5:06
  • 你是cpp格式的源文件吗?

    Reply, then visible.

    2013年5月8日 6:47
  • 是的 恩 是的
    2013年5月8日 11:29
  • 你的cpp文件首部是怎么写的。。是不是有超前引用了,贴出来看看,直到报错的那一行

    No music, no way coolchae@gmail.com

    2013年5月9日 8:16
  • // dllmain.cpp : 定义 DLL 的初始化例程。
    //

    #include "stdafx.h"
    #include <afxwin.h>
    #include <afxdllx.h>
    #include "KSHook.h"
    #include <winuser.h>

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    #pragma data_seg("mydata")
            HWND glhPrevTarWnd=NULL;
      HWND glhDisplayWnd=NULL;
      HHOOK glhmouse=NULL;
      HHOOK glhkey=NULL;
      HINSTANCE glhinstance=NULL;
    #pragma data_seg()
    static AFX_EXTENSION_MODULE KSHookDLL = { NULL, NULL };

    extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
     // 如果使用 lpReserved,请将此移除
     UNREFERENCED_PARAMETER(lpReserved);

     if (dwReason == DLL_PROCESS_ATTACH)
     {
      TRACE0("KSHook.DLL 正在初始化!\n");
      
      // 扩展 DLL 一次性初始化
      if (!AfxInitExtensionModule(KSHookDLL, hInstance))
       return 0;

      // 将此 DLL 插入到资源链中
      // 注意: 如果此扩展 DLL 由
      //  MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
      //  而不是由 MFC 应用程序链接到,则需要
      //  将此行从 DllMain 中移除并将其放置在一个
      //  从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
      //  规则 DLL 然后应显式
      //  调用该函数以初始化此扩展 DLL。否则,
      //  CDynLinkLibrary 对象不会附加到
      //  规则 DLL 的资源链,并将导致严重的
      //  问题。

      new CDynLinkLibrary(KSHookDLL);
            glhinstance=hInstance;
     }
     else if (dwReason == DLL_PROCESS_DETACH)
     {
      TRACE0("KSHook.DLL 正在终止!\n");

      // 在调用析构函数之前终止该库
      AfxTermExtensionModule(KSHookDLL);
     }
     return 1;   // 确定
    }
    HWND XYZWindowFromPoint(HWND hwndParent, POINT point, UINT uFlags);


    LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
    {
     LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lparam;
     if(nCode>=0)
     {  
      HWND glhTargetWnd=XYZWindowFromPoint(NULL,pMouseHook->pt,CWP_SKIPINVISIBLE);
      if(glhTargetWnd!=glhPrevTarWnd)
      {
       TCHAR szCaption[100]={0};
       GetWindowText(glhTargetWnd,szCaption,_countof(szCaption));
                if(IsWindow(glhDisplayWnd))
        SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
         glhPrevTarWnd=glhTargetWnd;
      }
     }
     return CallNextHookEx(glhmouse,nCode,wparam,lparam);
    }

    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM LParam)
    {
     char ch=0;
     FILE*f1;
     if( ((DWORD)LParam&0x40000000)&&(HC_ACTION==nCode))
     {
      f1=fopen("key.txt","a++");
       if(wParam<=0x2f||wParam>=0x100)
        ch=0x00;
          
        else
       {
        BYTE ks[256];
        GetKeyboardState(ks);
        WORD w;
        UINT scan=0;
        ToAscii(wParam,scan,ks,&w,0);
        ch=MapVirtualKey(wParam,2);
        ch=char(w);
       }
       return CallNextHookEx(glhkey,nCode,wParam,LParam);
     }

     CKSHook::CKSHook()
     {   【错误提示就在这里】【错误提示就在这里】【错误提示就在这里】【错误提示就在这里】
     }
     
     CKSHook::~CKSHook()
     {
      if(glhmouse&&glhkey)
      {
       UnhookWindowsHookEx(glhmouse);
       UnhookWindowsHookEx(glhkey);
      }
     }
    BOOL CKSHook::StartHook(HWND hWnd)
    {
     BOOL bResult=FALSE;
     glhmouse=SetWindowsHookEx(WH_MOUSE,MouseProc,glhinstance,0);
        glhkey=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);
        if(glhmouse!=NULL&&glhkey!=NULL)
     bResult=TRUE;
     glhDisplayWnd=hWnd;
     return bResult;
    }
    BOOL CKSHook::StopHook()
    {
     BOOL aResult=FALSE;
     BOOL bResult=FALSE;
     if(glhmouse&&glhkey)
     {
      aResult= UnhookWindowsHookEx(glhmouse);
      bResult= UnhookWindowsHookEx(glhkey);
      if(bResult&&aResult)
      {
       glhPrevTarWnd=NULL;
       glhDisplayWnd=NULL;
       glhmouse=NULL;
       glhkey=NULL;
      }
     }
     return bResult;
    }

    HWND XYZWindowFromPoint(HWND hwndParent, POINT point, UINT uFlags)
    {
     if(hwndParent != NULL)
      return ::ChildWindowFromPointEx(hwndParent, point, uFlags);
     RECT rect, rectSearch;
     HWND pWnd, hWnd, hSearchWnd;
     hWnd = ::WindowFromPoint(point);
     if(hWnd != NULL)
     {
      ::GetWindowRect(hWnd, &rect);
      pWnd = ::GetParent(hWnd);
      if(pWnd != NULL)
      {
       hSearchWnd = hWnd;
       do
       {
        hSearchWnd=::GetWindow(hSearchWnd, GW_HWNDNEXT);
        ::GetWindowRect(hSearchWnd, &rectSearch);
        if(::PtInRect(&rectSearch, point) && ::GetParent(hSearchWnd) ==
         pWnd &&::IsWindowVisible(hSearchWnd))
        {
         if(((rectSearch.right-rectSearch.left) * (rectSearch.bottom -
                        rectSearch.top)) <((rect.right - rect.left) * (rect.bottom -
                        rect.top)))
         {
          hWnd = hSearchWnd;
          ::GetWindowRect(hWnd, &rect);
         }
        }
       }
       while(hSearchWnd != NULL);
      }
     }
     return  hWnd;
    }

    2013年5月11日 17:01
  • #include <winuser.h> 
    
    // 改为 
    
    #include <windows.h>



    No music, no way coolchae@gmail.com

    2013年5月13日 1:50
  • #include "KSHook.h"位置是否正确?

    另外KSHook.h中的#ifndef是否重复使用了?


    麻烦把正确答案设为解答。

    2013年5月20日 8:43
    版主
  • 应该就是这个原因,我上面回复的那样。。。

    #include <winuser.h> 
    
    // 改为 
    
    #include <windows.h>


    No music, no way coolchae@gmail.com

    • 已建议为答案 RainL 2013年5月22日 3:33
    2013年5月21日 3:03
  • 改了 还是有那个错误啊 ...
    2013年5月26日 3:00
  • 问题找到了!

    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM LParam)

    最后缺少一个"}",导致了不匹配

    另外,

    1. 你应该使用MSDN的代码插件添加代码,这样别人阅读你代码的难度会降低;

    2. 还有就是你可以不要将类的实现也一并放在dllmain中,这个是我个人看法;3. 代码中有多处变量的大小写与定义的时候不一致!

    ----------------------------------------------------------------

    以上。


    No music, no way coolchae@gmail.com

    2013年5月27日 2:19
  • 非常感谢,就是这个原因。问题已经得到解决。谢谢您!

    2013年5月31日 0:24
  • 不客气~以后注意下非技术的因素,编程习惯等也很重要

    No music, no way coolchae@gmail.com

    2013年5月31日 2:17