VC常用问题
- VC常见问题
- *.obj : error LNK2019: 无法解析的外部符号 __imp_FindWindow ,该符号在函数 @@YA
- Windows环境下用nmake编译常见问题
- fatal error C1083: 无法打开包括文件:“excpt.h”
- vs2012编译64位Detours(其他vs版本同理)
- vs项目设置选项
- 编译使用了Detours库的项目报错fatal error C1189
VC常见问题
*.obj : error LNK2019: 无法解析的外部符号 __imp_FindWindow ,该符号在函数 @@YA
解决方法1:#pragma comment(lib,"User32.lib")
解决方法2:项目属性、链接器、输入、附加依赖项,填写User32.lib即可。
Windows环境下用nmake编译常见问题
fatal error C1083: 无法打开包括文件:“excpt.h”
在编译Detours4.0的时候,nmake提示错误:
Windows Kits\8.0\include\um\windows.h fatal error C1083: 无法打开包括文件:“excpt.h”,找不到相关头文件。
解决方法1:设置头文件搜索路径(少啥添啥)
该方法最实用,少INCLUDE文件你搜到后,就将该文件所在的目录添加到系统环境变量INCLUDE里面,少LIB文件你就将它的目录添加到系统环境变量LIB里面,少了添啥。
解决方法2(如果头文件不在VC目录下面的话,就以上面的方法1为主):
打开cmd命令控制台,找到vcvars32.bat所在路径,例如:D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
,运行该批处理文件;
或者运行vcvarsall.bat文件:
cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC
vcvarsall.bat
参考链接:
Windows环境下用nmake编译libevent
nmake编译libraw
vs2012编译64位Detours(其他vs版本同理)
1、下载地址
https://github.com/Microsoft/Detours
2、解压后,将system.mak和src目录拷贝到Visual Studio 11目录的VC目录下,并将src目录下的Makefile文件的只读属性去掉,然后打开Makefile文件进行如下修改:
CFLAGS=/nologo /W4 /WX- /we4777 /we4800 /Zi /MT /Gy /Gm- /Zl /Od /DDETOUR_DEBUG=$(DETOURS_DEBUG)
将上述选项中的/WX修改为/WX-,/WX 是警告被视为错误,而 /WX- 是警告不被视为错误。
3、右键以管理员模式运行VS2012 x64 Native Tools Command Prompt:
cd D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC
d:
cd src
nmake
detours.lib生成成功,并会自动将detours.h、detver.h拷贝到D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC
目录中的include目录中,这样就可以在你项目.cpp中直接引用detours.h头文件。
vs项目设置选项
将D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC
目录下编译生成的库目录lib.X64拷贝粘贴到你的项目目录中,并设置你的项目属性:
detours4.0.1x64.lb是我
#include <windows.h>
#include "detours.h"
#include "detoursHookApi.h"
BOOL HookApi(PVOID *oldApi/*要HOOK的地址 变量*/, PVOID newApi/*新的函数地址*/)
{
BOOL br = FALSE;
DetourRestoreAfterWith(); //恢复原来状态
DetourTransactionBegin(); //拦截开始
DetourUpdateThread(GetCurrentThread()); //刷新当前线程
//这里可以连续多次调用DetourAttach,表示HOOK多个函数
//DetourAttach(&(PVOID&)OldCreateMutexA, NewCreateMutexA);
DetourAttach(oldApi, newApi);
//br返回NO_ERROR 表示成功
br=DetourTransactionCommit(); //让拦截生效
if(br == NO_ERROR)
{
br = TRUE;
}
else
{
br = FALSE;
}
return br;
}
BOOL UnHookApi(PVOID *oldApi, PVOID newApi)
{
BOOL br = FALSE;
DetourTransactionBegin(); //拦截开始
DetourUpdateThread(GetCurrentThread()); //刷新当前线程
//这里可以连续多次调用DetourAttach,表示撤销多个函数HOOK
//DetourAttach(&(PVOID&)OldCreateMutexA, NewCreateMutexA);
DetourDetach(oldApi, newApi); //卸载HOOK
//br返回NO_ERROR 表示成功
br=DetourTransactionCommit(); //HOOK生效
if(br == NO_ERROR)
{
br = TRUE;
}
else
{
br = FALSE;
}
return br;
}
编译使用了Detours库的项目报错fatal error C1189
fatal error C1189: #error : Unknown architecture (x86, amd64, ia64, arm, arm64)
在vs中编译使用了Detours库的项目时,报上述错误。
解决方法:
在include "detours.h"之前要先包含windows.h头文件,即:
#include <windows.h>
#include "detours.h"
#include "detoursHookApi.h"