Форум программистов, компьютерный форум CyberForum.ru

Динамическое приложение с использованием шаблонов/конфигов - C++

Восстановить пароль Регистрация
 
 
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
29.07.2016, 12:00     Динамическое приложение с использованием шаблонов/конфигов #1
Есть файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    int number;
    std::cin >> number;
 
    if(number == 1)
        // read file First.cfg
    else if(number == 2)
        // read file Two.cfg
    else
        // write error
 
    MYTYPE variable = myData;
    std::cout << variable << std::endl;
    return 0;
}
и есть так называемые конфиг файлы
Цитата Сообщение от First.cfg
MYTYPE = int
myData = 1234567
Цитата Сообщение от Two.cfg
MYTYPE = unsigned char
myData = 15
Как можно организовать данную затею?

з.ы. для полноты картины:
main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <windows.h>
 
int main(int argc, char* argv)
{
    /*
        здесь код для получения нужных значений из конфига
    */
    struct Character {
        TYPE_HEALTH hp;
        TYPE_ARMOUR ap;
        TYPE_MONEY money;
    };
    struct modules { unsigned long health, armour, money, magazine, ammo, gren; };
 
    DWORD offsetsHealth[] = { OFFSETS_HEALTH };
    DWORD offsetsArmour[] = { OFFSETS_ARMOUR };
    DWORD offsetsMoney[] = { OFFSETS_MONEY };
    modules module;
 
    module.health = getModule(MODULE_HEALTH, pId);
    module.armour = getModule(MODULE_ARMOUR, pId);
    module.money = getModule(MODULE_MONEY, pId);
 
    ptr.health = getPointer(module.health, ADR_HEALTH, offsetsHealth, cnt.health);
    ptr.armour = getPointer(module.armour, ADR_ARMOUR, offsetsArmour, cnt.armour);
    ptr.money = getPointer(module.money, ADR_MONEY, offsetsMoney, cnt.money);
 
    /*
        здесь остальной код программы
    */
 
    std::cin.get();
    return 0;
}

gtavc.cfg
Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ //
GAME_PROCESS = "gtavc.exe"
TRAINER_TITLE = "GTA Vice City Trainer +3"

// x86 = 32
// x64 = 64
CPU_BIT = 32
// +++++++++++++++++++++++++++++++ //

// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
TYPE_HEALTH =  int
ADR_HEALTH = 0x00168A4C
MODULE_HEALTH = "Core.dll"
OFFSETS_HEALTH = 0x480

TYPE_ARMOUR = float
ADR_ARMOUR = 0x00168A4C
MODULE_ARMOUR = "Core.dll"
OFFSETS_ARMOUR = 0x774

TYPE_MONEY float
ADR_MONEY = 0x1498EA2
MODULE_MONEY = "gtavc.exe"
OFFSETS_MONEY = 0x3b4

hl.cfg
Кликните здесь для просмотра всего текста
Код
// +++++++++++++++++++++++++++++++ //
GAME_PROCESS = "hl.exe"
TRAINER_TITLE = "Half-Life Trainer +3"

// x86 = 32
// x64 = 64
CPU_BIT = 32
// +++++++++++++++++++++++++++++++ //

// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
TYPE_HEALTH = unsigned char
ADR_HEALTH = 0x00768B4C
MODULE_HEALTH = "hl.exe"
OFFSETS_HEALTH = 0x123

TYPE_ARMOUR = short
ADR_ARMOUR = 0x00668A42
MODULE_ARMOUR = "hl.dll"
OFFSETS_ARMOUR = 0x5a0

TYPE_MONEY = float
ADR_MONEY = 0x2428EA1
MODULE_MONEY = "hl.exe"
OFFSETS_MONEY = 0x3b4


Добавлено через 6 минут
На данный момент использую подключение файла config.h с таким вот содержимым
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#pragma once
#ifndef SETTINGS_H
#define SETTINGS_H
 
 
// +++++++++++++++++++++++++++++++ //
#define GAME_PROCESS "KFGame.exe"
#define TRAINER_TITLE "Killing Floor 2 Trainer +3"
 
// x86 = 32
// x64 = 64
#define CPU_BIT 64
// +++++++++++++++++++++++++++++++ //
 
// 1 byte  = unsigned char
// 2 bytes = short
// 4 bytes = int
// float   = float
#define TYPE_HEALTH int
#define ADR_HEALTH 0x021817C8
#define MODULE_HEALTH "KFGame.exe"
#define OFFSETS_HEALTH 0x714,0x0,0x68,0x460,0x384
 
#define TYPE_ARMOUR unsigned char
#define ADR_ARMOUR 0x021817C8
#define MODULE_ARMOUR "KFGame.exe"
#define OFFSETS_ARMOUR 0x714,0x0,0x68,0x460,0xb40
 
#define TYPE_MONEY float
#define ADR_MONEY 0x021817C8
#define MODULE_MONEY "KFGame.exe"
#define OFFSETS_MONEY 0x714,0x0,0x68,0x254,0x244
 
#endif

Это работает, но:
-Каждый раз нужно менять содержимое этого файла под конкретную игру
-Каждый раз после внесения изменений в этот конфиг нужно снова компилировать приложение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2016, 12:00     Динамическое приложение с использованием шаблонов/конфигов
Посмотрите здесь:

C++ Cоздание итератора с использованием шаблонов
Программирование задачи на двумерные и одномерные массивы с использованием шаблонов C++
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 2
C++ Программирование задачи на двумерные и одномерные массивы с использованием шаблонов 3
Задача с использованием шаблонов классов в С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
31.07.2016, 00:00     Динамическое приложение с использованием шаблонов/конфигов #41
Цитата Сообщение от minore Посмотреть сообщение
и в чем подвох?
В UB подвох.
То, что твой код работает - это до поры до времени.
Просто никто еще не успел занять место, которое было у переменной b, и записать туда что-то другое.
Ты разве сам не видишь, что здесь происходит?

Добавлено через 6 минут
Вот чуть-чуть усложним код, и уже вместо 5 выводится почему-то 0.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <stack>
 
#include <vector>
using namespace std;
struct money
{
    string type;
    void *p;
};
int main()
{
    void * p = NULL;
    
    int a;
    std::cin >> a;
    
    if(a == 2)
    {
        int b = 5;
        p = &b;
    }
    if(a == 3)
    {
        double c = 3.14;
        p = &c;
    }
    cout << *((int*)p) << '\n';
    return 0;
}
В консоли вводим 2:
http://rextester.com/DFX68423
Казалось бы, в чем же подвох?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
31.07.2016, 03:56     Динамическое приложение с использованием шаблонов/конфигов #42
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
все это хранится на стороне сервера), так что есть сомнения в реальной работе твоего чита в сетке
Не сомнения а прямая уверенность что для нормально сделанных игр в которых на серве не экономят работать вообще не будет. По снифу трафа - ты туда нажатые клавиши оно тебе твои координаты. Т.е. что либо подменяя получишь разве что некорректную отрисовку (не соответсвующую тому что в мозгах у сервера) и не более. А по слухам в ближайшее время многое перейдет на еще более веселую схему - ты туда нажатые клавиши оттуда тебе стрим уже отрендеренного видео.
dailydose
10 / 10 / 3
Регистрация: 21.07.2016
Сообщений: 152
31.07.2016, 06:02  [ТС]     Динамическое приложение с использованием шаблонов/конфигов #43
Цитата Сообщение от DrOffset Посмотреть сообщение
Казалось бы, в чем же подвох?
В том, что
C++
1
2
3
4
5
if()
{
     int b = 5;
        p = &b;
}
p указывает на адрес переменной b, но так как после выхода из области видимости if(){} переменная b "удаляется", а p по прежнему указывает на тот адрес где была переменная b, но по ходу программы в этот адрес уже может записаться другое значение, т.к. оно ни кем не занятно. так?

Добавлено через 3 минуты
Цитата Сообщение от main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <stack>
 
#include <vector>
using namespace std;
struct money
{
    string type;
    void *p;
};
int main()
{
    void * p = NULL;
    
    int a;
    std::cin >> a;
    
    if(a == 2)
    {
        int b = 5;
        p = &b;
        cout << *((int*)p) << '\n';
    }
    cout << *((int*)p) << '\n';
    if(a == 3)
    {
        double c = 3.14;
        p = &c;
    }
    cout << *((int*)p) << '\n';
    return 0;
}
Compilation time: 0.62 sec, absolute running time: 0.13 sec, cpu time: 0 sec, memory peak: 3 Mb, absolute service time: 0,77 sec
5
4200608
4200458
DrOffset
6457 / 3831 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
31.07.2016, 11:04     Динамическое приложение с использованием шаблонов/конфигов #44
Цитата Сообщение от dailydose Посмотреть сообщение
так?
Да.
Knuckles124
2 / 2 / 2
Регистрация: 05.07.2016
Сообщений: 11
31.07.2016, 11:12     Динамическое приложение с использованием шаблонов/конфигов #45
http://rextester.com/HRIM32691
Цитата Сообщение от C++
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <string>
 
struct Money
{
    std::string type;
    void *ptr;
 
    float fValue;
    int iValue;
    short sValue;
    unsigned char cValue;
};
 
int main()
{
    Money money;
 
    // Step1: Читаем конфиг, получаем тип переменной
    // (на самом деле вместо std::cin должно быть readConfig(structMoney& money)
    std::cout << "Enter type: float/int/short/byte" << std::endl;
    std::cin >> money.type;
 
    // Step:2 Получили тип, теперь делаем манипуляции, зависящие от типа
    if (money.type == "float")
    {
        money.fValue = 13500.0;
        money.ptr = &money.fValue;
    }
 
    else if (money.type == "int")
    {
        money.iValue = 1234567;
        money.ptr = &money.iValue;
    }
 
    else if (money.type == "short")
    {
        money.sValue = 257;
        money.ptr = &money.sValue;
    }
 
    else if (money.type == "byte")
    {
        money.cValue = 38;
        money.ptr = &money.cValue;
    }
 
    // Step 3: здесь какой-то код ,..,
    /*         Place your code here */
 
    // Step 4: где-то далеко-далеко абсолюнто в другом месте,
    //         возможно даже в другом файле,
    //         уже работаем с нужным значением
    if (money.type == "float")
    {
        std::cout << *(float*)money.ptr << std::endl;
    }
 
    else if (money.type == "int")
    {
        std::cout << *(int*)money.ptr << std::endl;
    }
 
    else if (money.type == "short")
    {
        std::cout << *(short*)money.ptr << std::endl;
    }
 
    else if (money.type == "byte")
    {
        // static_cast просто для вывода.
        // Если выводить char в консоль/на экран,
        // то выведится не его значение,
        // а символ, который соотвествует этому значению
        // ASCII (American Standard Code for Information Interchange)
 
        // Напримеp:
        // число 38 - его символ &
        // число 83 - его символ S
 
        std::cout << static_cast<short>(*(unsigned char*)money.ptr) << std::endl;
        std::cout << *(unsigned char*)money.ptr << std::endl;
    }
    else 
        std::cout << "Конфиг сломан, GG WP" << std::endl;
    
    return 0;
}
Добавлено через 1 минуту
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include "Hero.h"
 
int main()
{
    Hero masterYoda;
 
    masterYoda.addInfo(HERO_INFO_HEALTH);
    masterYoda.addInfo(HERO_INFO_ARMOUR);
    masterYoda.addInfo(HERO_INFO_MONEY);
 
    masterYoda.printInfo();
 
    masterYoda.testTypes();
    
    return 0;
}
Цитата Сообщение от Hero.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#pragma once
#ifndef HERO_H
#define HERO_H
#include <string>
 
enum HERO_INFO { HERO_INFO_HEALTH, HERO_INFO_ARMOUR, HERO_INFO_MONEY };
 
class Hero
{
public:
    Hero();
    ~Hero();
 
    void printInfo();
    void addInfo(HERO_INFO info);
    void testTypes();
 
private:
    struct Health
    {
        std::string type;
        void *ptr;
 
        float fValue;
        int iValue;
        short sValue;
        unsigned char cValue;
    };
    struct Armour
    {
        std::string type;
        void *ptr;
 
        float fValue;
        int iValue;
        short sValue;
        unsigned char cValue;
    };
    struct Money
    {
        std::string type;
        void *ptr;
 
        float fValue;
        int iValue;
        short sValue;
        unsigned char cValue;
    };
 
    Health hp;
    Armour ap;
    Money ma;
 
    template<class S>
    void getValue_(S &structure);
 
    template<class S>
    void putInfo_(S &structure);
};
 
#endif
Цитата Сообщение от Hero.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include "Hero.h"
Hero::Hero() {}
Hero::~Hero() {}
 
void Hero::printInfo()
{
    std::cout << "_out [INFO]" << std::endl;
    std::cout << "You're Health Points: "; getValue_(hp); std::cout << std::endl;
    std::cout << "You're Armour Points: "; getValue_(ap); std::cout << std::endl;
    std::cout << "You're Money  Amount: ";  getValue_(ma); std::cout << std::endl;
}
 
void Hero::addInfo(HERO_INFO info) {
    switch (info)
    {
    case HERO_INFO_HEALTH:
        std::cout << "__in [HEALTH]" << std::endl;
        putInfo_(hp);
        break;
 
    case HERO_INFO_ARMOUR:
        std::cout << "__in [ARMOUR]" << std::endl;
        putInfo_(ap);
        break;
 
    case HERO_INFO_MONEY:
        std::cout << "__in [MONEY]" << std::endl;
        putInfo_(ma);
        break;
    }
}
 
template<class S>
void Hero::getValue_(S &structure)
{
    if (structure.type == "float")
    {
        std::cout << *(float*)structure.ptr;
    }
 
    else if (structure.type == "int")
    {
        std::cout << *(int*)structure.ptr;
    }
 
    else if (structure.type == "short")
    {
        std::cout << *(short*)structure.ptr;
    }
 
    else if (structure.type == "byte")
    {
        std::cout << static_cast<short>(*(unsigned char*)structure.ptr);
        //std::cout << *(unsigned char*)structure.ptr;
    }
    //return -1;
}
 
template<class S>
void Hero::putInfo_(S &structure)
{
    std::cout << "Enter type: float/int/short/byte" << std::endl;
    std::cin >> structure.type;
    std::cout << "Enter value: 13500.0 or 123457 or 12 or etc..." << std::endl;
 
    if (structure.type == "float")
    {
        std::cin >> structure.fValue;
        structure.ptr = &structure.fValue;
    }
 
    else if (structure.type == "int")
    {
        std::cin >> structure.iValue;
        structure.ptr = &structure.iValue;
    }
 
    else if (structure.type == "short")
    {
        std::cin >> structure.sValue;
        structure.ptr = &structure.sValue;
    }
 
    else if (structure.type == "byte")
    {
        // Сначала записываем в shortValue, потом записываем в cValue.
        // Eсли сразу записывать в cValue,
        // То запишется одна первая цифра введеного числа,
        // т.е. вместо ожидаемой записи 238 запишется только 2
        std::cin >> structure.sValue;
        structure.cValue = structure.sValue;
        structure.ptr = &structure.cValue;
    }
    std::cout << std::endl;
}
 
void Hero::testTypes()
{
    std::cout << std::endl;
 
    std::cout << "_out [DEBUG]" << std::endl;
    std::cout << ((hp.type == "int") ? "health is INT" : "health is'nt INT");
    std::cout << std::endl;
 
    std::cout << ((ap.type == "short") ? "armour is short" : "armour is'nt short");
    std::cout << std::endl;
 
    std::cout << ((ma.type == "float") ? "money is float" : "money is'nt float");
    std::cout << std::endl;
 
    Health hz = hp;
    Armour az = ap;
    Money za = ma;
    std::cout << std::endl;
}
Добавлено через 2 минуты
Вывод:
Цитата Сообщение от cmd
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
__in [HEALTH]
Enter type: float/int/short/byte
int
Enter value: 13500.0 or 123457 or 12 or etc...
98
 
__in [ARMOUR]
Enter type: float/int/short/byte
byte
Enter value: 13500.0 or 123457 or 12 or etc...
56
 
__in [MONEY]
Enter type: float/int/short/byte
float
Enter value: 13500.0 or 123457 or 12 or etc...
18500.50
 
_out [INFO]
You're Health Points: 98
You're Armour Points: 56
You're Money  Amount: 18500.5
 
_out [DEBUG]
health is INT
armour is'nt short
money is float
 
Для продолжения нажмите любую клавишу . . .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2016, 11:12     Динамическое приложение с использованием шаблонов/конфигов
Еще ссылки по теме:

C++ Переписать с использованием шаблонов программу поиска заданного слова в файле
Среднее геометрическое с использованием перегруженных функций и шаблонов C++
Структура для хранения массива произвольного типа с использованием шаблонов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
31.07.2016, 11:12     Динамическое приложение с использованием шаблонов/конфигов #46
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Knuckles124, можете выложить свой творение вот здесь:
http://govnokod.ru

там такое любят
Yandex
Объявления
31.07.2016, 11:12     Динамическое приложение с использованием шаблонов/конфигов
Ответ Создать тему
Опции темы

Текущее время: 01:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru