Adobe® Photoshop® Connection SDK C++ 案例

一、Adobe® Photoshop® Connection SDK下载

https://console.adobe.io/servicesandapis

此SDK包含两种,一种pluginsdk主要用于滤镜等内置插件。另一种connectionsdk用户网络连接交互。这里主要讲connection sdk技术

二、Adobe® Photoshop® Connection SDK 案例

 官方文档现有案例是JAVA和MAC。网上有一份C#的案例MBC提供的Adobe PhotoShop Connection SDK的C#实现

三、c++用法

其原理是加密发送TCP协议进行的PS交互。现在介绍C++用法

 

1.新建项目,现有加密文件拷贝至项目


#include <Winsock2.h>
#pragma  comment(lib,"ws2_32.lib")

#include <iostream>
#include <vector>
using namespace std;
#pragma warning(disable:4996)

#include"PSCryptor.h"

 
int main()
{
	int err;
	WORD versionRequired;
	WSADATA wsaData;
	versionRequired = MAKEWORD(1, 1);
	err = WSAStartup(versionRequired, &wsaData);//协议库的版本信息
	if (!err)
	{
		printf("客户端嵌套字已经打开!\n");
	}
	else
	{
		printf("客户端的嵌套字打开失败!\n");
		return 0;//结束
	}

	SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN clientsock_in;
	clientsock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	clientsock_in.sin_family = AF_INET;
	clientsock_in.sin_port = htons(49494);

	connect(clientSocket, (SOCKADDR*)&clientsock_in, sizeof(SOCKADDR));//开始连接

	 

	printf("\nReady for input, type in JavaScript or type ? for commands:\n");


	/** flag for verbose output 详细输出标志 */
	bool  mShowMessages = true;

	/** values for transaction type  事务类型的值*/
	int ILLEGAL_TYPE = 0;
	int ERRORSTRING_TYPE = 1;
	int JAVASCRIPT_TYPE = 2;
	int IMAGE_TYPE = 3;
	int PROFILE_TYPE = 4;
	int DATA_TYPE = 5;

	/** current protocol version 当前的协议版本*/
	int PROTOCOL_VERSION = 1;

	/** length of the header not including the actual length byte
	or the communication status 报头的长度,不包括实际长度字节
或者通信状态 */
	int PROTOCOL_LENGTH = 4 + 4 + 4;
	int COMM_LENGTH = 4;
	int NO_COMM_ERROR = 0;

	/** bump this value every time a message gets sent,每次发送消息时都会触发这个值,
	 *  the reply message will match the ID 应答消息将与ID匹配
	*/
	int mTransactionID = 0;

	/** messages are encrypted, helper class to encrypt and decrypt messages消息被加密,helper类对消息进行加密和解密 */
	//PSCryptor mEncryptDecrypt = NULL;

	 
	PSCryptor mEncryptDecrypt = PSCryptor("123456");
	 
	std::cout << "Start processJavaScript" << endl;

	/* WRITE */

	BYTE strBytes[] = "documents.add();";
	int size = sizeof(strBytes) / sizeof(strBytes[0]);
	int _nEncryptSize = PROTOCOL_LENGTH + size;
	// BYTE* allBytes = new BYTE[PROTOCOL_LENGTH + size + 1];
	// memset(allBytes, 0, _nEncryptSize * sizeof(BYTE));
	//BYTE  allBytes[29] = { NULL };

	vector<BYTE>_vecallBytes;
	int byteIndexer = 0;
	_vecallBytes.push_back((BYTE)(PROTOCOL_VERSION >> 24));
	_vecallBytes.push_back((BYTE)(PROTOCOL_VERSION >> 16));
	_vecallBytes.push_back((BYTE)(PROTOCOL_VERSION >> 8));
	_vecallBytes.push_back((BYTE)(PROTOCOL_VERSION));

	int messageID = mTransactionID++;

	_vecallBytes.push_back((BYTE)(messageID >> 24));
	_vecallBytes.push_back((BYTE)(messageID >> 16));
	_vecallBytes.push_back((BYTE)(messageID >> 8));
	_vecallBytes.push_back((BYTE)(messageID));

	_vecallBytes.push_back((BYTE)(JAVASCRIPT_TYPE >> 24));
	_vecallBytes.push_back((BYTE)(JAVASCRIPT_TYPE >> 16));
	_vecallBytes.push_back((BYTE)(JAVASCRIPT_TYPE >> 8));
	_vecallBytes.push_back((BYTE)(JAVASCRIPT_TYPE));

	for (int i = 0; i < size; i++) {
		_vecallBytes.push_back(strBytes[i]);
	}


	BYTE strBytesOut[1024] = { NULL };

	bool _encrypt = true;
	size_t dataOutMoved = 0;//接收实际返回大小

	printf("bytes to encrtpt:%d", _vecallBytes.size());
	for (int i = 0; i < _vecallBytes.size(); i++)
	{
		if (i % 8 == 0)
			printf("\n");

		wprintf(L" %02x ", _vecallBytes[i]);
	}

	if (_vecallBytes.size() == 0)
		return 0;
	PSCryptorStatus encryptedBytes = mEncryptDecrypt.EncryptDecrypt(_encrypt, &_vecallBytes[0], _vecallBytes.size(), strBytesOut, 1024, &dataOutMoved);


	printf("\nbytes encrypted:%d", dataOutMoved);
	for (int i = 0; i < dataOutMoved; i++)
	{
		if (i % 8 == 0)
			printf("\n");
		wprintf(L" %02x ", strBytesOut[i]);
	}

	vector<BYTE>_vecBytesSend;
	int messageIndex = 0;
	int messageLength = COMM_LENGTH + dataOutMoved;
	_vecBytesSend.push_back((BYTE)(messageLength >> 24));
	_vecBytesSend.push_back((BYTE)(messageLength >> 16));
	_vecBytesSend.push_back((BYTE)(messageLength >> 8));
	_vecBytesSend.push_back((BYTE)(messageLength));

	_vecBytesSend.push_back((BYTE)(NO_COMM_ERROR >> 24));
	_vecBytesSend.push_back((BYTE)(NO_COMM_ERROR >> 16));
	_vecBytesSend.push_back((BYTE)(NO_COMM_ERROR >> 8));
	_vecBytesSend.push_back((BYTE)(NO_COMM_ERROR));

	for (int i = 0; i < dataOutMoved; i++) {
		_vecBytesSend.push_back(strBytesOut[i]);
	}


	int _nstrBytesSend = _vecBytesSend.size();
	printf("\n带不加密头8字节:%d", _nstrBytesSend);
	for (int i = 0; i < _nstrBytesSend; i++)
	{
		if (i % 8 == 0)
			printf("\n");
		wprintf(L" %02x ", _vecBytesSend[i]);
	}


	if (_vecBytesSend.size() == 0)
		return 0;
	printf("\nSend JavaScript to Server\n");
	send(clientSocket, reinterpret_cast<char *>(&_vecBytesSend[0]), _vecBytesSend.size(), 0);


	printf("\nReceive from Server\n");
	BYTE receiveBuff[1024] = { NULL }; 
	 
	recv(clientSocket, reinterpret_cast<char *> (receiveBuff), 1024, 0);
	printf("\n接收:%d", 1024);
	for (int i = 0; i < 1024; i++)
	{
		if (i % 8 == 0)
			printf("\n");
		wprintf(L" %02x ", receiveBuff[i]);
	}

	/* READ */
	// 待解析。。。。。。。。。。。。
	
	closesocket(clientSocket);
	WSACleanup();
	return 0;
}

 

2,运行效果

打开PS,首选项增效工具启用远程连接 ,并将密码设置“123456”,项目运行后PS新建了文档

案例下载:

Adobe® Photoshop® Connection SDK C++ 案例

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值