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

Как передать значение? - C++

Восстановить пароль Регистрация
 
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,171
30.07.2012, 16:58     Как передать значение? #1
В проекте у меня несколько модулей *.cpp* но все модули используют дискрептор приложения *HINSTANCE hInstA* но этот дескриптор только в главном модуле а мне надо что бы эту переменную было видно в втором модуле. Я пробовал объявить в разделе заголовочных файлов *.h* но там тоже чета не получается в чем проблема ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 16:58     Как передать значение?
Посмотрите здесь:

C++ Как передать функции значение int?
как с помощю ссылки передать с функции значение F C++
C++ Передать значение переменной из .cpp в .h
Как передать значение переменной из одной функции в другую функцию C++
Как передать значение в шаблонный класс C++
Как передать значение функции класса в другую функцию? C++
Передать значение переменной C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:03     Как передать значение? #2
extern HINSTANCE hInstA;

или запросить динамически там, где надо.
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,171
30.07.2012, 17:12  [ТС]     Как передать значение? #3
Цитата Сообщение от novi4ok Посмотреть сообщение
extern HINSTANCE hInstA;

или запросить динамически там, где надо.
а что значит extern внешне доступная или как ?

Добавлено через 7 минут
не помогает !!! в другом модуле не видно
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
30.07.2012, 17:15     Как передать значение? #4
Цитата Сообщение от n971030 Посмотреть сообщение
а что значит extern внешне доступная или как ?

Добавлено через 7 минут
не помогает !!! в другом модуле не видно
добавляй extern-объявлние во всех модулях, где нужно, или перенеси его в .h-файл, который подключай в модули, где нужно.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:21     Как передать значение? #5
Цитата Сообщение от n971030 Посмотреть сообщение
а что значит extern внешне доступная или как ?

Добавлено через 7 минут
не помогает !!! в другом модуле не видно
она должна быть глобальной в том модуле, где объявлена. выложи строчку где она объявлена в главном модуле +- 20 строчек до и после.

Добавлено через 36 секунд
Цитата Сообщение от John Prick Посмотреть сообщение
или перенеси его в .h-файл, который подключай в модули, где нужно.
так делать очень нехорошо!
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,171
30.07.2012, 17:34  [ТС]     Как передать значение? #6
Цитата Сообщение от novi4ok Посмотреть сообщение
она должна быть глобальной в том модуле, где объявлена.

Добавлено через 36 секунд

так делать очень нехорошо!
так я глобально объявил, у меня каракули компилятор выдает. obj

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
///////////////////////////////////////////////////////////////////////////////////////
// Список подключаемых модулей в проект
///////////////////////////////////////////////////////////////////////////////////////
 
 
#include <Windows.h>
//#include <WinSock.h>
#include "resource.h"
#include <CommCtrl.h>
#pragma comment (lib, "ComCtl32.Lib")
//#pragma comment (lib, "Windows.lib")
 
extern HINSTANCE hInstA;
extern HWND hwnd;
extern int cmdModeA;
//int cmdModeA;
//HWND 
    //hwnd;
 
#define BUTTON_WIDTH 250
#define BUTTON_HIGTH 500
Вот что при компилиции:

1>------ Построение начато: проект: Сервер WIN32API, Конфигурация: Debug Win32 ------
1>Построение начато 30.07.2012 17:25:48.
1>InitializeBuildStatus:
1> Обращение к "Debug\Сервер WIN32API.unsuccessfulbuild".
1>ClCompile:
1> Для всех выходных данных обновления не требуется.
1>ResourceCompile:
1> Для всех выходных данных обновления не требуется.
1>ManifestResourceCompile:
1> Для всех выходных данных обновления не требуется.
1>О Программе.obj : error LNK2005: "struct HWND__ * hwnd" (?hwnd@@3PAUHWND__@@A) уже определен в Главная.obj
1>О Программе.obj : error LNK2005: "int cmdModeA" (?cmdModeA@@3HA) уже определен в Главная.obj
1>О Программе.obj : error LNK2005: "struct HINSTANCE__ * hInstA" (?hInstA@@3PAUHINSTANCE__@@A) уже определен в Главная.obj
1>C:\Users\Павел\Desktop\Сервер WIN32API\Debug\Сервер WIN32API.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.82
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Добавлено через 10 минут
Главная.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
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
145
146
147
148
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Главная форма
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "Модули.h"
 
TCHAR czClassName[] = L"Сервер";
TCHAR czWindowName[] = L"Сервер [version 1.0.0 - 2012]";
 
INT_PTR CALLBACK DIALOG1(HINSTANCE, UINT, WPARAM, LPARAM); 
 
//описание тул бара
//
TBBUTTON tbb[] = {
    {STD_FILENEW, ID_EXIT1, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0,0,0,0}};
 
 
    //инициализация главной формы
    //
    ATOM myRegistryClass(HINSTANCE, int);
    BOOL InitInstance(HINSTANCE hInst, int Mode);
    LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
 
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstance, PCHAR cmdLine, int cmdMode)
    {
        if(hInstance != 0)
        {
            MessageBox(NULL, L"Действие запрещено",
                L"Нельзя запускать более одного экземпляра программы." , MB_OK | MB_ICONSTOP);      
            return 1;
        }
 
        //hInstA = hInst;
        //cmdModeA = cmdMode;
        MSG msg;
 
        myRegistryClass(hInst, cmdMode);    
        InitInstance(hInst, cmdMode);
 
        while (GetMessage(&msg, hwnd, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);      
        }
        void LoadLybrary(void); 
        return 0;
    }
    ATOM myRegistryClass(HINSTANCE hInst, int cmdMode)
    {
        WNDCLASS cw;
 
        cw.cbClsExtra = 0;
        cw.cbWndExtra = 0;
        cw.hbrBackground = (HBRUSH)(COLOR_WINDOW +1);
        cw.hCursor = LoadCursor(NULL, IDC_ARROW);
        cw.hIcon = LoadIcon(NULL, IDI_WINLOGO);
        cw.hInstance = hInst;
        cw.lpfnWndProc = WinProc;
        cw.lpszClassName = czClassName;
        cw.lpszMenuName = (LPCWSTR)(IDR_MENU1);
        cw.style = CS_VREDRAW | CS_HREDRAW;
 
        return RegisterClass(&cw);
    }
    BOOL InitInstance(HINSTANCE hInst, int Mode)
    {
 
        HWND hwnd = CreateWindow(
            czClassName, 
            czWindowName,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 
            0,
            CW_USEDEFAULT,
            0,
            NULL,
            NULL,
            hInst,
            NULL);
 
 
        ShowWindow(hwnd, Mode);
        UpdateWindow(hwnd);
 
        return TRUE;
    }
 
    HWND hwndToolBar,
    hwndStatus;
 
    LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;  
        case WM_CREATE:
            //SetTimer(hwnd, 1, 1000, NULL);
            //KillTimer(hwnd, 1);
 
            hwndToolBar = CreateToolbarEx(
                hwnd,
                WS_CHILD | WS_VISIBLE | CCS_TOP,
                3,
                0,
                HINST_COMMCTRL,
                IDB_STD_SMALL_COLOR,
                tbb,
                1,
                0,
                0,
                0,
                0,
                sizeof(TBBUTTON));
 
            hwndStatus = CreateStatusWindow(
                WS_CHILD | WS_VISIBLE,
                L"",
                hwnd,
                7900);
 
        case WM_COMMAND: 
            {
                int wmId = LOWORD(wParam);
                switch (wmId)
                {
 
                case ID_EXIT1: 
                    {
                        int SELECT = MessageBox(hwnd, 
                            L"Вы действительно хотите завершить работу программы? ВНИМАНИЕ! В случае завершения работы программы, клиенты не смогут подключиться.",
                            L"Завершение работы", MB_YESNO | MB_ICONQUESTION);
                        if (SELECT == IDYES)
                        {
                            PostQuitMessage(0);
                        }
                    }
                    break;
                case ID_HELP1: 
                    //OpenAbout(hInstA, cmdModeA);
                    break;
                }
            }
 
        default: return DefWindowProc(hwnd, message, wParam, lParam); break;
        }
        return 0;
    }
Добавлено через 35 секунд
Модуль.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
///////////////////////////////////////////////////////////////////////////////////////
// Список подключаемых модулей в проект
///////////////////////////////////////////////////////////////////////////////////////
 
 
#include <Windows.h>
//#include <WinSock.h>
#include "resource.h"
#include <CommCtrl.h>
#pragma comment (lib, "ComCtl32.Lib")
 
HINSTANCE hInstA;
HWND hwnd;
int cmdModeA;
//int cmdModeA;
//HWND 
    //hwnd;
 
#define BUTTON_WIDTH 250
#define BUTTON_HIGTH 500
Добавлено через 34 секунды
О Программе.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
//////////////////////////////////////////////////////////////////////////////////////
// Форма о программе ver 1.1 API
//////////////////////////////////////////////////////////////////////////////////////
#include "Модули.h"
 
TCHAR AboutClassName[] = L"AboutClass";
TCHAR AboutCaption[] = L"О Программе";
HWND hwndAbout;
 
 
 
LRESULT CALLBACK AboutWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_DESTROY: 
        PostQuitMessage(0);
        break;
    case WM_CREATE: 
        {
            //кнопка ОК
            HFONT hFont = CreateFont(-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
                0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
                CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                DEFAULT_PITCH | FF_SWISS, L"Tahoma");
 
            HWND hText = CreateWindow(L"BUTTON", L"OK",
                WS_CHILD | WS_VISIBLE | SS_LEFT,
                113+25, 41+25, 50+20, 14+10,
                hwnd, NULL, NULL, NULL);
 
            //Надпись - название программы "Сервер 1.0.0 2012г. API"
            HFONT hFontSTR1 = CreateFont(-11, 0, 0, 0, FW_BOLD, FALSE, FALSE,
                0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
                CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                DEFAULT_PITCH | FF_SWISS, L"Tahoma");
 
            HWND hTextSTR1 = CreateWindow(L"STATIC", L"Сервер 1.0.0 2012г. API.",
                WS_CHILD | WS_VISIBLE | SS_LEFT,
                25, 10, 190, 14,
                hwnd, NULL, NULL, NULL);
 
            SendMessage(hText, WM_SETFONT, (WPARAM)hFont, 0); 
 
            break;
        }
 
    default: return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}
ATOM AboutRegClass(HINSTANCE hInst, int cmdMode)
{
    UnregisterClass(AboutClassName, hInst);
    WNDCLASS wc;
 
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon = LoadIcon(NULL, IDI_INFORMATION);
    wc.hInstance = hInstA;
    wc.lpfnWndProc = AboutWinProc;
    wc.lpszClassName = AboutClassName;
    wc.lpszMenuName = NULL;
    wc.style = CS_VREDRAW | CS_HREDRAW;
 
    ATOM at = RegisterClass(&wc);
    /*if (at == NULL)
    {
        MessageBox(hwnd, L"ERROR", L"MSG USER ERROR", MB_OK);
    }*/
    return at;
}
void AboutInitInstance(HINSTANCE hInst, int Mode)
{
    UnregisterClass(AboutClassName, hInstA);
    hwndAbout = CreateWindow(
        AboutClassName,
        L"О Программе", 
        WS_DLGFRAME | WS_SYSMENU,
        0,  
        0,      
        170+75,
        62+75,
        hwnd, // родитель окна
        NULL,
        hInst,
        NULL);
 
    ShowWindow(hwndAbout, cmdModeA);    
    UpdateWindow(hwndAbout);
 
    return;
}
void OpenAbout(HINSTANCE hInst, int cmdMode)
{
    MSG msg;
    AboutRegClass(hInst, cmdMode);
    AboutInitInstance( hInst, cmdMode);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return;
}
Добавлено через 51 секунду
Цитата Сообщение от novi4ok Посмотреть сообщение
выложи строчку
Выложил
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:38     Как передать значение? #7
убери

C++
1
2
3
HINSTANCE hInstA;
HWND hwnd;
int cmdModeA;
из *.h -> *.cpp,

чтобы вот так Главная.спп выглядела:

C++
1
2
3
4
5
TCHAR czClassName[] = L"Сервер";
TCHAR czWindowName[] = L"Сервер [version 1.0.0 - 2012]";
HINSTANCE hInstA;
HWND hwnd;
int cmdModeA;

я ведь предупредил, что это очень нехорошо. тогда такая переменная определяется в каждом модуле, куда ты включаешь этот файл.
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,171
30.07.2012, 17:56  [ТС]     Как передать значение? #8
Цитата Сообщение от novi4ok Посмотреть сообщение
убери

C++
1
2
3
HINSTANCE hInstA;
HWND hwnd;
int cmdModeA;
из *.h -> *.cpp,

чтобы вот так Главная.спп выглядела:

C++
1
2
3
4
5
TCHAR czClassName[] = L"Сервер";
TCHAR czWindowName[] = L"Сервер [version 1.0.0 - 2012]";
HINSTANCE hInstA;
HWND hwnd;
int cmdModeA;

я ведь предупредил, что это очень нехорошо. тогда такая переменная определяется в каждом модуле, куда ты включаешь этот файл.
правильно?
*.h*
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
///////////////////////////////////////////////////////////////////////////////////////
// Список подключаемых модулей в проект
///////////////////////////////////////////////////////////////////////////////////////
 
 
#include <Windows.h>
//#include <WinSock.h>
#include "resource.h"
#include <CommCtrl.h>
#pragma comment (lib, "ComCtl32.Lib")
 
//HINSTANCE hInstA;
//HWND hwnd;
//int cmdModeA;
//int cmdModeA;
//HWND 
    //hwnd;
 
#define BUTTON_WIDTH 250
#define BUTTON_HIGTH 500
Добавлено через 2 минуты
Цитата Сообщение от novi4ok Посмотреть сообщение
чтобы вот так Главная.спп выглядела:
Все сделал, но! в другом модуле пишет "не объявленный идентификатор hInstA"

Добавлено через 12 минут
Цитата Сообщение от novi4ok Посмотреть сообщение
выложи
а как объявить глобально по двум модулям ?
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
30.07.2012, 17:58     Как передать значение? #9
Цитата Сообщение от novi4ok Посмотреть сообщение
так делать очень нехорошо!
Я имел ввиду перенести в .h-файл не само объявление переменной, а extern-объявление.
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,171
30.07.2012, 18:11  [ТС]     Как передать значение? #10
Цитата Сообщение от John Prick Посмотреть сообщение
Я имел ввиду перенести в .h-файл не само объявление переменной, а extern-объявление.
это как, чета не понял

Добавлено через 7 минут
Цитата Сообщение от John Prick Посмотреть сообщение
файл не
а как?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 18:20     Как передать значение? #11
Цитата Сообщение от n971030 Посмотреть сообщение
се сделал, но! в другом модуле пишет "не объявленный идентификатор hInstA"
значит и туда напиши вверху
extern HINSTNANCE hInstA;

во всех модулях, где он используется
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,171
30.07.2012, 18:29  [ТС]     Как передать значение? #12
Цитата Сообщение от novi4ok Посмотреть сообщение
значит и туда напиши вверху
extern HINSTNANCE hInstA;

во всех модулях, где он используется
ВСЕМ СПАСИБО РАЗОБРАЛСЯ
http://www.c-cpp.ru/books/extern

 Комментарий модератора 
Одна тема - один вопрос. Caps lock off.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 18:35     Как передать значение? #13
Цитата Сообщение от n971030 Посмотреть сообщение
ВСЕМ СПАСИБО РАЗОБРАЛСЯ
http://www.c-cpp.ru/books/extern

НО СЕЙЧАС ДРКГАЯ ПРОБЛЕММА, ФУНКЦИЮ ВЫЗВАТЬ КАКТО НАДО

C++
1
  OpenAbout(hInstA, cmdModeA);
Она у меня определена в другом модуле
как глобальная? если имеется ее declaration в каком-нибудь *.h файле - включить этот файл (#include...), если нет - продублировать ее declaration в модуле, откуда нужно вызвать. первый вариант предпочтительнее.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
30.07.2012, 20:10     Как передать значение? #14
Цитата Сообщение от n971030 Посмотреть сообщение
это как, чета не понял
C++
1
2
// xxx.cpp файл
int abcd;
C++
1
2
// xxx.h файл
extern int abcd;
C++
1
2
// .cpp файлы, где нужна эта переменная
#include "xxx.h"
Неужели сразу не понятно было?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 20:25     Как передать значение?
Еще ссылки по теме:

C++ Как передать указатель функции, чтобы значение переменной изменилось?
C++ Как передать значение из одной функции в другую?
Как передать значение из функции C++
Как передать значение переменной из функции инт в функцию воид? C++
Как передать значение константе? C++

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

Или воспользуйтесь поиском по форуму:
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,768
Записей в блоге: 17
30.07.2012, 20:25     Как передать значение? #15
но все модули используют дискрептор приложения *HINSTANCE hInstA* но этот дескриптор только в главном модуле а мне надо что бы эту переменную было видно в втором модуле.
Это говорит о том что у вас, не правильно с проектировано приложение.Читайте про применение глобаных переменных ( или точнее сказать про их не применение )
Yandex
Объявления
30.07.2012, 20:25     Как передать значение?
Ответ Создать тему
Опции темы

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