用纯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 呀高手快来救命哦
#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 呀高手快来救命哦
解决方案 »
- 请教如何自绘CComboBox控件(本身,内部的Edit,还有右边的下拉按钮 以及 下拉框等)?
- 如何从socket 中取得远程主机名
- 初学ATL开发,虽看过理论书籍,始终不明白一些东东.请教1.ATL如何开发控件,2.求取ATL开发控件实例.复贴有分
- 请问哪里有关于NAT和STUN技术的资料或书籍,电子文档之类?
- ===如何将ocx打包成cab发布===
- 太倒霉了,我今天碰个青蛙
- 如何实现象VC的界面设计器的 拖动控件时跟随鼠标移动的虚线框?
- 怎样得到英文字符的宽度?
- 头大的一个问题:(
- 请教大家,B/S和C/S共用一个SQL SERVER数据库,当B/S操作数据库发生了改变,C/S怎样及时得到消息?
- 请问如何在程序中动态地使控件Combo Box失效
- CString GetPhrase() const { return m_phrase; }
可以参考知识库文章
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;148652&Product=vccIN1
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 没有哦!!
先谢过 laiyiling(【陌生人 V2.0】) Afx开头的函数是全局函数,C++不是完全的面向对象语言,所以存在这些函数是不属于任何一个类的,用Afx就是用来区别的。
明了 呵呵~~先预30分
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 时候,就会出现上面的错误
各位朋友,即是,我怎么才能在 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);
}
//============================================================
建议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
现在我要连的是哪个MFC库?,怎么连?,顺序?