Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Множественное объявление и файл Ресурсов


Автор: devmstr 26.12.2006, 23:47
Опять столкнулся с множественным объявлением hiders.
Меняю содержание темы, в связи с новыми данными, ресурсы не причем...
Что я не так делаю?
Вот мой код
main.h

Код
#ifndef __MAIN__H__
#define __MAIN__H__

#include "nsRCritChMng.h"

INT_PTR WINAPI MnDlgProc(HWND hDlg, UINT msg, WPARAM wPar, LPARAM lPar);

//
// Initialization of Dialog
void DialogInitialization(HWND hDlg);
#endif


main.cpp
Код
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
#include "main.h"

#pragma comment (lib, "comctl32.lib")

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow)
{
    INITCOMMONCONTROLSEX icce;
    InitCommonControlsEx(&icc);
    DialogBox(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MnDlgProc);
    return 0;
}

INT_PTR WINAPI MnDlgProc(HWND hDlg, UINT msg, WPARAM wPar, LPARAM lPar)
{
    switch (msg)
    {
    case WM_INITDIALOG:
        DialogInitialization(hDlg);
        break;
    case WM_CLOSE:
        EndDialog(hDlg, IDOK);
        return TRUE;
    }
    return FALSE;
}


void DialogInitialization(HWND hDlg)
{
    // Visual components initialization
    nsRCritChMng::InitRB(hDlg);
}


nsRCritChMng.h
Код
#ifndef __NSRCRITCHMNG__H__
#define __NSRCRITCHMNG__H__
#include <windows.h>
#include "resource.h"
#include "commctrl.h"

namespace nsRCritChMng
{
        WNDPROC pOldEditProc;
        void InitRB(HWND hDlg);
        INT_PTR WINAPI EdtDlgProc(HWND hEdt, UINT msg, WPARAM wPar, LPARAM lPar);
        
};
#endif


nsRCritChMng.cpp
Код
#include "nsRCritChMng.h"

//
// Initialization of RadioButtons
void nsRCritChMng::InitRB(HWND hDlg)
{
    SendMessage(GetDlgItem(hDlg, IDC_UD_OPTIND), UDM_SETRANGE32, (WPARAM)0, (LPARAM)9);
    SendMessage(GetDlgItem(hDlg, IDC_UD_OPTIND), UDM_SETPOS32, 0, (LPARAM)5);
    
    SetDlgItemText(hDlg, IDC_E_OPTIMIND, __TEXT("0.5"));
    pOldEditProc =  (WNDPROC)(LONG_PTR)SetWindowLongPtr(GetDlgItem(hDlg, IDC_E_OPTIMIND), DWLP_DLGPROC, (LONG)(LONG_PTR)EdtDlgProc);
}

INT_PTR WINAPI nsRCritChMng::EdtDlgProc(HWND hEdt, UINT msg, WPARAM wPar, LPARAM lPar)
{
    return CallWindowProc(pOldEditProc, hEdt, msg, wPar, lPar);
}


Помоги пожайлуста, объясните что не так... 

Сообщение компилера:
Код
error LNK2005: "long (__stdcall* nsRCritChMng::pOldEditProc)(struct HWND__ *,unsigned int,unsigned int,long)" (?pOldEditProc@nsRCritChMng@@3P6GJPAUHWND__@@IIJ@ZA) already defined in main.obj    nsRCritChMng.obj    

fatal error LNK1169: one or more multiply defined symbols found

Автор: Aleksandor 27.12.2006, 07:07
#include "nsRCritChMng.h"
 в main.h
 и в nsRCritChMng.cpp 

 
 Мона попробовать так
Код

#pragma once
#include "nsRCritChMng.h"

Автор: devmstr 27.12.2006, 09:52
Aleksandor, 
К сожалению не помогло. Защита от этого и так стоит.

Мне тут подсказали:
Код

static WNDPROC pOldEditProc=NULL;


Помогло. Но только непонятно, почему это помогает...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)