文章目录
业务场景需求
标题:Java - C++之MFC通讯
1 业务场景描述
本人岗位背景:Java开发菜狗一条;
业务描述:需要对接各大厂家的设备;
对接信息:对方只提供了x86的库文件给我;
我他喵的,我哪会啊…被迫学习。
2 解决方案
目前有如下但不局限于这些的解决方法
- 方案一:通过 Windows rundll32.exe执行x86库文件;
- 方案二:使用Python做接口暴露;
- 方案三:使用C++做接口暴露;
本文采取了方案三。
3 技术点
主要分为三个部分
- C++ / Java的异步多线程
- C++ MFC框架的使用
- C++ / Java的TCP通讯
我们根据上述的思路开始下面的打码。
一、C++代码
提示:这里可以添加本文要记录的大概内容
1 编译环境的部署
首先必须将所需要的模块进行安装,如MFC等。
这一块就不大想说太多了,如图所示。
2 完整代码片段
先上代码再说
// MatrixSDKTestDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MatrixSDKTest.h"
#include "MatrixSDKTestDlg.h"
#include "afxdialogex.h"
#include <vector>
#include <sstream>
//获取地址信息
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#pragma comment (lib, "WS2_32.lib")
// 关于TCP的...
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "winsock2.h"
#include<cstdlib>
#include <thread> // 这个用于多线程开辟
using namespace std;
char recvBuf[100];
bool connectStatus = false;
SOCKET sockConn;
// ...over
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// ...此处省略无关文章的业务
// ...
/ 功能枚举 /
const CString code_100001 = "100001";// 初始化
const CString code_100002 = "100002";// 代表XXX功能
const CString code_100003 = "100003";// 代表XXX功能
const CString code_100004 = "100004";// 代表XXX功能
const CString code_100005 = "100005";// 代表XXX功能
/ TCP程序 /
// 切割方法
vector<string> split(string s, char token) {
stringstream iss(s);
string word;
vector<string> vs;
while (getline(iss, word, token)) {
vs.push_back(word);
}
return vs;
}
/**
* TCP
* 在一个新的线程里面接收数据
*/
DWORD WINAPI Fun(LPVOID lpParamter)
{
while (true) {
memset(recvBuf, 0, sizeof(recvBuf));
//接收数据
recv(sockConn, recvBuf, sizeof(recvBuf), 0);
printf("%s\n", recvBuf);
// 数据处理代码 - 根据过来的消息分配函数 - 处理的比较无脑简单
CString strCode = recvBuf;
// 初始化 字符串切割
string s1First = strCode;
vector<string> sData = split(s1First, ',');
if (strCode.Find(code_100001) != -1) {
// 初始化
string ipAddr = sData[1];
char* ipAddr_char = (char*)ipAddr.data();
unsigned short wLocalPort = 5060;
// 执行初始化动作
bool bRt = InitDevice(ipAddr_char, wLocalPort);
if (bRt)
{
send(sockConn, "初始化成功", sizeof("初始化成功"), 0);
}
else
{
send(sockConn, "初始化失败", sizeof("初始化失败"), 0);
}
}
else if (strCode.Find(code_100002) != -1) {
// ...
}
else if(strCode.Find(code_100003) != -1){
// ...
}
else {
int iSendDDD3 = send(sockConn, "-1", 2, 0);
}
// 消息回复 Demo
//char sendbuf[] = "你好,我是服务端,我已经收到了你的消息";
// 消息发送 Demo --- 如果回去的数据长度不够 看看是否是第三个参数限制太短了
//int iSend = send(sockConn, sendbuf, sizeof(sendbuf), 0);
}
closesocket(sockConn);
}
int startUpTCP()
{
WSADATA wsaData;
int port = 12022;// 端口号
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf(