我在创建dll时,def中这样定义的,哪里错了呢?
我就是想写一个小程序模拟键盘输入方向键的右,在实况足球,NBA live等游戏里面能用.这个钩子哪错了,帮忙看看啊?
ActiveKey.h
#ifndef _KEYDLL_H
#define _KEYDLL_H
class AFX_EXT_CLASS CKeyHook:public CObject
{
public:
CKeyHook();
~CKeyHook();
HHOOK Start();
//安装钩子
BOOL Stop(); //卸载钩子
};
#endif
ActiveKey.cpp
// ActiveKey.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include <afxdllx.h>
#include "ActiveKey.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//Shared data section
#pragma data_seg("sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };
//键盘钩子处理函数。
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if( nCode >= 0 )
{
if( wParam == 'k' )//当按下k键时,激活。
{
//实现代码。
keybd_event(39,1,0,0);
Sleep(1000);
keybd_event(39,1,KEYEVENTF_KEYUP,0);
Sleep(500);
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook()
{
if( glhHook )
Stop();
}
//安装全局钩子。
HHOOK CKeyHook::Start()
{
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。
return glhHook;
}
//卸载全局钩子。
BOOL CKeyHook::Stop()
{
BOOL bResult = TRUE;
if( glhHook )
bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。
return bResult;
}
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
//如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NOtePadHOOK.DLL Initializing!\n");
//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))
return 0;
new CDynLinkLibrary(ActiveKeyDLL);
//把DLL加入动态MFC类库中
glhInstance = hInstance;
//插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NotePadHOOK.DLL Terminating!\n");
//终止这个链接库前调用它
AfxTermExtensionModule(ActiveKeyDLL);
}
return 1;
}
ActiveKey.def
; ActiveKey.def : Declares the module parameters for the DLL.
LIBRARY "ActiveKey"
DESCRIPTION 'ActiveKey Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
SETCTIONS
shareddata READ WRITE SHARED
rebuild all的时候说:
.\ActiveKey.def : warning LNK4017: READ statement not supported for the target platform; ignored
ActiveKey.def : error LNK2001: unresolved external symbol SETCTIONS
ActiveKey.def : error LNK2001: unresolved external symbol shareddata
Debug/ActiveKey.lib : fatal error LNK1120: 2 unresolved externals
LINK : fatal error LNK1141: failure during build of exports file
Error executing link.exe.
ActiveKey.dll - 4 error(s), 1 warning(s)
SECTIONS和sharedata有问题么?
如果我把
SETCTIONS
shareddata READ WRITE SHARED
这两行去掉,就能生成dll和lib文件,为什么加上就错了?
新手,请指教啊.
还有一个重要的弱智问题,如何在VC里面创建一个对话框模式应用程序??
ActiveKey.h
#ifndef _KEYDLL_H
#define _KEYDLL_H
class AFX_EXT_CLASS CKeyHook:public CObject
{
public:
CKeyHook();
~CKeyHook();
HHOOK Start();
//安装钩子
BOOL Stop(); //卸载钩子
};
#endif
ActiveKey.cpp
// ActiveKey.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include <afxdllx.h>
#include "ActiveKey.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//Shared data section
#pragma data_seg("sharedata")
HHOOK glhHook=NULL; //钩子句柄。
HINSTANCE glhInstance=NULL; //DLL实例句柄。
#pragma data_seg()
static AFX_EXTENSION_MODULE ActiveKeyDLL = { NULL, NULL };
//键盘钩子处理函数。
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if( nCode >= 0 )
{
if( wParam == 'k' )//当按下k键时,激活。
{
//实现代码。
keybd_event(39,1,0,0);
Sleep(1000);
keybd_event(39,1,KEYEVENTF_KEYUP,0);
Sleep(500);
}
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
CKeyHook::CKeyHook(){}
CKeyHook::~CKeyHook()
{
if( glhHook )
Stop();
}
//安装全局钩子。
HHOOK CKeyHook::Start()
{
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。
return glhHook;
}
//卸载全局钩子。
BOOL CKeyHook::Stop()
{
BOOL bResult = TRUE;
if( glhHook )
bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。
return bResult;
}
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
//如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NOtePadHOOK.DLL Initializing!\n");
//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))
return 0;
new CDynLinkLibrary(ActiveKeyDLL);
//把DLL加入动态MFC类库中
glhInstance = hInstance;
//插入保存DLL实例句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NotePadHOOK.DLL Terminating!\n");
//终止这个链接库前调用它
AfxTermExtensionModule(ActiveKeyDLL);
}
return 1;
}
ActiveKey.def
; ActiveKey.def : Declares the module parameters for the DLL.
LIBRARY "ActiveKey"
DESCRIPTION 'ActiveKey Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
SETCTIONS
shareddata READ WRITE SHARED
rebuild all的时候说:
.\ActiveKey.def : warning LNK4017: READ statement not supported for the target platform; ignored
ActiveKey.def : error LNK2001: unresolved external symbol SETCTIONS
ActiveKey.def : error LNK2001: unresolved external symbol shareddata
Debug/ActiveKey.lib : fatal error LNK1120: 2 unresolved externals
LINK : fatal error LNK1141: failure during build of exports file
Error executing link.exe.
ActiveKey.dll - 4 error(s), 1 warning(s)
SECTIONS和sharedata有问题么?
如果我把
SETCTIONS
shareddata READ WRITE SHARED
这两行去掉,就能生成dll和lib文件,为什么加上就错了?
新手,请指教啊.
还有一个重要的弱智问题,如何在VC里面创建一个对话框模式应用程序??
...全文
相关推荐
MingW VC 之.a .lib .dll .def 关系
9. **.def 文件**: 定义DLL的导出函数和它们的顺序,对于静态链接很重要。
编写dll采用def文件
DLL文件能够减少内存占用,提高系统效率,同时也方便代码的更新和维护。"编写dll采用def文件"是指在创建DLL时,通过DEF文件来明确导出函数和数据,以便其他程序可以正确地调用这些功能。
BCB由DLL生成LIB及def文件方法
在C++ Builder(BCB)开发环境中,如果你有一个动态链接库(DLL)文件,并希望从中创建对应的库文件(LIB)和定义文件(DEF),以便在其他BCB项目中使用DLL中的函数,这是一个必要的步骤
编写dll不采用def文件
通常,当我们创建DLL时,会使用.def文件来定义导出函数和变量,这是一种传统的方法。然而,现代的C++编译器提供了更灵活的方式编写DLL而不依赖.def文件。
vc2010创建dll好方便
- 在"应用程序设置"对话框中,取消选中"应用程序类型"下的"控制台应用程序",并勾选"动态库(DLL)",点击"完成"。2. **创建DEF文件**: - DEF文件用于定义DLL的导出函数。


进程/线程/DLL
