Не можете получить дескриптор класса Cwnd в MFC Windowless Activex? - PullRequest
1 голос
/ 25 сентября 2011

Ранее я задавал два вопроса по этому поводу, и для каждого поста было несколько решений, которые я пробовал, но проблема все еще существует.

Мой первый вопрос был: почему ActiveX без окон не возвращает дескриптор.было предложено «изменить настройку создания, отключить активацию make без окна, я пробовал, но свойство m_hWnd вернуло ноль, как метод GetSafeHwnd().

второй вопрос был таким же, как этотсфокусировался на классе COleControl и его предке CWnd. Решение было так: "Создайте невидимое окно где-нибудь в вашем коде инициализации элемента управления.Обработайте сообщения, отправленные в это окно, и вызовите методы управления напрямую ". Так я и сделал, но созданный класс по-прежнему возвращает нулевой дескриптор.

вот мой новый невидимый источник класса:

// moWind.cpp : implementation file
//
#include "stdafx.h"
#include "PINActive.h"
#include "moWind.h"
#include "include\xfspin.h"
#include <math.h>
// moWind

IMPLEMENT_DYNAMIC(moWind, CWnd)

moWind::moWind(){}

moWind::~moWind(){}

//=============================================================
LRESULT moWind::OnExecuteEvent (WPARAM wParam, LPARAM lParam)
{
    WFSRESULT *pResult = (WFSRESULT *)lParam;
    CString EK=_T("");
    CString str;
    int reskey=0;
    if (pResult->u.dwEventID=WFS_EXEE_PIN_KEY)
    {       
        LPWFSPINKEY pressedkey;
        pressedkey=(LPWFSPINKEY)pResult->lpBuffer;

    reskey = log10((double)pressedkey->ulDigit) / log10((double)2);

        EK.Format("%d",reskey);
        xfsOnKeyEvent->OnKeyRecieved(reskey);
    }
    else
    {
        str.Format("ExecuteEvent:  ID = %d\r\n", pResult->u.dwEventID);
    }
    MessageBox("a Execute message Recieved");
    return 0;
}

BEGIN_MESSAGE_MAP(moWind, CWnd)

    ON_MESSAGE(WFS_EXECUTE_EVENT,OnExecuteEvent)

END_MESSAGE_MAP()

и это файл .h класса:

// moWind.h
class IXFSEvents
{
protected:
    IXFSEvents(){};
    virtual ~IXFSEvents(){};
public:
    virtual void OnKeyRecieved(int key)=0;
};

class moWind : public CWnd
{
    DECLARE_DYNAMIC(moWind)

public:
    moWind();
    virtual ~moWind();
    void Register(IXFSEvents* obj)
    {
        xfsOnKeyEvent= obj;
    }
protected:
    IXFSEvents* xfsOnKeyEvent;
    LRESULT OnExecuteEvent (WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
};

и, в конце, вот как я использовал этот класс в своем Activex: в файле myActivex.h:

включите "moWind.h"

class CmyActivexCtrl : public COleControl, public IXFSEvents
{
...
Class definition
...
protected:
      moWind tmpWind;
 .
 .
 };

, наконец, в метод создания myActivex я инициализировал метод обратного вызова компонента и хотел получить его дескриптор следующим образом:

CmyActivexCtrl::CmyActivexCtrl()
{
    InitializeIIDs(&IID_DmyActivex, &IID_DmyActivexEvents);
    tmpWind.Register(this);
    myOtherComponent.WindowsHandle=tmpWind.GetSafeHwnd(); //here my Cwnd derived class returns zero
        //my other component gets the handle and call an API with it to register 
        //the given handle and force the API to send the messages to that handle.
}

1 Ответ

0 голосов
/ 27 сентября 2011

Как вы упомянули, вам нужен дескриптор окна, чтобы иметь возможность получать пользовательские сообщения через него, у вас всегда есть возможность создания вспомогательного окна, такого как окно только сообщений, см. Использование CreateWindowEx для создания сообщений только окно .

Для вашего контроля без окон вполне нормально вообще не иметь дескриптора окна, поэтому вы не можете полностью полагаться на доступность дескриптора, если у вас нет окна самостоятельно.

...