C++에서 자바스크립트(JavaScript) 함수를 직접 호출할 수는 없지만, 간접적인 방식으로 구현할 수 있습니다. 핵심 아이디어는 C++ 프로그램이 특정 함수를 호출하는 내용을 담은 js 파일을 생성하고, 웹 페이지가 이 파일을 주기적으로 로드하여 함수를 실행하게 하는 것입니다.
동작 원리
- C++ 코드가
generate.js파일을 생성하며, 이 파일 안에는caller()함수 호출 구문이 작성됩니다. - 웹 페이지는
setInterval()을 통해 일정 시간마다generate.js파일을 동적으로 로드합니다. - 로드된 스크립트가 실행되면서
caller()가 호출되고,caller()는 인자로 받은display()함수를 실행합니다.
1. C++ 코드
아래 C++ 코드는 callId 값을 하나씩 증가시키면서 generate.js 파일에 caller() 호출 구문을 기록합니다.
int callId = 0;
void callFunction() {
// 생성할 js 파일
ofstream fout("generate.js");
fout << "caller(" << callId++ << ", display);";
}2. HTML 및 자바스크립트 코드
웹 페이지 측 코드입니다. loadScript() 함수는 기존 script 태그를 제거한 후 새로운 script 태그를 생성하여 js 파일을 동적으로 로드합니다. 또한 callId 변수를 통해 이미 처리된 호출인지 검사하여 중복 실행을 방지합니다.
<html>
<body>
<script>
var callId = 0;
function caller(i, func) {
if (callId < i) {
callId = i;
func();
}
}
function display() {
alert("my Function called");
}
// js 스크립트 로드
function loadScript(file) {
var myId = "gh";
var e = document.getElementById(myId);
if (e != null)
e.parentNode.removeChild(e);
var script = document.createElement("script");
script.myId = myId;
script.src = file;
document.body.appendChild(script);
}
window.setInterval(function() {
// js 파일 경로
loadScript("file:///path/generate.js");
}, 2000);
</script>
</body>
</html>핵심 포인트 정리
- caller(i, func): 전달된
i값이 현재callId보다 클 때만func()를 실행하여 중복 호출을 막습니다. - loadScript(file): id가 "gh"인 기존 script 요소를 삭제한 뒤, 새로운 script 요소를 body에 추가하여 최신 js 파일을 불러옵니다.
- setInterval(): 2000ms(2초)마다
generate.js파일을 다시 로드하여 C++이 새로 생성한 호출 명령을 지속적으로 반영합니다.
이 방식은 파일 시스템을 매개체로 사용하기 때문에 로컬 환경에서만 동작하며, 브라우저의 보안 정책에 따라 제약이 있을 수 있습니다. 따라서 실제 서비스 환경보다는 학습이나 테스트 목적에 적합한 접근 방법입니다.