Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Как из глобальной функции


Автор: Edik 2.11.2007, 12:05
Предположим у меня есть глобальная функция void MyFunc(void); и есть функция класса void CMyClass::OnError(); так вот как мне из этой MyFunc(); вызвать CMyClass::Error(). Пробывал так:
Код

CMyClass myclass;
myclass.Error();

Ничего не выходит. Пробывал и так:
Код

СMyClass *myclass;
myclass=new CMyClass;
myclass->Error();

Тоже ничего не выходит. Пробывал и так:
Код

CMyClass *myclass=(CMyClass*)AfxGetMainWnd();
myclass->Error();


Подскажите выход.

Автор: Andrey44 2.11.2007, 12:44
В функцию передавай this параметром например MyFunck(void *param)

А в функции делай   СMyClass *myclass = (СMyClass*) param;

Автор: Fazil6 2.11.2007, 13:35
Цитата(Edik @  2.11.2007,  12:05 Найти цитируемый пост)
Ничего не выходит.

что значит не выходит ?

Автор: archimed7592 2.11.2007, 13:52
Цитата(Edik @  2.11.2007,  12:05 Найти цитируемый пост)
Ничего не выходит.

Либо такой ф-ции в CMyClass не существует(м.б. OnError, а не Error?), либо она private/protected.

Автор: Edik 2.11.2007, 15:04
не, функция есть- но не вызываеться. а через this не получиться, так как это не функция вызываеться из диалога, что бы this класса диалога передать в функцию и через этот this запустить диалог. она у меня вобще то в dll размещеная эта фунция. к тому не просто в мфс приложениях у меня это тоже не получилось. мне это чисто интересно как сделать. такое у меня часто в программах встречаеться. что бы из глобальной функции моей MyFunc() вызвать CMyClass::OnError(). Да функция есть, но ... не вызываеться. Ошибка исполнения на методе Dlg.DoModal(). как же в нее передаш указатель this класса диалога?

Автор: Andrey44 2.11.2007, 15:45
Подожди, а как ты из Dlg.DoModal() вызываешь функции класса?

Автор: zkv 2.11.2007, 15:46
пример:
Код

class CMyClass
{
public:
  void Method()
  {}
  static void StaticMethod()
  {}
};

CMyClass g_myClass;

void GlobalFunction()
{
   g_myClass.Method();
  CMyClass::StaticMethod();
}

Автор: Edik 2.11.2007, 16:25
Так вот, продолжим. Мой код.
Код

// GlobalFuncDlg.h

void MyFunc(void);   //Глобальная функция

class CGlobalFuncDlg : public CDialog
{
// Construction
public:
    CGlobalFuncDlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
    //{{AFX_DATA(CGlobalFuncDlg)
    enum { IDD = IDD_GLOBALFUNC_DIALOG };
    CEdit    m_edit;      //Мое поле редактирования
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CGlobalFuncDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    //{{AFX_MSG(CGlobalFuncDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnButton1();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CGlobalFuncDlg MyClass;    //Объявление класса


// GlobalFuncDlg.cpp

void MyFunc()
{
MyClass.m_edit.SetWindowText("Hello!");
}

Короче мне вот так вот типа надо такого плана доступ получить к m_edit, ну и естественно через класс GlobalFuncDlg. Дальше так же можна и доступ к функциям класса получить, если пример получиться. Так вот- ошибка:
Linking...
GlobalFuncDlg.obj : error LNK2005: "class CGlobalFuncDlg MyClass" (?MyClass@@3VCGlobalFuncDlg@@A) already defined in GlobalFunc.obj

Автор: Fazil6 2.11.2007, 20:46
Цитата(Edik @  2.11.2007,  16:25 Найти цитируемый пост)
CGlobalFuncDlg MyClass;    //Объявление класса

Уважаемый, читайте, что вам линкер пишет. Такие, как Вы выразились "Объявление класса" нельзя в хедерах делать ибо будете иметь то, что имеете

Автор: Edik 4.11.2007, 01:18
После моих недолгих проб и ошибок, я в конце концов нашел решение моей проблемы. Реально, рабочий код.
Код

void MyFunc()
    {
        CGlobalFuncDlg *MyClass=(CGlobalFuncDlg *)AfxGetApp()->m_pMainWnd;
        MyClass->m_edit.SetWindowText("Hello!");
    }

А вот zkv даже подсказал более утонченное, но не столь для меня актульное решение:
Код

void MyFunc()
{
    if( CGlobalFuncDlg *pDlg = dynamic_cast<CGlobalFuncDlg *>( AfxGetMainWnd() ) )
        pDlg->m_edit.SetWindowText("Hello!");
}


Автор: zkv 4.11.2007, 06:49
Удалил оффтоп/эмоции. Тема закрыта.

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