编写了一个组建:内涵定时器,定时调用组建接口函数,向客户端发送事件信息。问题:
作为进程组件时,一切正常!!
但作为进程外组件时,却不能向客户端发送事件信息。怎么回事?
作为进程组件时,一切正常!!
但作为进程外组件时,却不能向客户端发送事件信息。怎么回事?
解决方案 »
- 求助,如何将窗口坐标转换为控件的坐标?
- 用了WM_KICKIDLE 消息后,任务管理器里显示我的进程CPU占有率达到50%左右,怎么回事呢?
- 怎么消除命令行程序的窗口
- 如何实现网络拨号连接的自动创建??
- [统计]请问都有哪些方法(Win32SDK)可以将窗体的边框去掉,或者创建无边框的窗体?--用于Miranda IM
- 菜鸟继续来问两个比较弱弱的问题=.=
- DrawText写的字如何清除?
- 请问网络中的端口和操作系统的内核端口对象是一回事吗?
- 各位老大,不知道一次向串口发送太多的数据是否会造成串口发送异常从而对方无法收到?
- 请教一个关于VC++菜单的问题
- vc++调用Matlab引擎的问题?
- 请问计算机博士的就业?
用MessageBox()跟踪一下走到哪一不?
但有个问题:
Invoke的第三个参数做什么的?现在我的程序为:LOCAL_USER_DEFAULT
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pI);
HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId) ;
HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTinfo, LCID lcid, ITypeInfo FAR **ppTIinfo);
HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr);
其中只有Invoke()的调用客户端函数是需要你自己来完成。其他的可以直接拷过去。
给你我的一个模板:
#if !defined(AFX_ALLBACK_H__0DF7C374_AB83_452C_9A1B_131AB926895D__INCLUDED_)
#define AFX_ALLBACK_H__0DF7C374_AB83_452C_9A1B_131AB926895D__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include "stdafx.h"
#include <atlbase.h>#include "AtlConnectionAddressGuidance.h"#import "AtlConnectionAddressGuidance.tlb" named_guids raw_interfaces_onlyusing namespace ATL;
class CallBack : public _IGuidanceEvents
{
public:
CallBack();
virtual ~CallBack();
public:
DWORD m_dwRefCount;
// BSTR AddressResult;//return result
CString mguidance;
STDMETHODIMP CallClientResponse(BSTR GuidanceSentence);
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pI);
HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId) ;
HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTinfo, LCID lcid, ITypeInfo FAR **ppTIinfo);
HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr);
};#endif
CPP中:
#include "stdafx.h"
#include "AtlConnectionAddressGuidanceClient.h"
#include "allBack.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CallBack::CallBack()
{
m_dwRefCount = 0;
// AddressResult=0;
}CallBack::~CallBack()
{}
STDMETHODIMP CallBack::CallClientResponse(BSTR GuidanceSentence)
{
CComBSTR combstr(GuidanceSentence);
CString strTemp=GuidanceSentence;
CString Client="Client Guidance Response:";
// AfxMessageBox("AtlConnectionAddressGuidanceClient Response");
Client+=strTemp;
AfxMessageBox(Client);
mguidance+=strTemp;
CString str="AtlConnectionAddressGuidanceClient";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
// if(pWnd)
// pWnd->PostMessage(WM_CLOSE,0,0);
Sleep(1000);
::SendMessage(pWnd->m_hWnd,WM_QUIT,0,0);
// HWND hwnd =::GetActiveWindow();
// Sleep(200);
// PostMessage(NULL,WM_QUIT,0,0); //"AtlConnectionAddressGuidanceClient"
return S_OK;; };
HRESULT STDMETHODCALLTYPE CallBack::QueryInterface(REFIID iid, void **ppvObject)
{
if (iid == DIID__IGuidanceEvents)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
}
if (iid == IID_IUnknown)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
}
else
return E_NOINTERFACE; /*
This Method Can't return right value */
//Example show it this way
/* m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
*/ }ULONG STDMETHODCALLTYPE CallBack::AddRef()
{
m_dwRefCount++;
return m_dwRefCount;
}ULONG STDMETHODCALLTYPE CallBack::Release()
{
ULONG l;
l = m_dwRefCount--;
if ( 0 == m_dwRefCount)
delete this; return l;
}HRESULT STDMETHODCALLTYPE CallBack::GetTypeInfoCount(UINT *pI)
{
return E_NOTIMPL;
}; HRESULT STDMETHODCALLTYPE CallBack::GetIDsOfNames(REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE CallBack::GetTypeInfo(UINT iTinfo, LCID lcid, ITypeInfo FAR **ppTIinfo)
{
return E_NOTIMPL;
} HRESULT STDMETHODCALLTYPE CallBack::Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr)
{
HRESULT hr = S_OK;
if(pDispParams)
// switch (dispIdMember)
// {
// case 1:
// return AdditionStarted();
{if(dispIdMember==1)
// case 2:
{
//AfxMessageBox("AtlConnectionAddressGuidanceClient Response");
//(unsigned short *)
return CallClientResponse(pDispParams->rgvarg[0].bstrVal); //Transport Error
}
else
return E_NOTIMPL;
// default:
// return E_NOTIMPL;
}
else return E_NOTIMPL;
};
。
Fire_call(); // 发出事件
}当定时器调用a->call时,客户端没有响应
但当客户端主动调用a->call时,客户端有相应。奇怪!!
肯定是你在传递消息时错了。就在服务端调用invoke后, 客户端接受器对象call()事件里是应该有消息响应的,如果没有在客户端接受器对象的invoke函数中也应该有响应。如果这里也没有的话,就应该是消息没有传过来。
谢谢!!mail:[email protected]
这就是我现在面临的主要问题!!!再次感谢!!
1。客户端成功与server建立连接后,什么也不做,等待server发送事件信息。
2。server每隔三分钟主动调用LogAddressData,通过Firewall_CallClientReponse向client发出事件信息这时,client是否可以收到信息?
1。客户端成功与server建立连接后,什么也不做,等待server发送事件信息。
2。server每隔三分钟主动调用LogAddressData,通过Firewall_CallClientReponse向client发出事件信息这时,client是否可以收到信息?
1。客户端成功与server建立连接后,什么也不做,等待server发送事件信息。
2。server每隔三分钟主动调用LogAddressData,通过Firewall_CallClientReponse向client发出事件信息这时,client是否可以收到信息?
我有一个问题问问jameshooo:如果我跳到了子线程中去调用Firexxx肯定编译不通过,该如何解决?(传递对象指针好像也没有用。)
这是我的开子线程代码,能调用Firexxx了,但是在执行到Invoke()方法时,客户端的invoke()事件却没有响应,这是为什么?我的参数也已经传到了服务端Invoke()中。
{
CGuidance *myAtl = (CGuidance*)lpParameter;
myAtl->Fire_CallClientResponse(GuidanceData.AllocSysString());
CoUninitialize();
return 0;
}
服务端的接口处理函数(主线程)部分代码:
HANDLE hThrd;
DWORD idd;
CoInitializeEx(NULL,(COINIT_MULTITHREADED)) ;
if((hThrd = CreateThread(
0,
0,
(LPTHREAD_START_ROUTINE)ThreadServer,
(void *)this,
0,
&idd)) == NULL)
{
AfxMessageBox("Creare Thread Error");
}
CloseHandle(hThrd);
然后在CProxy_IGuidanceEvents的Fire_CallClientResponse()中有响应,但是在
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
这句话后本来客户端接收器对象中的invoke函数会响应但是现在却没有反应,这是为什么?
我发现disp参数中已经赋有正确的值了,说明调用Fire_CallClientResponse()应该是成功了啊?这是为什么?谢谢!
这个问题好像比较普遍,供后来者参考
修改CProxy_IAppleEvents后,编译出错---error C2352: “ATL::CComDynamicUnkArray::GetCookie” : 非静态成员函数的非法调用怎么回事?#pragma once
#include "ATLCPImplMT.h"//template<class T>
//class CProxy_IAppleEvents :
// public IConnectionPointImpl<T, &__uuidof(_IAppleEvents)>template <class T>
class CProxy_IAppleEvents : public IConnectionPointImplMT<T, &__uuidof(_IAppleEvents), CComDynamicUnkArray>
{
public:
HRESULT Fire_Reponse()
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int cConnections = m_vec.GetSize(); for (int iConnection = 0; iConnection < cConnections; iConnection++)
{
pThis->Lock();
CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
pThis->Unlock(); IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p); if (pConnection)
{
CComVariant varResult; DISPPARAMS params = { NULL, NULL, 0, 0 };
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}
};
改成:CComPtr<IUnknown> sp;sp.Attach (GetInterfaceAt(nConnectionIndex));IDispatch* pConnection = reinterpret_cast<IDispatch*>(sp.p);
试试。
error C2352: “ATL::CComDynamicUnkArray::GetCookie”: 非静态成员函数的非法调用
error C2352: “ATL::CComDynamicUnkArray::GetUnknown”: 非静态成员函数的非法调用