У меня есть расширение Chrome, которое запускает исполняемый файл C ++, используя NativeHostMessaging
через файл JSON, который указывает на этот файл.
Этот файл .exe пытается прочитать сообщения, отправленные с расширения. Сначала он читает 4 байта, которые отображают длину, затем он читает количество байтов, равное длине. Самое первое, что делает этот файл, это ждет сообщения от расширения.
Однако исполняемый файл не получил ничего от расширения и продолжает ждать. Ничто не существует на STDIN(0)
,
Это проблема безопасности или я что-то не так делаю? У меня была последовательность чтения / записи в неправильном порядке?
Вот как выглядит мой для окон:
#include "stdafx.h"#include "json\json.h"
int _tmain(int argc, _TCHAR* argv[])
{
//save in a file so we know it was called
FILE *fh_debug; int errorcode;
errorcode =fopen_s(&fh_debug, "debug.txt","ab+");
std::string msg = "Host Called";
fwrite( msg.c_str(), sizeof(char),msg.size(),fh_debug);
unsigned int uiSize = 0;
std::string inputStr;
//read the first four bytes (=> Length)
for (int i = 0; i < 4; i++)
{
int read_char = getchar();
uiSize += read_char * (int) pow(2.0, i * 8);
}
//for debug "0000" = 808464432
if ( uiSize == 808464432 ) {
uiSize = 0; inputStr = "{\"text\":\"tester\"}";
}
//debug record size
msg = std::to_string(uiSize);
fwrite( msg.c_str(), sizeof(char),msg.size(),fh_debug);
//read the text
for (unsigned int i = 0; i < uiSize; i++)
{
inputStr += getchar();
}
//debug record json message
msg = inputStr;
fwrite( msg.c_str(), sizeof(char),msg.size(),fh_debug);
//get the text
std::string theText;
Json::Value jsonRoot;
Json::Reader jsonReader;
bool OK = jsonReader.parse(inputStr, jsonRoot);
try {
theText = jsonRoot.get("text", "no text element").asString();
}
catch (std::exception& e)
{
std::cout << e.what() << '\n';
throw e;
}
//debug record json message
msg = theText;
fwrite( msg.c_str(), sizeof(char),msg.size(),fh_debug);
std::string strOut = "{\"text\":\"Hello " + theText + "\"}";
uiSize = strOut.length();
msg = strOut;
fwrite( msg.c_str(), sizeof(char),msg.size(),fh_debug);
std::cout << char(((uiSize>>0) & 0xFF));
std::cout << char(((uiSize>>8) & 0xFF));
std::cout << char(((uiSize>>16) & 0xFF));
std::cout << char(((uiSize>>24) & 0xFF));
std::cout << strOut.c_str();
return 0;
}
Этот код работал для меня на OSx
#include <stdio.h>
#include <iostream>
#include<stdlib.h>
#include <string.h>
#include<unistd.h>
int main(){
char cBuffer[65536] = {0};
FILE *fh;
fh=fopen("/Users/mycode.text","ab+");
std::string msg="\"This is a Test\"}";
std::string hello="itsme";
int ii=4;
while(ii)
{
unsigned int uiSize = 0;
std::string strOut = "{\"type\":";
strOut=strOut + msg;
uiSize = strOut.length();
std::cout << char(((uiSize>>0) & 0xFF));
std::cout << char(((uiSize>>8) & 0xFF));
std::cout << char(((uiSize>>16) & 0xFF));
std::cout << char(((uiSize>>24) & 0xFF));
std::cout << strOut.c_str();
std::cin.read((char*)&uiSize, sizeof(unsigned int));
if(uiSize > 0 && uiSize < 65536)
{
memset(cBuffer, 0, 65536);
std::cin.read(cBuffer, uiSize);
fwrite(cBuffer,sizeof(char),uiSize,fh);
std::string strIn(cBuffer);
msg=strIn+"}";
if(!strIn.compare(hello))
exit(0);
ii--;
}
else
break;
}return 0;
}