基于chromium浏览器加载ActiveX实践二WebSocket服务

ATLProjectServices实现

在这里插入图片描述

ATLProjectService main函数

  • 实现只能运行一个实例
	HANDLE hMutex=::CreateMutex(NULL,TRUE,"ATLProjectServiceB534");//FirstName可以随便取一个唯一的名字
	if (hMutex!=NULL)
	{
		if (GetLastError()==ERROR_ALREADY_EXISTS)
		{
			exit(0);
		}
	}
  • 初始化ActiveX
	::CoInitialize(NULL);
	hr = CoCreateInstance(CLSID_Calc,NULL,CLSCTX_INPROC_SERVER,IID_ICalc,(void**)&g_pICalc);
	if (FAILED(hr))
	{
		std::cout << "控件注册失败\n";
		exit(-1);
	}

	std::cout << "控件注册成功\n";
  • 启动websocket 服务器
	try {
		WSServer server_instance;

		// Run the asio loop with the main thread
		server_instance.run(11510);

	} catch (websocketpp::exception const & e) {
		std::cout << e.what() << std::endl;
	}

WSServer

构造函数

  • 构造服务端,设置回调
WSServer::WSServer(void)
{
	// Initialize Asio Transport
	m_server.init_asio();

	// Register handler callbacks
	m_server.set_open_handler(bind(&WSServer::on_open,this,::_1));
	m_server.set_close_handler(bind(&WSServer::on_close,this,::_1));
	m_server.set_message_handler(bind(&WSServer::on_message,this,::_1,::_2));
}

on_message

  • 在on_message函数中处理消息收发
void WSServer::on_message(connection_hdl hdl, server::message_ptr msg)
{
	std::string resultStr;
	std::string payload = msg->get_payload();
	//std::cout << payload << std::endl;

	handle(payload,resultStr);
	
	msg->set_payload(resultStr);
	m_server.send(hdl,msg);
}

ComHandler

  • websocket通信协议为x|y|z
    • x取值0或者1,1代表js发送给server 0代表server返回给js结果
    • y为接口名,代表需要调用控件的哪个接口
    • z为json串,代表控件接口的参数

handle函数

  • handle函数实现消息协议解析,获取函数名和参数
void handle(const std::string &payload,std::string &resultStr)
{
	std::string arg2;
	std::string jsonParam;

	std::vector<std::string> vs;
	vs = ZT_Split(payload,'|');
	if (vs.size() < 2)
	{
		resultStr.append("1|##Invalid Param");
	}
	else
	{
		resultStr.append(vs[0]);
		resultStr.append("|");
		resultStr.append(vs[1]);

		arg2 = vs[1];
		if (vs.size() >= 3)
		{
			jsonParam = vs[2];
		}
	}
	
	if (arg2.compare("Add") == 0)
	{
		rapidjson::Document d;
		if (d.Parse(jsonParam.c_str()).HasParseError())
		{
			jsonParseError(resultStr,"##Invalid Param");	
		}
		else
		{
			if (!d.HasMember("a") || !d.HasMember("b"))
			{
				jsonParseError(resultStr,"##Invalid Param");	
				return;
			}
			rapidjson::Value& a = d["a"];
			rapidjson::Value& b = d["b"];

			handleAdd(resultStr,a.GetString(),b.GetString());
		}
	}
}

handleAdd

  • handleAdd调用控件接口实现计算并组织json返回给网页端
void handleAdd(std::string &arg2,const char *a,const char *b)
{
	USES_CONVERSION;
	std::string resultStr;
	rapidjson::StringBuffer s;
	rapidjson::Writer<rapidjson::StringBuffer> writer(s);
	//调用控件的检测设备接口,并组织json串进行回复
	if (g_pICalc)
	{
		SHORT result;
		g_pICalc->Calc(atoi(a),atoi(b),&result);
		writer.StartObject();
		writer.Key("ret");
		writer.String("0");
		writer.Key("msg");
		writer.Int(result);
		writer.EndObject();
	}
	else
	{
		writer.StartObject();
		writer.Key("ret");
		writer.String("1");
		writer.Key("msg");
		writer.String("plugin is not installed");
		writer.EndObject();
	}
	arg2.append("|").append(s.GetString());
}

这样就完成了服务端的任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷动软件工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值