描述:
我在COM事件接口函数中要返回一个自定义的结构体让调用程序进行处理
但是编译的时候出现了如下的Warning:
warning C4800:...my_struct forcing value to bool 'true' or 'false'
为何会出现强制类型转换?
不知道这样在外部调用时能否得到正确的值?
如果不能,事件接口函数的参数应当怎样设?
该函数如下:
HRESULT Fire_OnGetTrap(MY_STRUCT * pMyStruct)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[0] = pMyStruct;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}
解决方案1:
HRESULT Fire_OnGetTrap(MY_STRUCT * pMyStruct)放在com的源代码中,你需要触发该事件的地方就ok了。很难吗?
解决方案2: 我没用过事件,但是我可以用定制自己的结构体类型,并且实现VB到VC的跨语言传送。
方法为:
建立一个ATL的工程名位DefStruct
然后在idl文件中下面语句的后加入自己定义的类型
其中UUID自己通过Windows提供的生成器生成
library VCNETWORKLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
//此处向下为自己定义的结构
//定义一个结点结构体
typedef
[
uuid(D124B04A-C5F9-4a16-9671-1E67B75DB1DB),
helpstring("NetWork Node Struct")
]
struct NODE
{
double dx;
double dy;
long lptNo;
}NODE;
这样子就定义了一个NODE的结点类型
从原理分析这种定义方法也用在事件的参数传递应该没有问题,我没有具体试过,楼主可以尝试一下
参数必须是com规定的那几种吧,要不然怎么实现跨语言跨进程,自定义的东西可以用指针啊,转换2次就ok。
您可能想查找下面的文章:
- 如何改变Composite控件的背景色?
- IDispacth::Invoke方法无法传递STRUCT参数的问题?请真正的高手帮帮忙。
- 这个typedef是做什么的?
- typedefvector<long>VTYPE_NODE_P
- struct里面若有com指针要如何初始化
- 如何调用参数是structRangeRange的函数
- 在ATL的类声明当中的DECLARE_PROTECT_FINAL_CONSTRUCT是个必须存在东西么?还是可选的?
- 为什么要重载ATL类的FinalConstruct?在这个函数里面我们通常做什么事情?
- CString到底是MFC的类型还是ATL的类型?为什么有_ATL_CSTRING_EXPLICIT_CONSTRUCTORS这个宏?
- 类型库struct对齐方式问题