Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы подключения файлов, ошибки подключения файлов 
V
    Опции темы
wallstreet
Дата 3.7.2012, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый день всем.
Господа, помогите разобраться с вопросами. В моем проекте объявление каждой котегории классов находится в своем .h файле, их реализация в .cpp файле, ну и в главном оконном приложении будут жить объекты этих классов. Так вот вопрос в том как лучше настроить взаимосвязь этих файлов  всех, как их грамотнее сообрать в кучу?

Ну во первых есть у меня ошибка которую не могу понять как решить.
Объявление класса в ConnDecl.h 
Код

#include "stdafx.h"
#include <Windows.h>
#include <WindowsX.h>
#include <Dde.h>
#include <Ddeml.h>

// класс управления соединением
class Connection
{
public:
    Connection();
    ~Connection();
    HCONV On(HINSTANCE hInst,LPCWSTR szService, LPCWSTR szTopic, LPCWSTR szItem);
    void Off();
    BOOL ConnectionStatus() const;
private:
    HWND hwnd;
    HINSTANCE hInst;
    HCONV hConv;
    FARPROC lpDdeProc;
    BOOL Status;
    DWORD idInst;
    HSZ hszService;
    HSZ hszTopic;
    HSZ hszItem;

};

реализация класса в ConnRealization.cpp:
Код

HDDEDATA EXPENTRY DDEClientCallback(WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2);
HCONV Connection::On(HINSTANCE hInst, LPCWSTR szService, LPCWSTR szTopic, LPCWSTR szItem)
{
    Status = FALSE;
    hConv = NULL;

    //Создаем переходник для функции обратного вызова
    lpDdeProc = MakeProcInstance((FARPROC)DDEClientCallback, hInst);
    //Инициализируем DDEML
    if(DdeInitializeW((LPDWORD)&idInst, (PFNCALLBACK)lpDdeProc, APPCMD_CLIENTONLY, 0))
    {
        return NULL;
    }
    else
    {
        //при успешной инициализации создаем идентификаторы строк для сервиса,
        //раздела и элемента данных
        hszService = DdeCreateStringHandle(idInst, szService, CP_WINANSI);
        hszTopic = DdeCreateStringHandle(idInst, szTopic, CP_WINANSI);
        hszItem = DdeCreateStringHandle(idInst, szItem, CP_WINANSI);

        // Устанавливаем канал связи
        hConv = DdeConnect(idInst, hszService, hszTopic, (PCONVCONTEXT)NULL);
        if(hConv)
            Status = TRUE;
    }

    return hConv;
}

А вот и сама ошибка:
Цитата

Error    1    error LNK2019: unresolved external symbol "struct HDDEDATA__ * __stdcall DDEClientCallback(unsigned short,unsigned short,struct HCONV__ *,struct HSZ__ *,struct HSZ__ *,struct HDDEDATA__ *,unsigned long,unsigned long)" (?DDEClientCallback@@YGPAUHDDEDATA__@@GGPAUHCONV__@@PAUHSZ__@@1PAU1@KK@Z) referenced in function "public: struct HCONV__ * __thiscall Connection::On(struct HINSTANCE__ *,wchar_t const *,wchar_t const *,wchar_t const *)" (?On@Connection@@QAEPAUHCONV__@@PAUHINSTANCE__@@PB_W11@Z)    C:\Users\Андрей\Documents\Visual Studio 2010\Projects\R4T\R4T\ConnRealization.obj    R4T
Error    2    error LNK1120: 1 unresolved externals    C:\Users\Андрей\Documents\Visual Studio 2010\Projects\R4T\Debug\R4T.exe    R4T


Ну если судить по переводу с ангельского, то ругается компилятор на неразрешенный внешний символ. Могу предположить что компилятор  не может или не хочет найти такую функцию в dll откуда он экспортируется? Кстати в примере данная функция объявлялась как 
Код

HDDEDATA EXPENTRY _export DDEClientCallback(......)

но если я ее объявляю именно таким образом то выскакивает ошибка:
Цитата

    4    IntelliSense: explicit type is missing ('int' assumed)    c:\users\андрей\documents\visual studio 2010\projects\r4t\r4t\connrealization.cpp    10    27    R4T
Error    3    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    c:\users\андрей\documents\visual studio 2010\projects\r4t\r4t\connrealization.cpp    10    1    R4T
Error    1    error C2146: syntax error : missing ';' before identifier 'DDEClientCallback'    c:\users\андрей\documents\visual studio 2010\projects\r4t\r4t\connrealization.cpp    10    1    R4T

Так же заметил одну примечательную вещь, если описать реализацию не в .cpp а в .h где класс и объявлен, то все компилируется без проблем?!?!?!?!

Во вторых я еще не очень понимаю как лучше поступить с включением в файл реализации моих классов хедеры так, что бы они не повторялись. Тут мнения разошлись, мой учебник меня учит делать так:
Код

#ifndef CONNDECL_HPP
#define CONNDECL_HPP
    // текст моего хедера, кстати
    // не очень понятно с инклудами
    // или без
#endif

в то время как в нете все рекомендуют использовать
Код

#pragma once

хотя в примере используется 
Код

#pragma hdrstop

в  MSDN по прагме информацию нашел, но там столько непонятных мне особенностей что хотелось бы услышать оптимальное для меня решение.
PM MAIL   Вверх
Cheloveck
Дата 3.7.2012, 15:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



По поводу ошибки линкера -- посмотри в своей документации библиотеку, в которой живёт эта функция и подключи её к проекту.


Цитата(wallstreet @  3.7.2012,  14:55 Найти цитируемый пост)
Во вторых я еще не очень понимаю как лучше поступить с включением в файл реализации моих классов хедеры так, что бы они не повторялись. Тут мнения разошлись, мой учебник меня учит делать так:
#ifndef CONNDECL_HPP
#define CONNDECL_HPP
    // текст моего хедера, кстати
    // не очень понятно с инклудами
    // или без
#endif

Это правильный, кроссплатформенный вариант


Цитата(wallstreet @  3.7.2012,  14:55 Найти цитируемый пост)
#pragma once

Это расширение компилятора Visual C++ и работает только с ним.
Цитата(wallstreet @  3.7.2012,  14:55 Найти цитируемый пост)
#pragma hdrstop

А это специфичная прагма Borland C++ Builder

Это сообщение отредактировал(а) Cheloveck - 3.7.2012, 15:52


--------------------
user posted image
PM Jabber   Вверх
wallstreet
Дата 3.7.2012, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Cheloveck @  3.7.2012,  15:52 Найти цитируемый пост)
По поводу ошибки линкера -- посмотри в своей документации библиотеку, в которой живёт эта функция и подключи её к проекту.

Если не секрет где можно найти эту документацию? у меня visual studio 2010.
Поидее это же lib файл должен быть, так?


Это сообщение отредактировал(а) wallstreet - 3.7.2012, 17:40
PM MAIL   Вверх
Cheloveck
Дата 3.7.2012, 19:39 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



wallstreet, я погуглил и понял, что MakeProcInstance принимает коллбек первым параметром, а значит ты сам должен реализовать эту функцию http://www.frontsys.com/DLL/dll00031.htm


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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