Сборка обходов на vs2012 (Windows 8.1)

Используя командные инструменты Visual Studio 2012 (т.е. в командной строке командной строки собственных инструментов), я запустил vcvars32.bat и перешел к *c:\program file(x86)\Microsoft Research\ Объездной экспресс 3.0*.

При запуске nmake в этом каталоге он успешно начинает сборку, однако затем завершает работу с ошибкой:

cl /nologo /nologo /Zi /MT /Gm- /W4 /WX /Od /DDETOURS_BITS=32 /I..\..\include /Gs /DDETOURS_X86=1 /DDETOURS_32BIT=1 /D_X86_ /DDETOURS_OPTION_BITS=64 /Fdobj.X86\vc.pdb /Foobj.X86\member.obj /c member.cpp

member.cpp
member.cpp(88) : error C2440: 'type cast' : cannot convert from 'void (__thiscall CMember::* )(void)' to 'PBYTE &'
Reason: cannot convert from 'overloaded-function' to 'PBYTE *'
There is no context in which this conversion is possible 

member.cpp(90) : error C2440: 'type cast' : cannot convert from 'void (__thiscall CDetour::* )(void)' to 'PBYTE &'
Reason: cannot convert from 'overloaded-function' to 'PBYTE *'
There is no context in which this conversion is possible

// error repeated member.cpp lines 105, 120, 122.

NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.

Не уверен, как двигаться дальше с этой ошибкой. Я также попытался:

set DETOURS_TARGET_PROCESSOR=X86

а затем "nmake clean", за которым следует новый "nmake" - однако это приводит к той же ошибке.

как указано в заголовке, я собираю vs2012 на компьютере с Windows 8.1 (x64).

Спасибо


person wibble    schedule 06.02.2014    source источник


Ответы (2)


хорошо, поэтому я решил это, поэтому я подумал, что опубликую ответ, если кто-то еще найдет его полезным.

Я сделал это методом проб и ошибок, поэтому я все же хотел бы, чтобы кто-нибудь пришел и объяснил, почему/что это за ошибка, что ее вызвало и т. д.

однако вот изменения, которые я внес, чтобы скомпилировать:

#if (_MSC_VER < 1310)
    pfTarget = CMember::Target;
    pfMine = CDetour::Mine_Target;

    Verify("CMember::Target", *(PBYTE*)&pfTarget);
    Verify("*CDetour::Real_Target", *(&(PBYTE&)CDetour::Real_Target));
    Verify("CDetour::Mine_Target", *(PBYTE*)&pfMine);
#else
    //Verify("CMember::Target", (PBYTE)(&(PBYTE&)CMember::Target));
    //Verify("*CDetour::Real_Target", *(&(PBYTE&)CDetour::Real_Target));
    //Verify("CDetour::Mine_Target", (PBYTE)(&(PBYTE&)CDetour::Mine_Target));

    pfTarget = &CMember::Target;
    pfMine = &CDetour::Mine_Target;

    Verify("CMember::Target", *(PBYTE*)&pfTarget);
    Verify("*CDetour::Real_Target", *(&(PBYTE&)CDetour::Real_Target));
    Verify("CDetour::Mine_Target", *(PBYTE*)&pfMine);
#endif

мои изменения находятся во второй половине оператора else, исходный код закомментирован.

Для каждой ошибки (соответствующие номера строк в исходном вопросе) я прокомментировал то, что там было, скопировал и вставил из первой половины раздела «если», но изменил «pfTarget = CMember::Target;» на «pfTarget = &CMember: :Target;" (на основе инструкций компилятора).

кажется, это две разные проблемы: во-первых, вы выбрали неправильный путь в блоке if/else (_MSC_VER должен быть где-то установлен, а не установлен?), а во-вторых, необходимо изменить CMember::Target на &CMember::Target.

Благодарность

person wibble    schedule 06.02.2014
comment
Мы также можем изменить все #if (_MSC_VER ‹ 1310) на #if (_MSC_VER ‹ 1900) (MSVC 2012 имеет _MSC_VER == 1800) и добавить & в pfTarget = CMember::Target; и т. д., изменив их на такие вещи, как pfTarget = &CMember::Target;. Таким образом, мы изменяем меньше кода. - person Shaohua Li; 09.04.2015

Решение, предоставленное wibble, у меня не сработало, но, поскольку ошибки компилятора возникают только при компиляции образцов (после успешной компиляции MS Detours), ошибки больше не важны, если вы просто хотите использовать библиотеку.

person 0x8BADF00D    schedule 21.12.2014
comment
Я просто ctrl+f выводил каждую строку с member и следующей командой сборки в /samples/Makefile - person Eugene K; 28.03.2015