用纯C语言写了一个DLL只加了一个头文件:  
#include"windows.h"当加入下面两句时,
CWnd cwnd;
CRect rect;编译器报错说:  CWnd  CRect 未定义
晕了这两个类是在哪里定义 的?后来我找到在 AFXWIN.H  里有  于是:#include "AFXWIN.H"但编译器又来一堆的报错:nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in GetMessage.obj
nafxcwd.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in GetMessage.obj; second definition ignored
Debug/DGetMessage.dll : fatal error LNK1169: one or more multiply defined symbols found这是怎么回事,偶一定要在 DLL 里用 CWnd 和 CRect  呀高手快来救命哦

解决方案 »

  1.   

    小弟致今还未明白 当一个头文件是以 afx   开头的话 一般作什么用途,或者说会与非 afx 的头文件有什么区别! ~~
      

  2.   

    Afx开头的函数是全局函数,C++不是完全的面向对象语言,所以存在这些函数是不属于任何一个类的,用Afx就是用来区别的。楼主的错误估计是因为工程连接(动态或静态)了MFC库,MFC库在内部实现了DllMain,在Project/Settings中将关于MFC库的连接去掉即可
    可以参考知识库文章
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;148652&Product=vccIN1
      

  3.   

    General:
    Not Using MFC
    Link:
    kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo 没有哦!!
      

  4.   


    先谢过 laiyiling(【陌生人 V2.0】) Afx开头的函数是全局函数,C++不是完全的面向对象语言,所以存在这些函数是不属于任何一个类的,用Afx就是用来区别的。
    明了  呵呵~~先预30分
      

  5.   

    但编译器又来一堆的报错:nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in GetMessage.obj
    nafxcwd.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in GetMessage.obj; second definition ignored
    Debug/DGetMessage.dll : fatal error LNK1169: one or more multiply defined symbols found
    我是说,当
    windows.h  afxwin.h
    两个头文件一起 #include  时候,就会出现上面的错误
      

  6.   

    我把代码贴出来吧,
    各位朋友,即是,我怎么才能在 LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam ) 里面用上 CWnd  和 CRect 类?呵呵,其实把注释掉的内容删除后,可以正确地编译出一个全局鼠标键盘钩子DLL
    不熟悉这方面的朋友,若不嫌弃的话可以参考下的//==========================  xxx.h  =========================
    #define WM_HOOK_KEYDOWN            WM_USER+103
    #define WM_HOOK_LBUTTONDOWN        WM_USER+104
    #define WM_HOOK_RBUTTONDOWN        WM_USER+105#include "windows.h"
    //#include "AFXWIN.H"          //这里HINSTANCE hDllModule;
    #pragma data_seg("hookdata")
    HHOOK hKeyHook=0;
    HHOOK hMouseHook=0;HWND m_h0Main=NULL;
    HWND m_h1DwordDlg=NULL;
    HWND m_h3DlistDlg=NULL;
    HWND m_h4DmenuDlg=NULL;
    HWND m_h5DsettingDlg=NULL;
    int tem=-1;
    #pragma data_seg()#pragma comment(linker,"/SECTION:hookdata,RWS")#define DllExport extern "C"__declspec(dllexport)DllExport int InstallHook(HWND h0Main,     HWND h1DwordDlg, 
      HWND h3DlistDlg, HWND h4DmenuDlg,
      HWND h5DsettingDlg);
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam );
    LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );
    DllExport void EndHook(void);
    //============================================================//==========================  xxx.cpp  =========================
    #include "GetMessage.h"BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
    {
    switch(What)
    {
    case DLL_PROCESS_ATTACH:
    hDllModule = hInstance;
    break;
    case DLL_PROCESS_DETACH:
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break; 

    }
    return 1;
    }DllExport int InstallHook(HWND h0Main,     HWND h1DwordDlg, 
      HWND h3DlistDlg, HWND h4DmenuDlg,
      HWND h5DsettingDlg)
    {
    m_h0Main=h0Main;
    m_h1DwordDlg=h1DwordDlg;
    m_h3DlistDlg=h3DlistDlg;
    m_h4DmenuDlg=h4DmenuDlg;
    m_h5DsettingDlg=h5DsettingDlg;
    hMouseHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hDllModule,0);
    hKeyHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hDllModule,0);
    if(hKeyHook==NULL || hMouseHook==NULL)
    return 0;
    return 1;
    }LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam )
    {
    if(nCode>=0)
    {
    if(wParam==WM_LBUTTONDOWN || wParam==WM_RBUTTONDOWN)
    {
    HWND hTem=NULL;
    hTem=::GetForegroundWindow();
    if(hTem!=m_h0Main && hTem!=m_h1DwordDlg && hTem!=m_h3DlistDlg 
    && hTem!=m_h4DmenuDlg && hTem!=m_h5DsettingDlg)
    {
    if(wParam==WM_LBUTTONDOWN)
    ::PostMessage(m_h0Main,WM_HOOK_LBUTTONDOWN,wParam,lParam); if(wParam==WM_RBUTTONDOWN)
    ::PostMessage(m_h0Main,WM_HOOK_RBUTTONDOWN,wParam,lParam);
    }
    }
    }
    return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
    }
    LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
    {
    if(nCode>=0)
    {
    if((lParam&0xc000ffff)==1) // key down
    {
    HWND hTem=NULL;
    POINT point;
    GetCaretPos(&point);
    /* //这里
    CRect rect; hTem=::GetForegroundWindow(); (CWnd::FromHandle(hTem))->GetCaretPos(&point); ::GetWindowRect(hTem,&rect); point.x+=rect.left;
    point.y+=rect.top;
    */
    if(hTem!=m_h0Main && hTem!=m_h1DwordDlg && hTem!=m_h3DlistDlg
     && hTem!=m_h4DmenuDlg && hTem!=m_h5DsettingDlg) ::PostMessage(m_h0Main,WM_HOOK_KEYDOWN,wParam,MAKELONG(point.x,point.y));
    }
    }
    return CallNextHookEx(hKeyHook,nCode,wParam,lParam);
    }
    DllExport void EndHook(void)
    {
    UnhookWindowsHookEx(hMouseHook);
    UnhookWindowsHookEx(hKeyHook);
    }
    //============================================================
      

  7.   

    你的这个DLL工程是怎么建立的?如果你在new的时候选择的是MFC APPWizard(dll),MFC会默认的给你一个DllMain,然后如果你在定义一个的话,就重复定义了。
    建议new的时候选择Win32 Dynamic-Link Library建立工程后再加入你的代码试试看。
    Project->Setting->C/C++中
    去掉Preprocessor definitions编辑框中的_USRDLL
    参考:
    http://search.csdn.net/Expert/topic/1197/1197165.xml?temp=.8092615如果还没解决,你可以用error lnk2005 dllmain到http://search.csdn.net/search.asp搜索,有很多类似的问题。May you success
      

  8.   

    http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652
      

  9.   

    http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652看了!!!搞得蒙查查~~,
    现在我要连的是哪个MFC库?,怎么连?,顺序?