2016-06-12 6 views
0

Я столкнулся с серьезными проблемами, чтобы достичь того, что, по моему мнению, является правильной установкой BeaEngine с визуальной студией. я подведу процесс установки очень быстро: сборки с CMake 3.6 x64, ИСХ -> C:/Users/Ulysse/Документы/beaengine-мастер CmakeLogs: Конфигурирование сделано Генерирование сделано После чего я открыл решение в visual studio и скомпилировано в режиме выпуска для получения файлов .lib и .dll: BeaEngine_stdcall_64.dll и BeaEngine_stdcall_64.lib. Я включил папки include и lib и добавил файл lib в linker-> input-> дополнительные зависимости в моем проекте Visual Studio 2015 x64. Проект представляет собой 32-битное консольное приложение. Я сейчас пытаюсь запустить пример, взятый с сайта BeaEngine, собирает, он работает, но не обеспечивает правильный вывод разобранных инструкции, код здесь:Неправильно разобрать выход (BeaEngine)

int main(void) 
{ 
/* ============================= Init datas */ 
DISASM MyDisasm; 
int nfalse = 0, ntrue = 1; 
int len, i = 0; 
bool Error = nfalse; 

/* ============================= Init the Disasm structure (important !)*/ 
(void)memset(&MyDisasm, 0, sizeof(DISASM)); 

/* ============================= Init EIP */ 
int n; 
_asm 
{ 
    push eax 
    call get_eip 
     jmp out1 
     get_eip : mov eax, [esp] 
     ret 
     out1 : 
    mov n, eax 
     pop eax 
} 
MyDisasm.EIP = n; //0x401000; 

/* ============================= Loop for Disasm */ 
while ((!Error) && (i<100)) { 
    len = Disasm(&MyDisasm); 
    if (len != UNKNOWN_OPCODE) { 
     puts(MyDisasm.CompleteInstr); 
     MyDisasm.EIP = MyDisasm.EIP + len; 
     cout << i << endl; 
     cout << MyDisasm.CompleteInstr << endl; 
     std::printf("%c", MyDisasm.CompleteInstr); 
     i++; 
    } 
    else { 
     Error = true; 
    } 
}; 
Sleep(100000); 
return 0; 
} 

Обратите внимание, что я должен был добавить встроенный ассемблер потому что пример, предоставленный автором BeaEngine, приведет к сбою программы (false EIP, поскольку моя скомпилированная программа никогда не начинается с 0x401000). Теперь, когда я исправил EIP, программа больше не сработала, но помещает отпечатки для печати непечатаемых символов, а добавляемый мной printf всегда показывает тот же символ (который не является ASCII). Провел целый день на этом, я пропустил что-то очевидное?

ответ

0

Хорошо, это заняло у меня целый день, но я нашел проблему. Странно, что консольная победа 32 была успешно скомпилирована с 64-битной версией библиотеки, и половина этой программы не сработала и практически не работала отлично (поскольку она только провалилась при последнем процессе разборки). Я прошел через исходный код проекта, и, наконец, я просто попытался создать каждый сборник. Фактическая проблема заключается в том, что опция stdcall программы cmake gui не была выбрана. Обратите внимание, что первые несколько строк файла CMakeLists.txt являются: проект (BeaEngine) cmake_minimum_required (версия 2.6)

набор (CMAKE_MODULE_PATH "$ {CMAKE_SOURCE_DIR}/CMake")

набор (CMAKE_VERBOSE_MAKEFILE ON)

варианта (optHAS_OPTIMIZED "Turn оптимизаций" OFF) варианта (optHAS_SYMBOLS "Строят с отладочными символами" ON) варианта (optBUILD_64BIT "построить 64 бита исполняемый" OFF) варианта (optBUILD_DLL "построить разделяемые объекты" OFF) option (optBUILD_STDCALL) Построение с использованием stdcall «OFF»

Однако, если вы здесь, пытаясь заставить эту библиотеку работать, убедитесь, что вы используете эти 2 основных варианта при компиляции: DLL-> ON STDCALL -> ON. Затем создайте с помощью msvc, и вам будет хорошо.