Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
183 / 115 / 4
Регистрация: 23.01.2010
Сообщений: 1,319
1

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

30.07.2012, 16:58. Просмотров 858. Ответов 14
Метки нет (Все метки)

В проекте у меня несколько модулей *.cpp* но все модули используют дискрептор приложения *HINSTANCE hInstA* но этот дескриптор только в главном модуле а мне надо что бы эту переменную было видно в втором модуле. Я пробовал объявить в разделе заголовочных файлов *.h* но там тоже чета не получается в чем проблема ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 16:58
Ответы с готовыми решениями:

Как передать значение из функции
Всем доброе время суток! Такой вопрос, у меня есть функция, с неё нужно достать значение и...

Как передать значение константе?
в дев си -все работает, но в визуал ругается на х((((( #include <fstream> #include <iostream> ...

Как передать значение в шаблонный класс
Здравствуйте. Помогите пожалуйста. Я хочу передать два заполненных вектора в класс, но у меня...

Как передать функции значение int?
Пытаюсь передать функции значение int, но не получается. Синтаксически все правильно, но не...

14
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:03 2
extern HINSTANCE hInstA;

или запросить динамически там, где надо.
1
183 / 115 / 4
Регистрация: 23.01.2010
Сообщений: 1,319
30.07.2012, 17:12  [ТС] 3
Цитата Сообщение от novi4ok Посмотреть сообщение
extern HINSTANCE hInstA;

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

Добавлено через 7 минут
не помогает !!! в другом модуле не видно
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
30.07.2012, 17:15 4
Цитата Сообщение от n971030 Посмотреть сообщение
а что значит extern внешне доступная или как ?

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

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

Добавлено через 36 секунд
Цитата Сообщение от John Prick Посмотреть сообщение
или перенеси его в .h-файл, который подключай в модули, где нужно.
так делать очень нехорошо!
1
183 / 115 / 4
Регистрация: 23.01.2010
Сообщений: 1,319
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 Посмотреть сообщение
выложи строчку
Выложил
0
554 / 508 / 25
Регистрация: 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;

я ведь предупредил, что это очень нехорошо. тогда такая переменная определяется в каждом модуле, куда ты включаешь этот файл.
1
183 / 115 / 4
Регистрация: 23.01.2010
Сообщений: 1,319
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 Посмотреть сообщение
выложи
а как объявить глобально по двум модулям ?
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
30.07.2012, 17:58 9
Цитата Сообщение от novi4ok Посмотреть сообщение
так делать очень нехорошо!
Я имел ввиду перенести в .h-файл не само объявление переменной, а extern-объявление.
0
183 / 115 / 4
Регистрация: 23.01.2010
Сообщений: 1,319
30.07.2012, 18:11  [ТС] 10
Цитата Сообщение от John Prick Посмотреть сообщение
Я имел ввиду перенести в .h-файл не само объявление переменной, а extern-объявление.
это как, чета не понял

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

во всех модулях, где он используется
1
183 / 115 / 4
Регистрация: 23.01.2010
Сообщений: 1,319
30.07.2012, 18:29  [ТС] 12
Цитата Сообщение от novi4ok Посмотреть сообщение
значит и туда напиши вверху
extern HINSTNANCE hInstA;

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

 Комментарий модератора 
Одна тема - один вопрос. Caps lock off.
0
554 / 508 / 25
Регистрация: 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 в модуле, откуда нужно вызвать. первый вариант предпочтительнее.
1
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
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"
Неужели сразу не понятно было?
1
Эксперт С++
8303 / 6057 / 602
Регистрация: 10.12.2010
Сообщений: 28,151
Записей в блоге: 26
30.07.2012, 20:25 15
но все модули используют дискрептор приложения *HINSTANCE hInstA* но этот дескриптор только в главном модуле а мне надо что бы эту переменную было видно в втором модуле.
Это говорит о том что у вас, не правильно с проектировано приложение.Читайте про применение глобаных переменных ( или точнее сказать про их не применение )
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2012, 20:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как передать значение во вложенную функцию?
Заранее извиняюсь за такой, вероятно, базовый вопрос. Есть функция ConnectGetHandle (unsigned...

Как передать значение из одной функции в другую?
Как передать значение s из функции main() в функцию poisk()? Как передать значение i из функции...

как с помощю ссылки передать с функции значение F
как с помощю ссылки передать с функции значение F (строка21-22) в main на вывод(строка51) вместо...

Как передать значение переменной из класса в класс?
Здравствуйте. Я бы хотел в этой программе передать значение TOTAL_PSU в другой класс, чтобы...

Как правильно передать подсчитанное значение массива в класс?
в методе ReadData я считываю файл и заношу данные в двумерный массив massiv, инициализирую тоже в...

Как передать аргументу в функции-члене значение переменной
Здравствуйте! Хочу передать в аргументы функции-члена значение переменной, которая имеет...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.