QT 및 v8을 사용하여 Javascript 인터프리터를 개발 중입니다.v8을 사용하여 이진 파일을 읽는 기능
지정된 경로에서 이진 파일을 읽을 수있는 함수를 만들어야합니다.
이 내 C++ 코드가 그렇게하는 것입니다
void ScriptThread::ReadFile(const v8::FunctionCallbackInfo<v8::Value>& args)
{
if (v8::V8::IsExecutionTerminating(args.GetIsolate()) || instance->m_killFlag)
return;
v8::HandleScopehandle_scope(args.GetIsolate());
if (args.Length() != 1)
{
args.GetIsolate()->ThrowException(
v8::String::NewFromUtf8(args.GetIsolate(), "Bad parameters"));
return;
}
v8::String::Utf8Value str(args[0]);
QString filepath = *str;
QFile file(filepath);
if (!file.open(QFile::ReadOnly))
{
return;
}
QByteArray data = file.readAll();
v8::Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(args.GetIsolate(), (void*)data.data(), data.size());
args.GetReturnValue().Set(ab);
}
문제는 자바 스크립트에서이 함수를 호출 한 후, JS 파일에 ArrayBuffer 임의의 데이터 대신 파일의 내용을 포함하고 있다는 점이다.
var buffer = ReadFile("D:/Temp/myfolder/ascii.txt")
Log(buffer)
var view = new Uint8Array(buffer)
Log(view)
Log(String.fromCharCode.apply(null, view))
D : /Temp/myfolder/ascii.txt :
ABCDEF
과를 변경하지 않고 스크립트를 여러 번 실행 한 후 내 JS의 출력 여기
내 JS 코드 파일 경로 :2016-09-15 12:42:35.847 Script Info [object ArrayBuffer]
2016-09-15 12:42:35.847 Script Info 200,29,125,195,254,136
2016-09-15 12:42:35.847 Script Info È}Ãþ
2016-09-15 12:42:35.847 Info Script Stopped
2016-09-15 12:43:41.543 Script Info [object ArrayBuffer]
2016-09-15 12:43:41.543 Script Info 238,254,238,254,238,254
2016-09-15 12:43:41.543 Script Info îþîþîþ
2016-09-15 12:43:41.543 Info Script Stopped
2016-09-15 12:47:19.588 Script Info [object ArrayBuffer]
2016-09-15 12:47:19.588 Script Info m
2016-09-15 12:47:19.588 Script Info 30,25,109,30,0,0
2016-09-15 12:47:19.588 Info Script Stopped
내 cpp 파일에서 v8 :: ArrayBuffer 내의 데이터를 검사했습니다.
사람이 읽을 수없는 파일을 읽는 데 함수가 필요하며 node.js를 프로젝트에 포함하지 않으므로 String을 사용할 수 없습니다.
어떻게 든 ArrayBuffer가 반환되기 전에 GCed됩니까? 아니면 어떻게 든 범위를 벗어나나요? 너희들 도와 줄 수있어?
감사합니다.