0 / 0 / 0
Регистрация: 06.08.2015
Сообщений: 2
1

Подключение файлов через extern

08.08.2015, 00:06. Показов 1250. Ответов 5
Метки нет (Все метки)

пишу такую фигню

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
//HH2.cpp
 
 
#include "mouse.h"
 
int main()
{
    HWND hWnd = NULL;
    DWORD dwID = NULL;
    HANDLE hProcess = NULL;
    DWORD TID = NULL;    //идентификатор потока, который создал определяемое окно 
    DWORD dwPID = NULL;  //идентификатор процесса, который создал окно
 
    hWnd = FindWindow(NULL, "shooter");
 
    TID = GetWindowThreadProcessId(hWnd, &dwPID);
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, dwPID);
 
    int value = 1000000;
  //  WriteProcessMemory(hProcess, (void*)0x0045B5A4, &value, sizeof(&value),NULL);
  
  cout<<" - hWnd: "<<hWnd;
  cout<<" - TID: "<<TID;
  cout<<" - hProcess:"<<hProcess<<endl;
  cout<<" - PID:"<<dwPID<<endl;
   int zaderzka=0;
  cin>> zaderzka;
  
  
 
    return 0;
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 //mouse.h
 
//#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
//#include <winuser.h>   //для GetWindowThreadProcessId
 
#pragma comment(lib,"comctl32.lib") 
 
 
using namespace std;
 
HANDLE hStdin; 
DWORD fdwSaveOldMode;
 
VOID ErrorExit(LPSTR);
VOID KeyEventProc(KEY_EVENT_RECORD); 
VOID MouseEventProc(MOUSE_EVENT_RECORD); 
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD); 
int mous(VOID) ;

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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//mouse.cpp
 
#include "mouse.h"
 
int mous(VOID) 
{ 
    DWORD cNumRead, fdwMode, i; 
    INPUT_RECORD irInBuf[128]; 
    int counter=0;
 
    // Get the standard input handle. 
 
    hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    if (hStdin == INVALID_HANDLE_VALUE) 
        ErrorExit("GetStdHandle"); 
 
    // Save the current input mode, to be restored on exit. 
 
    if (! GetConsoleMode(hStdin, &fdwSaveOldMode) ) 
        ErrorExit("GetConsoleMode"); 
 
    // Enable the window and mouse input events. 
 
    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; 
    if (! SetConsoleMode(hStdin, fdwMode) ) 
        ErrorExit("SetConsoleMode"); 
 
    // Loop to read and handle the next 100 input events. 
 
    while (counter++ <= 100) 
    { 
        // Wait for the events. 
 
        if (! ReadConsoleInput( 
                hStdin,      // input buffer handle 
                irInBuf,     // buffer to read into 
                128,         // size of read buffer 
                &cNumRead) ) // number of records read 
            ErrorExit("ReadConsoleInput"); 
 
        // Dispatch the events to the appropriate handler. 
 
        for (i = 0; i < cNumRead; i++) 
        {
            switch(irInBuf[i].EventType) 
            { 
                case KEY_EVENT: // keyboard input 
                    KeyEventProc(irInBuf[i].Event.KeyEvent); 
                    break; 
 
                case MOUSE_EVENT: // mouse input 
                    MouseEventProc(irInBuf[i].Event.MouseEvent); 
                    break; 
 
                case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing 
                    ResizeEventProc( irInBuf[i].Event.WindowBufferSizeEvent ); 
                    break; 
 
                case FOCUS_EVENT:  // disregard focus events 
 
                case MENU_EVENT:   // disregard menu events 
                    break; 
 
                default: 
                    ErrorExit("Unknown event type"); 
                    break; 
            } 
        }
    } 
 
    // Restore input mode on exit.
 
    SetConsoleMode(hStdin, fdwSaveOldMode);
 
    return 0; 
}
 
VOID ErrorExit (LPSTR lpszMessage) 
{ 
    fprintf(stderr, "%s\n", lpszMessage); 
 
    // Restore input mode on exit.
 
    SetConsoleMode(hStdin, fdwSaveOldMode);
 
    ExitProcess(0); 
}
 
VOID KeyEventProc(KEY_EVENT_RECORD ker)
{
    printf("Key event: ");
 
    if(ker.bKeyDown)
        printf("key pressed\n");
    else printf("key released\n");
}
 
VOID MouseEventProc(MOUSE_EVENT_RECORD mer)
{
#ifndef MOUSE_HWHEELED
#define MOUSE_HWHEELED 0x0008
#endif
    printf("Mouse event: ");
    
    switch(mer.dwEventFlags)
    {
        case 0:
 
            if(mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
            {
                printf("left button press \n");
            }
            else if(mer.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
            {
                printf("right button press \n");
            }
            else
            {
                printf("button press\n");
            }
            break;
        case DOUBLE_CLICK:
            printf("double click\n");
            break;
        case MOUSE_HWHEELED:
            printf("horizontal mouse wheel\n");
            break;
        case MOUSE_MOVED:
            printf("mouse moved\n");
            break;
        case MOUSE_WHEELED:
            printf("vertical mouse wheel\n");
            break;
        default:
            printf("unknown\n");
            break;
    }
}
 
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr)
{
    printf("Resize event\n");
    printf("Console screen buffer is %d columns by %d rows.\n", wbsr.dwSize.X, wbsr.dwSize.Y);
}
Ругается как то так

Ошибка 1 error LNK2005: "unsigned long fdwSaveOldMode" (?fdwSaveOldMode@@3KA) уже определен в HH2.obj


Ошибка 2 error LNK2005: "void * hStdin" (?hStdin@@3PAXA) уже определен в HH2.obj


И т.п
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2015, 00:06
Ответы с готовыми решениями:

Использование static переменной через extern
Есть форма, на ней две кнопки. Одна кнопка по нажатию добавляет элементы в класс-массив. Код...

Задать размер динамического массива через переменную, обявленную как extern
Привет народ, скажите, почему не компилирует: #include&quot;stdafx.h&quot; #include&quot;iostream&quot; using...

Необъявленный идентификатор (связь файлов через extern, include)
-Есть файл hfile.h, в котором содержатся определения пары классов, использующиеся во всей...

Подключение двух файлов через require_once
Здравствуйте! столкнулся вот с такой проблемой. Дело в том что сначало для системы авторизации я...

5
Don't worry, be happy
17781 / 10545 / 2036
Регистрация: 27.09.2012
Сообщений: 26,516
Записей в блоге: 1
08.08.2015, 00:08 2
в mouse.h
C++
1
2
extern HANDLE hStdin; 
extern DWORD fdwSaveOldMode;
В одном из cpp
C++
1
2
HANDLE hStdin; 
DWORD fdwSaveOldMode;
0
0 / 0 / 0
Регистрация: 06.08.2015
Сообщений: 2
08.08.2015, 00:23  [ТС] 3
Да... Спасибо!!!

Добавлено через 11 минут
Это замечательно! Хотя действительно странно. Скомпилировалось, хотя в моем понимании стало действительно переопределение.
0
Don't worry, be happy
17781 / 10545 / 2036
Регистрация: 27.09.2012
Сообщений: 26,516
Записей в блоге: 1
08.08.2015, 00:39 4
Цитата Сообщение от Сфр Посмотреть сообщение
Скомпилировалось, хотя в моем понимании стало действительно переопределение.
Объясню как смогу.

Вспомните - #include просто вставляет текст файла.
У Вас есть два .cpp файла, которые компилируются по отдельности. Заголовок mouse.h включается в оба файла, поэтому в каждом cpp файле оказывается определение переменных
C++
1
2
HANDLE hStdin; 
DWORD fdwSaveOldMode;
extern (от external [linkage] - внешняя [линковка]) "говорит" компилятору, - "Хей, парень, определение этих переменных есть в каком-то модуле, просто знай, что такие переменные есть и не ругайся, линкер потом разберется откуда их взять".
то есть теперь в каждый файл из заголовка попадут объявления
C++
1
2
extern HANDLE hStdin; 
extern DWORD fdwSaveOldMode;
компилятор при этом будет молчать, т.к. объявления переменных есть.
Если так и оставить, то компиляция пройдет успешно, но вот линковщик будет сильно ругаться, т.к. объявления есть, а определений этих переменных нет. Поэтому в один из cpp добавляем определения:
C++
1
2
HANDLE hStdin; 
DWORD fdwSaveOldMode;
теперь линкер "видит" определения и молча "подцепит" их
0
0 / 0 / 0
Регистрация: 21.08.2018
Сообщений: 1
15.10.2021, 16:24 5
В примере указанном выше, вовсе необязательно что оставлять в файле mouse.h . Достаточно оттуда исключить и поместить в Mouse.cpp. У меня сработало.
0
фрилансер
4478 / 3985 / 870
Регистрация: 11.10.2019
Сообщений: 10,502
16.10.2021, 14:14 6
Сфр, ещё вариант - оставить всё как в первом посте, только приписать этим переменным слово inline

C++
1
2
inline HANDLE hStdin; 
inline DWORD fdwSaveOldMode;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2021, 14:14
Помогаю со студенческими работами здесь

Подключение к облаку через подключение сетевого диска в проводнике - не работает
Всех приветствую, имеется Windows 7x64 Corporate, хочу подключиться к облакам яндекса и мэйла все...

Подключение к серверу через удалённое подключение к рабочему столу из интернета
Поставил Windows Server 2016 на машину. запустил. Создал пользователей. Разрешил подключение к...

Подключение заголовочных файлов и файлов реализации
Здравствуйте,при создании класса в visual studio руками не компилится проект,при создании через add...

Что означает extern "C" или extern "C++"?
Например такой код, extern &quot;C&quot; void f(); Или C++ вместо C. Что это означает и где это применяется...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru