2021.05.10 네이버 블로그에 게시한 글을 이전하였습니다.
언리얼엔진 C++로 외부의 exe 파일을 실행하고 끄는 코드를 작성하기
*소스코드는 페이지 제일 아래에 있습니다
1) UE4에서 외부파일 실행시키기
c++ 액터 클래스를 생성한다.
레벨블루프린트에서 테스트하기위하여 액터클래스로 생성했다
헤더파일(.h)
const FString& AppPath 로 지정해서 Path를 블루프린트에서 수정할 수 있게하였다.
소스파일(.cpp)
FPlatformProcess::CreateProc
을 사용하면 지정위치의 파일을 실행시키는 것이 가능하다.
Path에 로컬 패스를 넣어 언리얼에서 유니티 빌드파일을 실행할 수 있다.
2) 외부파일 실행 성공 여부 알아보기
헤더파일(.h)
실행 결과를 확인하기위하여 bool& Result를 추가했다.
result값에 따라, 성공/실패를 보여주도록 하였다.
성공적으로 실행되었다.
3) 관리자의 권한이 필요한 파일 실행
일반 파일은 실행하는데에 문제가 없었는데, 관리자권한이 필요한 파일(예)Setup파일)은 실패하는것을 발견했다.
그래서, 관리자 권한이 필요한지 한번 더 확인하기로하였다.
소스파일(.cpp)
FPlatformProcess::ExecElevatedProcess
를 사용하면 관리자의 권한이 필요한 경우, 관리자의 권한을 묻게된다
4) 실행한 프로그램 프로세스 ID 저장
후에 프로그램을 종료하기위하여 현재 실행시킨 프로그램파일의 프로세스 ID를 저장한다
헤더파일(.h)
int& ProcessId를 추가하여 프로세스 ID를 블루프린트상에서 저장할 수 있게한다
소스파일(.cpp)
5) 실행중인 프로그램 종료하기
헤더파일(.h)
저장해뒀던 프로세스ID를 파라미터로 넘긴다.
프로세스 ID가 실행중인지 확인하는 bool값을 return 받는다
소스코드(.cpp)
FPlatformProcess::OpenProcess 함수를 이용하면 프로세스ID로부터 ProcHandle을 받아올 수 있다.
이때 받아온 ProcHandle을 FPlatformProcess::IsProcRunning 를 이용해 실행중인지 확인한다.
프로세스가 실행중이라면 FPlatformProcess::TerminateProc 를 이용하여 프로그램을 종료한다.
마지막으로, FPlatformProcess::CloseProc 를 이용하여 ProcHandle도 닫아주도록한다.
5) 최종 테스트
프로그램을 실행시키기위한 블루프린트 코드
프로그램을 종료시키기위한 블루프린트 코드
↓[헤더파일.h]
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "RunExternalTest.generated.h"
UCLASS()
class NDIBROADCASTER_API ARunExternalTest : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ARunExternalTest();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UFUNCTION(BlueprintCallable, Category = "ControlExternalFiles")
void RunExternalExeFile(const FString& AppPath, bool& Result, int& ProcessId);
UFUNCTION(BlueprintCallable, Category = "ControlExternalFiles")
void TerminateExternalProgram(const int& ProcessId, bool& IsRunning);
UFUNCTION(BlueprintCallable, Category = "ControlExternalFiles")
void GetExecutableName(const FString& FileName, bool& result);
};
↓[소스파일.cpp]
// Fill out your copyright notice in the Description page of Project Settings.
#include "RunExternalTest.h"
// Sets default values
ARunExternalTest::ARunExternalTest()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void ARunExternalTest::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void ARunExternalTest::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
/// <summary>
/// 외부파일 실행
/// </summary>
void ARunExternalTest::RunExternalExeFile(const FString& AppPath, bool& Result, int& ProcessId)
{
//프로세스ID
uint32 OutProcessId = 0;
ProcessId = 0;
Result = false;
//파일실행
FProcHandle Proc = FPlatformProcess::CreateProc(*AppPath, NULL, true, false, false, &OutProcessId, -1, nullptr, nullptr);
if (Proc.IsValid())
{
//실행되었을경우 Result에 True 리턴
ProcessId = OutProcessId;
Result = true;
}
else {
//만약 실행되지않았을경우, 관리자의 권한으로 재실행
Result = FPlatformProcess::ExecElevatedProcess(*AppPath, NULL, nullptr);
}
}
/// <summary>
/// 실행중인 외부파일 닫기
/// </summary>
void ARunExternalTest::TerminateExternalProgram(const int& ProcessId, bool& IsRunning)
{
//Uint로 ProcHandle을 받아옴
uint32 ProcessIdUint = ProcessId;
FProcHandle Proc = FPlatformProcess::OpenProcess(ProcessIdUint);
//실행중인지 확인
IsRunning = FPlatformProcess::IsProcRunning(Proc);
if (IsRunning)
{
//실행중이라면 닫는다
FPlatformProcess::TerminateProc(Proc);
FPlatformProcess::CloseProc(Proc);
}
}
/// <summary>
/// 파일 실행중 확인
/// </summary>
void ARunExternalTest::GetExecutableName(const FString& FileName, bool& result)
{
FString Name = FileName;
result = FPlatformProcess::IsApplicationRunning(*Name);
}
최종테스트. 실행과 종료가 잘 되는것을 확인할 수 있다 :)
'Unreal' 카테고리의 다른 글
Unreal Engine 으로 NDI 영상보내기/받기 (0) | 2023.11.03 |
---|