Вызов Fire_... метода из сервера, созданого при помощи ATL
От: _Kleo Россия  
Дата: 19.09.03 07:30
Оценка:
Помогите плиз со следущим:
В MFC-проект вставляется ATL-объект, затем сращивается объект приложения c ATL-объеком:
class CG2TillEmulApp : public CWinApp,
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CG2TillEmulApp, &CLSID_DComSrv>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CG2TillEmulApp>,
public IDispatchImpl<IDComSrv, &IID_IDComSrv, &LIBID_G2TillEmulLib>,
public CProxy_IDComSrvEvents< CG2TillEmulApp >
{
public:
bool FillCommRemoteList(CArray<int, int> &list);
CG2TillEmulApp();

DECLARE_CLASSFACTORY_SINGLETON(CG2TillEmulApp)
DECLARE_REGISTRY_RESOURCEID(IDR_DCOMSRV)
DECLARE_NOT_AGGREGATABLE(CG2TillEmulApp)
DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CG2TillEmulApp)
COM_INTERFACE_ENTRY(IDComSrv)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CG2TillEmulApp)

CONNECTION_POINT_ENTRY(DIID__IDComSrvEvents)
END_CONNECTION_POINT_MAP()

// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
STDMETHOD(RunSendData)(LONG CommId, LONG CamNum, BSTR Data, LONG Image, LONG Type, BSTR Operator_Name, BSTR KKM_Num);

Затем добавляем метод SendData и мплиментируем ConnectionPoint.
В большинстве примеров и статей, возбуждение события Fire_SendData происходит в клиенте:

Dim WithEvents obj As G2TillEmulLib.DComSrv
Private Sub Form_Load()
Set obj = New DComSrv
//Здесь происходит вызов события Fire_SendData
obj.RunSendData
End Sub
Private Sub obj_SendData(ByVal CommId As Long, ByVal CamNum As Long, ByVal Data As String, ByVal Image As Long, ByVal Type As Long, ByVal Operator_Name As String, ByVal KKM_Num As String)
MsgBox "I has get data from server"
End Sub
Необходимо вызвать это событие в сервере. Я делаю это так:

bool CPortNode::Send(const CString &str)
{
........
AFX_MANAGE_STATE(AfxGetStaticModuleState())
CWinApp* pApp = AfxGetApp();

CComObject<CG2TillEmulApp> *ob;
CComObject<CG2TillEmulApp>::CreateInstance(&ob);
ob->Fire_SendData(0,m_CamNum,(BSTR)strData.AllocSysString(), iImage,OperationType,(BSTR)OperatorName.AllocSysString (), (BSTR)TillNum.AllocSysString());
}
При таком вызове не происходит соединения с клиентом и обработчик в VB клиенте не срабатывает

Kleo
Re: Cинглетон в АТЛ
От: Vi2 Удмуртия http://www.adem.ru
Дата: 19.09.03 09:43
Оценка:
Здравствуйте, _Kleo, Вы писали:

_K>bool CPortNode::Send(const CString &str)
_K>{
_K>........
_K>    AFX_MANAGE_STATE(AfxGetStaticModuleState())
_K>    CWinApp* pApp = AfxGetApp();
        
_K>    CComObject<CG2TillEmulApp> *ob;
_K>    CComObject<CG2TillEmulApp>::CreateInstance(&ob);
_K>    ob->Fire_SendData(0,m_CamNum,(BSTR)strData.AllocSysString(), iImage,OperationType,
_K>                      (BSTR)OperatorName.AllocSysString (),    (BSTR)TillNum.AllocSysString());
_K>}
_K>При таком вызове не происходит соединения с клиентом и обработчик в VB клиенте не срабатывает

Это обычное локальное создание объекта, причем осуществляемое без фабрики класса. А отсюда и не использование синглетонности, которую в АТЛ делает именно фабрика. А отсюда и отсутствие каких бы то ни было клиентов, которых можно было бы оповестить. Т.е. объект-то оповещает, но никого нет.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Cинглетон в АТЛ
От: _Kleo Россия  
Дата: 19.09.03 10:47
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>[/ccode]_K>При таком вызове не происходит соединения с клиентом и обработчик в VB клиенте не срабатывает[/q]

Vi2>Это обычное локальное создание объекта, причем осуществляемое без фабрики класса. А отсюда и не использование синглетонности, которую в АТЛ делает именно фабрика. А отсюда и отсутствие каких бы то ни было клиентов, которых можно было бы оповестить. Т.е. объект-то оповещает, но никого нет.
Делала я объкт и глобальным, ситуация от этого не изменилась
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.