Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка сообщений дочернего окна в другом файле 
:(
    Опции темы
Klotilda
Дата 16.3.2015, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.3.2015

Репутация: нет
Всего: нет



Здравствуйте! Пишу программу с использованием Winapi. Мне надо описать Callback функцию дочернего окна в другом файле. Это дочерняя функция создана для работы с Com-портом. Кроме этого у меня есть еще stdafx.h, stdafx.cpp, main.h файлы. Я в них запуталась. помогите, пожалуйста, разобраться

stdafx.cpp
Код

#include <windows.h>
#include <string>

#include <Strsafe.h>

Settings.cpp
#include "main.h"
//#include "main.cpp"

Код

HANDLE hPort=INVALID_HANDLE_VALUE;
int CreatePort(const char* name)
{
    hPort=CreateFile(name, GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);                //для асинхронного режима
    if(hPort==INVALID_HANDLE_VALUE)
    {
        DWORD dwError;
        dwError=GetLastError();
        return dwError;
    }    
    return 0;       
}
BOOL WINAPI ChildWndProc (HWND Childhwnd,UINT ChilduMsg,WPARAM Childwpar,LPARAM Childlpar)
{
    static HWND hComb;
    switch (ChilduMsg)
    {
        case WM_INITDIALOG:
        {
            char COMmas[6], COMnum[3];    //массив для полного названия ком-порта с номером
            hComb=GetDlgItem(Childhwnd,IDC_COMBO11);
            SendMessage (hComb,CB_RESETCONTENT,0,0);
            int count=1;
            SendMessage(hComb,CB_ADDSTRING,0,(LPARAM)"Select COM port");
            for (int i=1;i<99;i++)
            {
                strcpy_s(COMmas,"COM");
                _itoa_s(i,COMnum,10);
                strcat_s(COMmas,COMnum);
                int Res=CreatePort(COMmas);
                if (Res==5)    
                    strcat_s(COMmas,"*");
                if(Res==0 || Res==5)
                {        
                    SendMessage(hComb,CB_ADDSTRING,0,(LPARAM)COMmas);
                    SendMessage(hComb,CB_SETITEMDATA,count,(LPARAM)i);
                    count++;
                    if(Res==0) CloseHandle(hPort);  
                }
            }
            SendMessage(hComb,CB_SETCURSEL,0,0);
            break;
        }
        case WM_CLOSE:
        {
            EndDialog (Childhwnd,LOWORD (Childwpar));
            return TRUE;
        }
        case WM_COMMAND:
        {
            switch(LOWORD(Childwpar))
            {
                case IDC_COMBO11:
                {
                    if(HIWORD(Childwpar)==CBN_SELENDOK) //выбор элемента списка
                    {
                        char COMmas[8], COMnum[3];    
                        int index;
                        char cFindmas[7]="Select";
                        index=SendDlgItemMessage(Childhwnd,IDC_COMBO11,CB_GETCURSEL,0,0);
                        index=SendDlgItemMessage(Childhwnd,IDC_COMBO11,CB_GETITEMDATA,index,0);
                        if (index >0)
                        {
                            int ind=SendMessage(hComb,CB_FINDSTRING,0,(LPARAM)cFindmas);
                            if (ind!=CB_ERR)
                                SendMessage(hComb,CB_DELETESTRING,0,0);
                        }
                        else
                            break;
                        if(hPort!=INVALID_HANDLE_VALUE)
                        {
                            CloseHandle(hPort); hPort = INVALID_HANDLE_VALUE;
                        }
                        strcpy_s(COMmas,"COM");
                        _itoa_s(index,COMnum,10);
                        strcat_s(COMmas,COMnum);
                        if(!CreatePort(COMmas))
                        {   
                            ComPortTimeOut();
                            ComPortSettings(); 
                        }
                    }
                    break;
                }
                case IDC_CLOSE:      
                {
                    EndDialog(Childhwnd,NULL);
                    return TRUE;
                }
            }
        }
        return TRUE;
    }
    return FALSE;
}                                                            
    
main.h
Код

#include "stdafx.h"
#include "resource.h"

int CreatePort(const char*);
bool ComPortTimeOut(void);
bool ComPortSettings(void);
DCB MyDcb;
COMSTAT State;
BOOL WINAPI ChildWndProc (HWND Childhwnd,UINT ChilduMsg,WPARAM Childwpar,LPARAM Childlpar);    


Выдает такие ошибки:
error LNK2005: "struct _COMSTAT State" (?State@@3U_COMSTAT@@A) already defined in main.obj
1>Settings.obj : error LNK2005: "struct _DCB MyDcb" (?MyDcb@@3U_DCB@@A) already defined in main.obj
PM   Вверх
Guinness
Дата 16.3.2015, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



По приведенным Вами огрызкам кода, сложно сказать, что у Вас не так. Но судя по ошибке, Вы где-то намудрили с подключением заголовочных файлов. 
Попробуйте добавить #pragma once в main.h в начале файла. Вообще, возникает вопрос зачем Вы сотворили main.h, он действительно необходим?

Это сообщение отредактировал(а) Guinness - 16.3.2015, 14:17
PM MAIL   Вверх
Klotilda
Дата 16.3.2015, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.3.2015

Репутация: нет
Всего: нет



у меня на работе требуют соблюдения таких правил. #pragma once не помогло
PM   Вверх
Guinness
Дата 16.3.2015, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(Klotilda @  16.3.2015,  15:46 Найти цитируемый пост)
у меня на работе требуют соблюдения таких правил.

Странные правила, ну да ладно. 
Я правильно понимаю, что main.h у Вас добавляется и в main.cpp, и stdafx.cpp? Если так, уберите из stdafx.cpp строчку с добавлением.
PM MAIL   Вверх
xvr
Дата 16.3.2015, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Вот это -
Код

DCB MyDcb;
COMSTAT State;
в *.h файле делать категорически нельзя.
В *.h файле должно быть только
Код

extern DCB MyDcb;
extern COMSTAT State;
а сами переменные (вот эти):
Код

DCB MyDcb;
COMSTAT State;
должны быть в *.cpp файле (в вашем случае в main.cpp)

И еще - файл stdafx.h должен быть подключен через #include первой строкой (не считая коментариев) во всех *.cpp файлах, и больше нигде (т.е. в main.h его быть не должно). Это специальный файл (вместе с stdafx.cpp), через который работает система предкомпилированных заголовков в MS VC.

Добавлено через 1 минуту и 48 секунд
Да, из include'ов в stdafx.cpp должен быть только stdafx.h (в крайнем случае еще могут быть какие то include'ы из стандартной библиотеки, но не в коем случае не include'ы ваших собственных заголовочных файлов)

PM MAIL   Вверх
Klotilda
Дата 17.3.2015, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.3.2015

Репутация: нет
Всего: нет



Благодарю за помощь. Все получилось
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.