ATL开发COM组件数组参数问题

flcnrcn 2022-10-14 17:06:25

如下是我有用ATL开发COM组件给C#调用些的一个PositionChanged事件,但是C#调用Run方法是触发不了Fire_PostionChanged事件是怎么回事,请看下代码哪里有错。

//idl文件片段
library MyServerLib
{
	importlib("stdole2.tlb");
	[
		uuid(bb398ee4-645b-47bf-a76a-8d3d1bb57f68)
	]
	coclass CompReg
	{
		[default] interface IComponentRegistrar;
	};
	[
		uuid(95ba3e51-3b63-4662-b1ee-472dd0534cd5)
	]
	dispinterface _IDPositionEvents
	{
		properties:
		methods:
			[id(20)] HRESULT PositionChanged( [in] VARIANT vtArrayIndex[9],[in] VARIANT vtArrayValues[9]);
    }
}

//激发函数
HRESULT Fire_PositionChanged( VARIANT vtArrayIndex[9], VARIANT vtArrayValues[9])//事件激发函数
	{
		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 avarParams[18];
				for (int i = 0; i < 9; i++)
				{
					avarParams[i].lVal = vtArrayIndex[i].lVal;
					avarParams[i].vt = VT_I4;
				}
				for (int i = 9; i < 18; i++)
				{
					avarParams[i].lVal = vtArrayValues[i - 9].lVal;
					avarParams[i].vt = VT_I4;
				}

				CComVariant varResult;

				DISPPARAMS params = { avarParams, NULL, 18, 0 };
				hr = pConnection->Invoke(20, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &varResult, NULL, NULL);
			}
		}
		return hr;
	}

//触发激发函数
STDMETHODIMP CDPosition::Run(SHORT* pRetsult)
{
	// TODO: 在此处添加实现代码
	*pRetsult = 0;

	CComVariant a[9];
	int var1 = 10;
	for (int i = 0; i < 9; i++)
	{
		a[i].vt = VT_I4;
		a[i].lVal = var1;
		var1++;
	}
	
	CComVariant b[9];
	int var = 100;
	for (int i = 0; i < 9; i++)
	{
		b[i].vt = VT_I4;
		b[i].lVal = var;
		var++;
	}

	for(int i=0; i<2; i++)
	{
		this->Fire_PositionChanged( a, b);
		Sleep(2000);
	}
	return S_OK;
}

 

...全文
352 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧