定义 CWnd 与 CRect 的头文件 是哪个? AFXWIN.H ?

amziwei 2004-10-01 08:12:49
用纯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 呀

高手快来救命哦
...全文
2994 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
amziwei 2004-10-01
  • 打赏
  • 举报
回复
http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652

看了!!!

搞得蒙查查~~,
现在我要连的是哪个MFC库?,怎么连?,顺序?
alon21 2004-10-01
  • 打赏
  • 举报
回复
http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652
Kudeet 2004-10-01
  • 打赏
  • 举报
回复
你的这个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
amziwei 2004-10-01
  • 打赏
  • 举报
回复
我把代码贴出来吧,
各位朋友,即是,我怎么才能在 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);
}
//============================================================
amziwei 2004-10-01
  • 打赏
  • 举报
回复
但编译器又来一堆的报错:

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 时候,就会出现上面的错误


simouse 2004-10-01
  • 打赏
  • 举报
回复
你这个是个连接错误,先看明白了
amziwei 2004-10-01
  • 打赏
  • 举报
回复

先谢过 laiyiling(【陌生人 V2.0】)

Afx开头的函数是全局函数,C++不是完全的面向对象语言,所以存在这些函数是不属于任何一个类的,用Afx就是用来区别的。


明了 呵呵~~

先预30分
amziwei 2004-10-01
  • 打赏
  • 举报
回复
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

没有哦!!
Kudeet 2004-10-01
  • 打赏
  • 举报
回复
Afx开头的函数是全局函数,C++不是完全的面向对象语言,所以存在这些函数是不属于任何一个类的,用Afx就是用来区别的。

楼主的错误估计是因为工程连接(动态或静态)了MFC库,MFC库在内部实现了DllMain,在Project/Settings中将关于MFC库的连接去掉即可
可以参考知识库文章
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;148652&Product=vccIN1
amziwei 2004-10-01
  • 打赏
  • 举报
回复
小弟致今还未明白 当一个头文件是以 afx 开头的话 一般作什么用途,或者说会与非 afx 的头文件有什么区别! ~~
MFC类目录及头文件 类 描述 头文件 CAnimateCtrl 自动化通用控件 afxcmn.h CArchive afx.h CArchiveException afx.h CArray afxtempl.h CAsyncMonikerFile 在ActiveX控件中提供对异步标记的支持 afxole.h CAsyncScoket 封装Windows Sockets API,参看CSocket afxsock.h CBitmap afxwin.h CBitmapButton afxext.h CBrush afxwin.h CButton 按钮控件对象 afxwin.h CByteArray afxcoll.h CCachedDataPathProperty 允许一个ActiveX控件异步传输属性数据和缓冲内存中的数据,参考CDataPathProperty afxctl.h CCheckListBox afxwin.h CClientDC afxwin.h CCmdTarget 所有能够接收和响应消息的对象的基类 afxwin.h CCmdUI afxwin.h CColorDialog 颜色选择的通用对话框,提供为显示系统定义的颜色列表 afxdlgs.h CComboBox 组合框对象 afxwin.h CComboBoxEx CComboBox类的派生类,用于支持在组合框控件中的图像列表 afxcmn.h CCommandLineInfo afxwin.h CCommonDialog afxdlgs.h CConnectionPoint afxdisp.h CControlBar afxext.h CCreateContext afxext.h CCriticalSection afxmt.h CCtrlView afxwin.h CDaoDatabase afxdao.h CDaoException afxdao.h CDaoFieldExchange afxdao.h CDaoQueryDef afxdao.h CDaoRecordset 代表选自数据源的记录集。CDaoRecordset对象可用于三种格式:表类型记录集,动态集类型记录集和快照类型记录集 afxdao.h CDaoRecordView 提供表单视图,以在控件中显示数据库记录。表单视图是CDaoRecordset对象的一部分。参考CFormView和CRecordView afxdao.h CDaoTableDef afxdao.h CDaoWorkspace afxdao.h CDatabase afxdb.h CDataExchange afxwin.h CDataPathProperty 实现一个ActiveX控件属性,它能够异步加载其数据。这个类允许ActiveX控件在后台下载属性数据时被激活 afxctl.h CDateTimeCtrl 封装新的日期/时间选取器控件 afxdtctl.h CDBException afxdb.h CDBVariant afxdb.h CDC afxwin.h CDialog 用于包含控件窗口的对话框对象 afxwin.h CDialogBar afxext.h CDocItem afxole.h CDockState afxadv.h CDocObjectServer afxdocob.h CDocObjectServerItem afxdocob.h CDocTemplate afxwin.h CDocument 用于管理程序的数据的类 afxwin.h CDragListBox Windows列表框,允许用户把其中的项拖放到不同的位置 afxcmn.h CDumpContext afx.h CDWordArray afxcoll.h CEdit 用于文本输入的子窗口控件 afxwin.h CEditView 提供Windows编缉控件的功能。因为CEditView派生于Cedit,该对象可同文件和文件模板一同使用 afxext.h CEvent afxmt.h CException afx.h CFieldExchange afxdb.h CFile afx.h CFileDialog 通用文件对话框,提供Open和Save As对话框中的功能 afxdlgs.h CFileException afx.h CFileFind afx.h CFindReplaceDialog afxdlgs.h CFont afxwin.h CFontDialog 通用字体对话框,用于显示当前已装入系统的字体列表 afxdlgs.h CFontHolder afxctl.h CFormView 包含对话框控件的窗口 afxext.h CFrameWnd SDI(单窗口界面)框架窗口 afxwin.h CFtpConnection afxinet.h CFtpFileFind afxinet.h CGdiObject afxwin.h CGopherConnection afxinet.h CGopherFile afxinet.h CGopherFileFind afxinet.h CGopherLocator afxinet.h CHeaderCtrl 标题通用控件 afxcmn.h CHotKeyCtrl 热键通用控件 afxcmn.h CHtmlStream afxisapi.h CHtmlView 实现Web Browser控件的视图类,能够访问当地或Web上的HTML文件。 afxhtml.h CHttpConnection afxinet.h CHttpFile afxinet.h CHttpFilter 创建并处理超文传输协议过滤器对象,该对象用于过滤用于HTTP请求的服务器通知 afxisapi.h CHttpFilterContext afxisapi.h CHttpServer Internet Server API(ISAPI)的包装类 afxisapi.h CHttpServerContext afxisapi.h CImageList afxcmn.h CInternetConnection afxinet.h CInternetException afxinet.h CInternetFile afxinet.h CInternetSession afxinet.h CIPAddressCtrl IP地址控件。类似于编缉框,该控件接收Internet 协议格式的地址 afxcmn.h CList afxtempl.h CListBox 列表框对象 afxwin.h CListCtrl 列表视通用控件 afxcmn.h ClistView 简化CListCtrl的使用,添加了对文件和视图的支持 afxcview.h CLongBinary afxdb_.h CMap afxtempl.h CMapPtrToPtr afxcoll.h CMapPtrToWord afxcoll.h CMapStringToOb afxcoll.h CMapStringToPtr afxcoll.h CMapStringToString afxcoll.h CMapWordToOb afxcoll.h CMapWordToPtr afxcoll.h CMDIChildWnd MDI(多文档界面)子框架窗口 afxwin.h CMDIFrameWnd afxwin.h CMemFile afx.h CMemoryException afx.h CMemoryState CMenu afxwin.h CMetaFileDC afxext.h CMiniFrameWnd 半高的框架窗口,主要用于浮动工具栏。一个小框架窗口没有最小化和最大化按钮,但其他都类似于正常的框架窗口 afxwin.h CMonikerFile afxole.h CMonthCalCtrl 月历控件,用于显示一个用户可选择日期的日历 afxdtctl.h CMultiDocTemplate afxwin.h CMultiLock afxmt.h CMutex afxmt.h CNotSupportedException afx.h CObArray afxcoll.h CObject afx.h CObList afxcoll.h COleBusyDialog afxodlgs.h COleChangeIconDialog afxodlgs.h COleChangeSourceDialog afxodlgs.h COleClientItem afxole.h COleCmdUI afxdocob.h COleControl afxctl.h COleControlModule afxctl.h COleConvertDialog afxodlgs.h COleCurrency afxdisp.h COleDataObject afxole.h COleDataSource afxole.h COleDateTime afxdisp.h COleDateTimeSpan afxdisp.h COleDBRecordView afxoledb.h COleDialog afxodlgs.h COleDispatchDriver afxdisp.h COleDispatchException afxdisp.h COleDocObjectItem afxole.h COleDocument 把一个文件看作为CDocItem对象的一个集合。包容器和服务器都需要这个结构,因为它们的文件必须能够包含OLE项 afxole.h COleDropSource afxole.h COleDropTarget afxole.h COleException afxdisp.h COleInsertDialog afxodlgs.h COleIPFrameWnd afxole.h COleLinkingDoc OLE包容器文件的基类,这些文件支持对它们所包含项的链接 afxole.h COleLinksDialog afxodlgs.h COleMessageFilter afxole.h COleObjectFactory afxdisp.h COlePasteSpecialDialog afxodlgs.h COlePropertiesDialog afxodlgs.h COlePropertyPage afxctl.h COleResizeBar afxole.h COleSafeArray afxdisp.h COleServerDoc OLE服务器文件的基类 afxole.h COleServerItem 为OLE项提供一个服务器界面 afxole.h COleStreamFile afxole.h COleTemplateServer afxdisp.h COleUpdateDialog afxodlgs.h COleVariant afxdisp.h CPageSetupDialog afxdlgs.h CPaintDC afxwin.h CPalette afxwin.h CPen afxwin.h CPictureHolder afxctl.h CPoint atltypes.h CPrintDialog 通用打印对话框,提供Print和Print Setup对话框中的功能 afxdlgs.h CPrintInfo CProgressCtrl 通用进程指示器控件 afxcmn.h CPropertyPage 代表属性表单中的一页 afxdlgs.h CPropertyPageEx CPropertySheet 属性表,也叫做多选项卡对话框。一个属性表由一个CPropertySheet对象和几个CPropertyPage对象组成 afxdlgs.h CPropertySheetEx CPropExchange afxctl.h CPtrArray afxcoll.h CPtrList afxcoll.h CReBar afxext.h CReBarCtrl afxcmn.h CRecentFileList afxadv.h CRecordset 用于访问数据库表或查询的类 afxdb.h CRecordView 包含对话框控件的窗口 afxdb.h CRect atltypes.h CRectTracker afxext.h CResourceException afxwin.h CRgn afxwin.h CRichEditCntrItem afxrich.h CRichEditCtrl 用户能够输入和编缉文本的窗口,提供字符和程序段格式,以及对嵌入OLE项的支持 afxcmn.h CRichEditDoc afxrich.h CRichEditView afxrich.h CRuntimeClass CScrollBar 滚动条对象 afxwin.h CScrollView 可滚动的窗口,派生于CView afxwin.h CSemaphore afxmt.h CSharedFile afxadv.h CSingleDocTemplate afxwin.h CSingleLock afxmt.h CSize atltypes.h CSliderCtrl 提供包含一个滑块和可选的刻度线的窗口 afxcmn.h CSocket Windows Socket API的包装类 afxsock.h CSocketFile afxsock.h CSpinButtonCtrl 提供箭头按钮,用户可单击它,以增加或减少某个控件中的一个值 afxcmn.h CSplitterWnd afxext.h CStatic 用于标识另一个控件或给用户提供消息的简单文本框 afxwin.h CStatusBar afxext.h CStatusBarCtrl 提供一个层次窗口,通常放于父窗口的底部,用于显示关于应用程序的状态信息 afxcmn.h CStdioFile afx.h CString afx.h CStringArray afxcoll.h CStringList afxcoll.h CSyncObject afxmt.h CTabCtrl 允许应用程序在一个窗口或对话框的同一区域显示多个页面 afxcmn.h CTime afx.h CTimeSpan afx.h CToolBar afxext.h CToolBarCtrl 工具栏通用控件 afxcmn.h CToolTipCtrl 提供工具提示控件的功能,它以一个小弹出窗口的样子显示,包含描述某个工具用途的一行文本 afxcmn.h CTreeCtrl 显示项的分层结构列表 afxcmn.h CTreeView 简化CTreeCtrl的用法 afxcview.h CTypedPtrArray afxtempl.h CTypedPtrList afxtempl.h CTypedPtrMap afxtempl.h CUIntArray afxcoll.h CUserException afxwin.h CView 用于显示程序数据的类 afxwin.h CWaitCursor afxwin.h CWinApp afxwin.h CWindowDC afxwin.h CWinThread 代表一个应用程序中的一个线程 afxwin.h CWnd afxwin.h CWordArray afxcoll.h ......

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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