首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >已在dllmain.obj中定义

已在dllmain.obj中定义
EN

Stack Overflow用户
提问于 2022-05-21 01:52:13
回答 1查看 127关注 0票数 0

我正在努力清理我的代码,将一些部分移动到.h和.cpp文件中。

问题是,当我试图编译时,我会得到一个“已经定义”的错误。

我知道有几个类似的问题。但是我已经检查过好几次了,我没有看到任何重复的定义,也看不到它的位置以外的任何东西。找不到问题出在哪里。

这是一个dll代码:

代码语言:javascript
运行
复制
#include "pch.h"
#include "includes.h"

DWORD WINAPI HackThread(HMODULE hModule)
{
    //find_main_window(GetCurrentProcessId());
    InitFunctions();

    AllocConsole();
    FILE* f;
    freopen_s(&f, "CONOUT$", "w", stdout);       
    
    // init modules
    std::cout << "moduleBase: " << std::hex << moduleBase << std::endl;
    uintptr_t map = (uintptr_t)((moduleBase + dwMap));    
    std::cout << "map: " << map << std::endl;
    uintptr_t protocolGame = (uintptr_t)((moduleBase + m_protocolGame));
    std::cout << "protocolGame: " << protocolGame << std::endl;

    // offsets
    constexpr ptrdiff_t offset_itemId = 0x2C;
    constexpr ptrdiff_t offset_itemCount = 0x30;    

    // get localplayer
    DWORD LocalPlayerPointer = (DWORD)((moduleBase + dwLocalPlayer));        
    DWORD LocalPlayerAddress = *(DWORD*)LocalPlayerPointer;
    // enable after testing when moving to loop: if (LocalPlayer == 0 || LocalPlayerPointer == 0) continue;
    std::cout << "LocalPlayerPointer: " << LocalPlayerPointer << std::endl;
    std::cout << "LocalPlayerAddress: " << LocalPlayerAddress << std::endl;

    // wait for activate
    while (!GetAsyncKeyState(VK_END))
    {
        Sleep(10);
    }
    //system("cls");

    // read inventory
    for (int i = 0; i <= Const::InventorySlot::LastInventorySlot; i++) {
        DWORD buffer = 0, itemId = 0, itemCount = 0;
        getInventoryItem(LocalPlayerAddress, &buffer, i);
        if (buffer != 0) {
            itemId = *(DWORD*)(buffer + offset_itemId);
            itemCount = *(DWORD*)(buffer + offset_itemCount);
        }
        if (itemId != 0) {
            std::cout << "Item" << i << ": " << std::hex << buffer << std::endl;
            std::cout << "ID: " << std::dec << itemId << " x" << itemCount << std::endl;
        }
    }    

    // get tiles
    TileList tiles;
    getTiles(map, &tiles, 7);
    for (TilePtr tile : tiles) {
        DWORD buffer;
        // getTopCreature
        getTopCreature(tile, &buffer);
        // check if creature isLocalPlayer
        if (buffer != 0 && buffer != LocalPlayerAddress) {
            std::cout << "buffer: " << std::hex << buffer << std::endl;
            // findItemInContainers
            DWORD item = 0;
            uintptr_t itemid = 3198; //hmm
            findItemInContainers(LocalPlayerPointer, &item, itemid, 1);
            if (item != 0) {
                std::cout << "Item " << std::dec << itemid << " found: " << std::hex << item << std::endl;
                std::cout << "(DWORD*)&tile: " << (DWORD*)&tile << std::endl;
                std::cout << "&tile: " << &tile << std::endl;
                std::cout << "*tile: " << *tile << std::endl;
                std::cout << "tile: " << tile << std::endl;
                // shoot
                useWith(LocalPlayerPointer, &item, (DWORD*)&tile, 0); // ERROR IS HERE IN PARAMETER (DWORD*)&tile
                                                                      // the game will try to call [(DWORD*)&tile + 0x20] then break
                break;
            }
            else {
                std::cout << "Item " << itemid << " not found: " << std::dec << itemid << std::endl;
            }
        }            
    }        

    std::cout << "sleeping 3 seconds" << std::endl;
    Sleep(3000);
    std::cout << "ready" << std::endl;

    // wait for activate
    while (!GetAsyncKeyState(VK_END))
    {
        Sleep(10);
    }

    // stop follow
    cancelFollow(LocalPlayerPointer);
    std::cout << "Stopped follow" << std::endl;    

    // sendinput
    /*
    SendMsg(WM_KEYDOWN, VK_F1);
    SendMsg(WM_KEYUP, VK_F1);
    */

    // wait for END then detach
    std::cout << "Press ESC to remove hook" << std::endl;
    while (!GetAsyncKeyState(VK_ESCAPE))
    {
      // aimbot        
        // get target
        DWORD attacking = isAttacking(LocalPlayerPointer);

        // get who is attacking X
        /*DWORD buffer;
        getAttackingCreature(LocalPlayer, &buffer);
        std::cout << "buffer: " << buffer << std::endl;*/                    

      // manatrainer        
        double mana = getMana(LocalPlayerAddress);
        std::cout << "Mana: " << std::dec << mana << std::endl;
        if (mana > MANA_TO_RUNE) {
            talkChannel(LocalPlayerPointer, 1, 0, SPELL_TO_USE);
            Sleep(3000);
            // useItem
            DWORD buffer = 0, itemId = 0, itemCount = 0;
            getInventoryItem(LocalPlayerAddress, &buffer, Const::InventorySlot::InventorySlotAmmo);
            if (buffer != 0) {
                std::cout << "sending useItem()" << std::endl;
                itemId = *(DWORD*)(buffer + offset_itemId);
                itemCount = *(DWORD*)(buffer + offset_itemCount);
                useItem(LocalPlayerPointer, &buffer);
            }
        }         

        Sleep(10);
    }

    fclose(f);
    FreeConsole();
    FreeLibraryAndExitThread(hModule, 0);
    return 0;
}


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)HackThread, hModule, 0, nullptr));
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

长得像这样:

代码语言:javascript
运行
复制
#pragma once
#include <Windows.h>
#include <iostream>
#include "constants.h"
#include <vector>
#include <list>
//#include "stdext/shared_object.h"
//#include "inputs.h"
#include "declarations.h"
#include "functions.h"
#include "offsets.h"

Functions.h

代码语言:javascript
运行
复制
#pragma once
#include "includes.h"

void InitFunctions();

uintptr_t moduleBase;

// getMana
typedef double(__thiscall* _getMana)(DWORD localplayer);
_getMana getMana;
// isAttacking
typedef int(__thiscall* _isAttacking)(DWORD localplayer);
_isAttacking isAttacking;
// getInventoryItem
typedef DWORD(__thiscall* _getInventoryItem)(DWORD localplayer, DWORD* buffer, uintptr_t index);
_getInventoryItem getInventoryItem;
// cancelFollow
typedef DWORD(__thiscall* _cancelFollow)(DWORD localplayer);
_cancelFollow cancelFollow;
// findItemInContainers
typedef DWORD(__thiscall* _findItemInContainers)(DWORD localplayer, DWORD* buffer, uintptr_t id, uintptr_t type);
_findItemInContainers findItemInContainers;
// talkChannel
typedef DWORD(__thiscall* _talkChannel)(DWORD localplayer, uintptr_t mode, uintptr_t channelId, const std::string& message);
_talkChannel talkChannel;
// useWith
typedef void(__thiscall* _useWith)(DWORD localplayer, DWORD* item, DWORD* toThing, uintptr_t subType);
_useWith useWith;
// getAttackingCreature
typedef DWORD(__thiscall* _getAttackingCreature)(DWORD localplayer, DWORD* buffer);
_getAttackingCreature getAttackingCreature;
// useItem    
typedef void(__thiscall* _useItem)(DWORD localplayer, DWORD* item);
_useItem useItem;
// get tiles
typedef void(__thiscall* _getTiles)(DWORD map, TileList* buffer, uintptr_t floor);
_getTiles getTiles;
// getTopCreature
typedef void(__thiscall* _getTopCreature)(TilePtr tile, DWORD* buffer);
_getTopCreature getTopCreature;

和functions.cpp

代码语言:javascript
运行
复制
#include "pch.h"
#include "includes.h"

void InitFunctions(){
    // get base address
    moduleBase = (uintptr_t)GetModuleHandle(L"NewHorizon_DirectX.exe");
    _getMana getMana;
    getMana = (_getMana)(moduleBase + 0x5A830);
    isAttacking = (_isAttacking)(moduleBase + 0x734A0);
    getInventoryItem = (_getInventoryItem)(moduleBase + 0x949C0);
    cancelFollow = (_cancelFollow)(moduleBase + 0x73420);
    findItemInContainers = (_findItemInContainers)(moduleBase + 0x78710);
    talkChannel = (_talkChannel)(moduleBase + 0x79340);
    useWith = (_useWith)(moduleBase + 0x78220);
    getAttackingCreature = (_getAttackingCreature)(moduleBase + 0x93F90);
    useItem = (_useItem)(moduleBase + 0x77E60);
    getTiles = (_getTiles)(moduleBase + 0x142860);
    getTopCreature = (_getTopCreature)(moduleBase + 0x192BC0);
}

当我试图编译时,我会得到以下错误:

代码语言:javascript
运行
复制
Severity    Code    Description Project File    Line    Suppression State
Error   LNK2005 "unsigned int moduleBase" (?moduleBase@@3IA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "double (__thiscall* getMana)(unsigned long)" (?getMana@@3P6ENK@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "int (__thiscall* isAttacking)(unsigned long)" (?isAttacking@@3P6EHK@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* getInventoryItem)(unsigned long,unsigned long *,unsigned int)" (?getInventoryItem@@3P6EKKPAKI@ZA) already defined in dllmain.obj    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* cancelFollow)(unsigned long)" (?cancelFollow@@3P6EKK@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* findItemInContainers)(unsigned long,unsigned long *,unsigned int,unsigned int)" (?findItemInContainers@@3P6EKKPAKII@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* talkChannel)(unsigned long,unsigned int,unsigned int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?talkChannel@@3P6EKKIIABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@ZA) already defined in dllmain.obj   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* useWith)(unsigned long,unsigned long *,unsigned long *,unsigned int)" (?useWith@@3P6EXKPAK0I@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* getAttackingCreature)(unsigned long,unsigned long *)" (?getAttackingCreature@@3P6EKKPAK@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* useItem)(unsigned long,unsigned long *)" (?useItem@@3P6EXKPAK@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* getTiles)(unsigned long,class std::list<unsigned long *,class std::allocator<unsigned long *> > *,unsigned int)" (?getTiles@@3P6EXKPAV?$list@PAKV?$allocator@PAK@std@@@std@@I@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* getTopCreature)(unsigned long *,unsigned long *)" (?getTopCreature@@3P6EXPAK0@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK1169 one or more multiply defined symbols found  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Release\Tibia Internal.dll    1   

如何正确使用.h和.cpp文件来避免此错误?

编辑:( @AleXelton )建议我从functions.cpp中删除#include "includes.h",编译时如下所示:

代码语言:javascript
运行
复制
Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0020   identifier "moduleBase" is undefined    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  5   
Error (active)  E0020   identifier "getMana" is undefined   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  6   
Error (active)  E0020   identifier "_getMana" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  6   
Error (active)  E0020   identifier "isAttacking" is undefined   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  7   
Error (active)  E0020   identifier "_isAttacking" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  7   
Error (active)  E0020   identifier "getInventoryItem" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  8   
Error (active)  E0020   identifier "_getInventoryItem" is undefined Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  8   
Error (active)  E0020   identifier "cancelFollow" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  9   
Error (active)  E0020   identifier "_cancelFollow" is undefined Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  9   
Error (active)  E0020   identifier "findItemInContainers" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  10  
Error (active)  E0020   identifier "_findItemInContainers" is undefined Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  10  
Error (active)  E0020   identifier "talkChannel" is undefined   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  11  
Error (active)  E0020   identifier "_talkChannel" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  11  
Error (active)  E0020   identifier "useWith" is undefined   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  12  
Error (active)  E0020   identifier "_useWith" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  12  
Error (active)  E0020   identifier "getAttackingCreature" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  13  
Error (active)  E0020   identifier "_getAttackingCreature" is undefined Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  13  
Error (active)  E0020   identifier "useItem" is undefined   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  14  
Error (active)  E0020   identifier "_useItem" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  14  
Error (active)  E0020   identifier "getTiles" is undefined  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  15  
Error (active)  E0020   identifier "_getTiles" is undefined Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  15  
Error (active)  E0020   identifier "getTopCreature" is undefined    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  16  
Error (active)  E0020   identifier "_getTopCreature" is undefined   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  16  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  5   
Error   C2065   'getMana': undeclared identifier    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  6   
Error   C2065   '_getMana': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  6   
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  6   
Error   C2065   'isAttacking': undeclared identifier    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  7   
Error   C2065   '_isAttacking': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  7   
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  7   
Error   C2065   'getInventoryItem': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  8   
Error   C2065   '_getInventoryItem': undeclared identifier  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  8   
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  8   
Error   C2065   'cancelFollow': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  9   
Error   C2065   '_cancelFollow': undeclared identifier  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  9   
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  9   
Error   C2065   'findItemInContainers': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  10  
Error   C2065   '_findItemInContainers': undeclared identifier  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  10  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  10  
Error   C2065   'talkChannel': undeclared identifier    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  11  
Error   C2065   '_talkChannel': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  11  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  11  
Error   C2065   'useWith': undeclared identifier    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  12  
Error   C2065   '_useWith': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  12  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  12  
Error   C2065   'getAttackingCreature': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  13  
Error   C2065   '_getAttackingCreature': undeclared identifier  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  13  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  13  
Error   C2065   'useItem': undeclared identifier    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  14  
Error   C2065   '_useItem': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  14  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  14  
Error   C2065   'getTiles': undeclared identifier   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  15  
Error   C2065   '_getTiles': undeclared identifier  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  15  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  15  
Error   C2065   'getTopCreature': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  16  
Error   C2065   '_getTopCreature': undeclared identifier    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  16  
Error   C2065   'moduleBase': undeclared identifier Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.cpp  16  

我添加了#include functions.h,得到了相同的第一个结果:

代码语言:javascript
运行
复制
Severity    Code    Description Project File    Line    Suppression State
Error   LNK1169 one or more multiply defined symbols found  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Release\Tibia Internal.dll    1   
Error   LNK2005 "unsigned int moduleBase" (?moduleBase@@3IA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "double (__thiscall* getMana)(unsigned long)" (?getMana@@3P6ENK@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "int (__thiscall* isAttacking)(unsigned long)" (?isAttacking@@3P6EHK@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* getInventoryItem)(unsigned long,unsigned long *,unsigned int)" (?getInventoryItem@@3P6EKKPAKI@ZA) already defined in dllmain.obj    Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* cancelFollow)(unsigned long)" (?cancelFollow@@3P6EKK@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* findItemInContainers)(unsigned long,unsigned long *,unsigned int,unsigned int)" (?findItemInContainers@@3P6EKKPAKII@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* talkChannel)(unsigned long,unsigned int,unsigned int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?talkChannel@@3P6EKKIIABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@ZA) already defined in dllmain.obj   Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* useWith)(unsigned long,unsigned long *,unsigned long *,unsigned int)" (?useWith@@3P6EXKPAK0I@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "unsigned long (__thiscall* getAttackingCreature)(unsigned long,unsigned long *)" (?getAttackingCreature@@3P6EKKPAK@ZA) already defined in dllmain.obj  Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* useItem)(unsigned long,unsigned long *)" (?useItem@@3P6EXKPAK@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* getTiles)(unsigned long,class std::list<unsigned long *,class std::allocator<unsigned long *> > *,unsigned int)" (?getTiles@@3P6EXKPAV?$list@PAKV?$allocator@PAK@std@@@std@@I@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
Error   LNK2005 "void (__thiscall* getTopCreature)(unsigned long *,unsigned long *)" (?getTopCreature@@3P6EXPAK0@ZA) already defined in dllmain.obj Tibia Internal  C:\Users\Adrian\Documents\cracking\Tibia Internal\Tibia Internal\functions.obj  1   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-21 02:14:50

functions.h声明了一组全局变量。任何包含.cpp (即,通过包含includes.h)的文件都将得到这些变量的自己的副本。因此,当链接器试图将编译后的单元合并到最终的可执行文件中时,就会出现“已经定义”的错误。

如果您的目标是在.cpp文件之间共享这些变量,则需要在functions.h文件中将这些变量声明为extern,然后在functions.cpp中定义实际变量,例如:

Functions.h

代码语言:javascript
运行
复制
#pragma once
#include "includes.h"

void InitFunctions();

extern uintptr_t moduleBase;

// getMana
typedef double(__thiscall* _getMana)(DWORD localplayer);
extern _getMana getMana;
// isAttacking
typedef int(__thiscall* _isAttacking)(DWORD localplayer);
extern _isAttacking isAttacking;
// getInventoryItem
typedef DWORD(__thiscall* _getInventoryItem)(DWORD localplayer, DWORD* buffer, uintptr_t index);
extern _getInventoryItem getInventoryItem;
// cancelFollow
typedef DWORD(__thiscall* _cancelFollow)(DWORD localplayer);
extern _cancelFollow cancelFollow;
// findItemInContainers
typedef DWORD(__thiscall* _findItemInContainers)(DWORD localplayer, DWORD* buffer, uintptr_t id, uintptr_t type);
extern _findItemInContainers findItemInContainers;
// talkChannel
typedef DWORD(__thiscall* _talkChannel)(DWORD localplayer, uintptr_t mode, uintptr_t channelId, const std::string& message);
extern _talkChannel talkChannel;
// useWith
typedef void(__thiscall* _useWith)(DWORD localplayer, DWORD* item, DWORD* toThing, uintptr_t subType);
extern _useWith useWith;
// getAttackingCreature
typedef DWORD(__thiscall* _getAttackingCreature)(DWORD localplayer, DWORD* buffer);
extern _getAttackingCreature getAttackingCreature;
// useItem    
typedef void(__thiscall* _useItem)(DWORD localplayer, DWORD* item);
extern _useItem useItem;
// get tiles
typedef void(__thiscall* _getTiles)(DWORD map, TileList* buffer, uintptr_t floor);
extern _getTiles getTiles;
// getTopCreature
typedef void(__thiscall* _getTopCreature)(TilePtr tile, DWORD* buffer);
extern _getTopCreature getTopCreature;

functions.cpp

代码语言:javascript
运行
复制
#include "pch.h"
#include "functions.h"

uintptr_t moduleBase;
_getMana getMana;
_isAttacking isAttacking;
_getInventoryItem getInventoryItem;
_cancelFollow cancelFollow;
_findItemInContainers findItemInContainers;
_talkChannel talkChannel;
_useWith useWith;
_getAttackingCreature getAttackingCreature;
_useItem useItem;
_getTiles getTiles;
_getTopCreature getTopCreature;

void InitFunctions(){
    // get base address
    moduleBase = (uintptr_t)GetModuleHandle(L"NewHorizon_DirectX.exe");
    getMana = (_getMana)(moduleBase + 0x5A830);
    isAttacking = (_isAttacking)(moduleBase + 0x734A0);
    getInventoryItem = (_getInventoryItem)(moduleBase + 0x949C0);
    cancelFollow = (_cancelFollow)(moduleBase + 0x73420);
    findItemInContainers = (_findItemInContainers)(moduleBase + 0x78710);
    talkChannel = (_talkChannel)(moduleBase + 0x79340);
    useWith = (_useWith)(moduleBase + 0x78220);
    getAttackingCreature = (_getAttackingCreature)(moduleBase + 0x93F90);
    useItem = (_useItem)(moduleBase + 0x77E60);
    getTiles = (_getTiles)(moduleBase + 0x142860);
    getTopCreature = (_getTopCreature)(moduleBase + 0x192BC0);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72326109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档