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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,241
#1

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

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

В проекте у меня несколько модулей *.cpp* но все модули используют дискрептор приложения *HINSTANCE hInstA* но этот дескриптор только в главном модуле а мне надо что бы эту переменную было видно в втором модуле. Я пробовал объявить в разделе заголовочных файлов *.h* но там тоже чета не получается в чем проблема ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 16:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передать значение? (C++):

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

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

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

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

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

как с помощю ссылки передать с функции значение F - C++
как с помощю ссылки передать с функции значение F (строка21-22) в main на вывод(строка51) вместо X?? #include<iostream> ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:03 #2
extern HINSTANCE hInstA;

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

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

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

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

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

Добавлено через 36 секунд
Цитата Сообщение от John Prick Посмотреть сообщение
или перенеси его в .h-файл, который подключай в модули, где нужно.
так делать очень нехорошо!
1
n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,241
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
novi4ok
551 / 504 / 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;

я ведь предупредил, что это очень нехорошо. тогда такая переменная определяется в каждом модуле, куда ты включаешь этот файл.
1
n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,241
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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
30.07.2012, 17:58 #9
Цитата Сообщение от novi4ok Посмотреть сообщение
так делать очень нехорошо!
Я имел ввиду перенести в .h-файл не само объявление переменной, а extern-объявление.
0
n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,241
30.07.2012, 18:11  [ТС] #10
Цитата Сообщение от John Prick Посмотреть сообщение
Я имел ввиду перенести в .h-файл не само объявление переменной, а extern-объявление.
это как, чета не понял

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

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

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

 Комментарий модератора 
Одна тема - один вопрос. Caps lock off.
0
novi4ok
551 / 504 / 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 в модуле, откуда нужно вызвать. первый вариант предпочтительнее.
1
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 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"
Неужели сразу не понятно было?
1
Avazart
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,672
Записей в блоге: 17
30.07.2012, 20:25 #15
но все модули используют дискрептор приложения *HINSTANCE hInstA* но этот дескриптор только в главном модуле а мне надо что бы эту переменную было видно в втором модуле.
Это говорит о том что у вас, не правильно с проектировано приложение.Читайте про применение глобаных переменных ( или точнее сказать про их не применение )
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 20:25
Привет! Вот еще темы с ответами:

Как передать значение функции класса в другую функцию? - C++
имеется класс class Test { public: int getB() { return B; } void setB(int b) { B = b; } private: ...

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

Как передать значение переменной из функции инт в функцию воид? - C++
Как передать значения а и b из int start(void) в void inputfile(void), чтоб строка 34 и т.д. работала в иной функции? int x, y,...

Как передать значение переменной из одной функции в другую функцию - C++
нужно передать значение sum1 , sum2 , sum3 из каждой функции в главную . помогите , пожалуйста . #include &quot;stdafx.h&quot; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2012, 20:25
Ответ Создать тему
Опции темы

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