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());
}
这样就完成了服务端的任务。