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

2021.05.07 네이버 블로그 글을 이전하여 포스트 한 게시글입니다.


1) 언리얼 엔진에 NDI 플러그인 설치

아래 링크에 가면 언리얼엔진용 플러그인을 받을 수 있다.

https://www.ndi.tv/sdk/

 

NDI SDK (Software Developer Kit)

Download the royalty free NDI (Network Device Interface) Software Developer Kit to access the tools and resources to integrate native NDI support into your systems, devices, and applications.

www.ndi.tv

 


2) Unreal + NDI 송출

 

NDI송출용으로 만든 프로젝트 세팅이다.

- C++과 블루프린트는 상관없는 듯. 원하는 프로젝트의 방향에 따라 설정하면 됨

 

 

[세팅] -> [플러그인] -> [NDI IO Plugin]으로 플러그인 설정을 해준다

 

 

플러그인 설정이 끝나면 오른쪽 액티비티창에 NDI가 나타난다.

 

NDI broadCast Actor를 레벨에 배치

 

 

컴포넌트의 Media Source가 비어있을것이다.

송출용 Sender 미디어 소스를 만들어준다.

 

 

만들어진 미디어 소스를 더블클릭하면 미디어 소스의 세세한 설정을 수정 할 수 있다.

 

 

 

랜더링 타겟이 없으므로 NDI 송출할 랜더링 타겟을 설정해준다.

 

 

이제 송출용 Actor 블루프린트를 생성한다

 

 

액터 블루프린트에 NDI BroadCast Component 컴포넌트를 추가해준다.

 

 

NDI BroadCast Component 컴포넌트를 추가하면 start Broadcasting 노드로 시작이 가능하다.

 

 

간단한 송출용 블루프린트.

 

 

컴포넌트에 미디어소스가 연결되어있지않으므로 연결해준다.

 

송출 확인 영상은 아래 블로그에서 가능하다.

https://blog.naver.com/keywy0214/222341298926

 


2) Unreal + NDI 수신

송출을 했으니 이번엔 받는 리시버를 만들어보자

 

 

수신용 프로젝트 세팅.

원하는 프로젝트의 방향따라 만들면 된다

 

플러그인을 설정해주고,

 

콘텐츠 브라우저에 NDI Media Receiver를 생성해준다

[미디어] -> [NDI Media Receiver]에 존재

 

 

생성된 미디어 리시버를 더블클릭하여 미디어 텍스쳐를 만들어준다.

 

수신한 화면을 보여줄 곳을 만든다.

저의 경우, Plane을 생성했습니다

 

 

만들어진 Plane에 MediaTexture를 입힌다

 

그 후, 수신전용 액터 블루프린트를 만든다

 

NDI Receiver Component 컴포넌트를 추가한 후,

 

 

간단하게 수신용 블루프린트를 짜보았다

 

이번에도 미디어 소스를 컴포넌트에 연결해주면 완성!

'Unreal' 카테고리의 다른 글

UnrealEngine(UE4)로 외부 프로그램 (.exe) 실행/종료  (0) 2023.11.03

+ Recent posts