ShellExecuteEx传递参数包含json数据

在C++中其结构为

typedef struct _SHELLEXECUTEINFO {
DWORD cbSize; // typedef unsigned long DWORD;
ULONG fMask;
HWND hwnd;
LPCTSTR lpVerb;
LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
LPVOID lpIDList;
LPCTSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
union {undefined
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;

} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

其中参数lpParameters 表示需要传递的参数,如果要传递多个参数,默认是使用空格作为分隔符,如:

lpParameters = _T("bob jack mak");

但如果我们的参数中也含有空格呢?比如我们传递的路径中难免会有空格,这时就可以用以下书写方式进行传递,在每个参数收尾添加双引号,比如传递这三个字符串:“I want you”,“yes”,“I’m happy”

lpParameters = _T("\"I want you\" \"yes\" \"I'm happy\"");

如果现在我们要传递带有json格式的参数,用以上方式也不行了,至少在我这里是这样,因为json数据中的字段中带有双引号,如以下json格式:

{
    "name": "BeJson",
    "url": "http://www.bejson.com",
    "page": 88,
    "isNonProfit": true
}

这时候的解决办法就是将json数据进行编码,如Base64编码,ShellExecuteEx启动的程序接收到参数后再进行Base64解码,下面以QT代码进行展示:

//files为json字符串
std::string en_files = ZBase64::Encode((const unsigned char*)files.toStdString().c_str(), files.length());
QString en_qfiles = QString::fromStdString(en_files);
QString args = QString("\"%1\" \"%2\" \"%3\" \"%4\"").arg(ip).arg(QString::number(port)).arg(ser_version).arg(en_qfiles);
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.lpParameters = (LPCWSTR)args.unicode();

下面是调用的exe进行解码部分

if (argc != 5)
{
	return -1;
}
else
{
	int out_len = 0;
	QString encode_files = argv[4];
	std::string decode_files = ZBase64::Decode(encode_files.toStdString().c_str(), encode_files.length(), out_len);
}

你可能感兴趣的:(C++,json,ShellExecuteEx)