Palworld 어드민(Admin) 명령어 사용하기

Palworld 어드민 명령어 사용하는 방법과 명령어 목록을 알아봅시다.

 


AdminPassword 명령어로 관리자 권한 얻기

 

어드민 명령어를 사용하기 위해서는 아래 명령어를 입력하여 관리자 권한을 얻어야 합니다.

/AdminPassword {패스워드}

 

 

어드민 패스워드를 설정하지 않았거나 까먹었다면 서버 설정이 다시 필요합니다.

서버 설정하는 방법을 까먹었다면 아래 링크를 통해 확인 가능합니다. 

 

[Palworld] 팰월드 서버 설정 변경하기

 

[Palworld] 팰월드 서버 설정 변경하기

Palworld 서버 설정하기 서버 설정 방법 Ubuntu Linux nano ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini [/Script/Pal.PalGameWorldSettings] OptionSettings=(Difficulty=Casual,DayTimeSpeedRate=1.000000,NightTim

rurustory.com


어드민 명령어

 

이제 관리자 권한을 얻었으니 어드민 명령어를 사용할 수 있습니다.

/Shutdown {시간초} {메시지} 입력한 메시지 알림을 받은 후 지정한 시간(초) 후에 서버가 종료된다.
/DoExit 서버를 강제 종료한다.
/Broadcast {메시지} 서버의 모든 플레이어에게 메시지를 전송한다.
/KickPlayer {SteamID} 서버에서 플레이어를 추방한다.
/BanPlayer {SteamID} 서버로 접속하지 못하도록 밴한다.
/TeleportToPlayer {SteamID} 대상 플레이어의 현재 위치로 순간이동한다.
/TeleportToMe {SteamID} 대상 플레이어를 현재 내 위치로 순간이동한다.
/ShowPlayers 모든 플레이어의 정보를 표시한다.
/Info 서버 정보를 표시한다.
/Save 팰월드 서버 데이터를 저장한다.

 

SteamID 보는법

 

 

위와같이 관리자 권한을 얻은후 ESC를 눌러 확인을 하고 클릭하여 복사를 할 수 있습니다.

/ShowPlayers

 

또는 명령어를 사용하여 확인을 하면 됩니다.


마무리

 

https://tech.palworldgame.com/settings-and-operation/commands

 

Commands | Palworld tech guide

The commands provide operations and functions that help manage the server.

tech.palworldgame.com

위 링크 페이지를 참고하여 작성하였습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

Palworld 우분투로 4인 이상 서버 만들기

Palworld 우분투로 4인 이상 서버 만들기를 소개합니다.


  사용 OS 및 서버 요구사항

 

OS: Ubuntu 22.04.3 LTS

CPU: 4 Core

Memory: 16 GB / 32GB

Network: 8211 (UDP)


Steam CMD 설치

 

sudo apt update
sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
sudo apt install steamcmd

Palworld 서버 설치

 

steamcmd +login anonymous +app_update 2394010 validate +quit

 

이 명령어는 추후 서버 버전 업데이트 할때 동일하게 입력하여 업데이트 하시면 됩니다.


SKD64 설치

 

mkdir -p ~/.steam/sdk64/
steamcmd +login anonymous +app_update 1007 +quit
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/

방화벽 개방

 

sudo iptables -I INPUT -p tcp --dport 27015 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 27016 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 25575 -j ACCEPT
sudo iptables -I INPUT -p udp --dport 27015 -j ACCEPT
sudo iptables -I INPUT -p udp --dport 27016 -j ACCEPT
sudo iptables -I INPUT -p udp --dport 25575 -j ACCEPT
sudo iptables -I INPUT -p udp --dport 8211 -j ACCEPT

sudo iptables -S

서버 실행

 

# 서버 디렉토리 이동 #
cd ~/Steam/steamapps/common/PalServer

# 서버 구동기 실행 #
./PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS
Shutdown handler: initalize.
Increasing per-process limit of core file size to infinity.
dlopen failed trying to load:
steamclient.so
with error:
steamclient.so: cannot open shared object file: No such file or directory
[S_API] SteamAPI_Init(): Loaded '/home/ubuntu/.steam/sdk64/steamclient.so' OK.  (First tried local 'steamclient.so')

 

이런식으로 with error라고 뜨지만 정상적으로 구동 된겁니다.


서버 설정 방법

 

nano ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

 

주의: 서버를 최초 1회 실행 시켜야지만 설정 파일이 생깁니다!

.

[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=Casual,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=None,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="Default Palworld Server",ServerDescription="",AdminPassword="",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=False,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")

 

설정값을 변경하였 으면 ctrl + x 누르고 다음 y 누른뒤 엔터 저장을 해줍니다. 

 

[Palworld] 팰월드 서버 설정 변경하기

 

[Palworld] 팰월드 서버 설정 변경하기

Palworld 서버 설정하기 서버 설정 방법 Ubuntu Linux nano ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini [/Script/Pal.PalGameWorldSettings] OptionSettings=(Difficulty=Casual,DayTimeSpeedRate=1.000000,NightTim

rurustory.com

 

 

설정 목록은 위 페이지에서 좀 더 상세하게 확인 가능합니다!


마무리

 

https://tech.palworldgame.com/dedicated-server-guide

 

https://tech.palworldgame.com/dedicated-server-guide/

 

tech.palworldgame.com

위 사이트를 참고하여 작성하였습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

Palworld 서버 설정 변경하기

간단한 서버 설정 방법과 설정 목록에 대해 알아봅시다.

 


서버 설정 방법

 

Ubuntu Linux

nano ~/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=Casual,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=None,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="Default Palworld Server",ServerDescription="",AdminPassword="",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=False,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")

 

설정값을 변경하였 으면 ctrl + x 누르고 다음 y 누른뒤 엔터 저장을 해줍니다. 

 

Windows 

스팀 설치 폴더\steamapps\common\PalServer\Pal\Saved\Config\WindowsServer\PalWorldSettings.ini
[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=Casual,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.000000,PalCaptureRate=1.000000,PalSpawnNumRate=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PlayerStomachDecreaceRate=1.000000,PlayerStaminaDecreaceRate=1.000000,PlayerAutoHPRegeneRate=1.000000,PlayerAutoHpRegeneRateInSleep=1.000000,PalStomachDecreaceRate=1.000000,PalStaminaDecreaceRate=1.000000,PalAutoHPRegeneRate=1.000000,PalAutoHpRegeneRateInSleep=1.000000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=1.000000,CollectionDropRate=1.000000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=None,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bActiveUNKO=False,bEnableAimAssistPad=True,bEnableAimAssistKeyboard=False,DropItemMaxNum=3000,DropItemMaxNum_UNKO=100,BaseCampMaxNum=128,BaseCampWorkerMaxNum=15,DropItemAliveMaxHours=1.000000,bAutoResetGuildNoOnlinePlayers=False,AutoResetGuildTimeNoOnlinePlayers=72.000000,GuildPlayerMaxNum=20,PalEggDefaultHatchingTime=72.000000,WorkSpeedRate=1.000000,bIsMultiplay=False,bIsPvP=False,bCanPickupOtherGuildDeathPenaltyDrop=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="Default Palworld Server",ServerDescription="",AdminPassword="",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=False,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt")

설정목록

Difficulty 팰월드 전체 난이도 (None, Casual, Normal, Hard)
DayTimeSpeedRate 낮의 지속시간 (0.1 ~ 5.0)
NightTimeSpeedRate 밤의 지속시간 (0.1 ~ 5.0)
ExpRate 경험치 배율 (0.1 ~ 20.0)
PalCaptureRate 팰 포획 가능성 (0.5 ~ 2.0)
PalSpawnNumRate 팰 리젠 배율 (0.5 ~ 3.0)
PalDamageRateAttack 팰이 주는 데미지 배율  (0.1 ~ 5.0)
PalDamageRateDefense 팰이 받는 데미지 배율  (0.1 ~ 5.0)
PalStomachDecreaceRate 팰의 포만도 감소 배율  (0.1 ~ 5.0)
PalStaminaDecreaceRate 팰의 기력 감소 배율  (0.1 ~ 5.0)
PalAutoHPRegeneRate 팰의 HP 회복 배율  (0.1 ~ 5.0)
PalAutoHPRegeneRateInSleep 팰의 수면시 HP 회복 배율  (0.1 ~ 5.0)
PlayerDamageRateAttack 플레이어가 주는 데미지 배율  (0.1 ~ 5.0)
PlayerDamageRateDefense 플레이어가 받는 데미지 배율  (0.1 ~ 5.0)
PlayerStomachDecreaceRate 플레이어의 포만도 감소 배율  (0.1 ~ 5.0)
PlayerStaminaDecreaceRate 플레이어의 기력 감소 배율  (0.1 ~ 5.0)
PlayerAutoHPRegeneRate 플레이어의 HP 회복 배율  (0.1 ~ 5.0)
PlayerAutoHpRegeneRateInSleep 플레이어의 수면시 HP 회복 배율  (0.1 ~ 5.0)
BuildObjectDamageRate 건축물에 주는 데미지 배율 (0.5 ~ 3.0)
BuildObjectDeteriorationDamageRate 건축물의 노화 데미지 배율 (0 ~ 10)
DropItemMaxNum 월드에 드롭 가능한 아이템의 최대수 (0 ~ 3000)
CollectionDropRate 채집 아이템 드랍 배율 (0.5 ~ 3.0)
CollectionObjectHpRate 채집 오브젝트의 HP 배율 (0.5 ~ 3.0)
CollectionObjectRespawnSpeedRate 채집 오브젝트의 재생성 배율 (0.5 ~ 3.0)
EnemyDropItemRate 적이 드랍하는 아이템의 배율 (0.5 ~ 3.0)
PalEggDefaultHatchingTime 알 부화에 걸리는 시간 (0 ~ 240)
EnableInvaderEnemy 습격 이벤트 발생 여부 (True / False)
DeathPenalty 사망 패널티 (None, Item, ItemAndEquipment, ALL)
GuildPlayerMaxNum 길드 가입 가능한 최대 플레이어 수 (1 ~ 100)
EnablePlayerToPlayerDamange 플레이어끼리 데미지 줄 수 있는지 여부 (True / False)
EnableFriendlyFire 길드원끼리 데미지 줄 수 있는지 여부 (True / False)
BaseCampWorkerMaxNum 거점에서 작업하는 팰의 최대 수 (1 ~ 20)
BaseCampMaxNum 건설가능한 거점의 최대 수
WorkSpeedRate 작업속도 배율
blsPvP PVP 활성화 여부 (True / False)
CoopPlayerMaxNum 파티 최대 가능 인원
ServerPlayerMaxNum 서버 최대 인원 (1 ~ 32)
ServerName 서버 명
ServerDescription 서버 설명
AdminPassword 관리자 비밀번호
ServerPassword 서버 비밀번호
PublicPort 공용 포트 (기본값 : 8211)
PublicIP 공용 IP
RCONEnabled RCON 활성화
RCONPort RCON 포트

마무리

 

https://tech.palworldgame.com/settings-and-operation/configuration

 

Configuration file | Palworld tech guide

On this page, you can learn about server settings, game balance settings, and other items that can be set with ini files.

tech.palworldgame.com

위 링크 페이지를 참고하여 작성하였습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

 

 

728x90
반응형

extern "C"와 네임 맹글링

 

오픈소스같은 곳에 보면 extern "C"라는 문법이 종종 보이는데 처음에 보면 이게 뭐하는거지 C로 컴파일 해준다는건가? 아니면 C문법으로 바꾸어 쓰라는건가? 라고 의문이 생길겁니다. 이번엔 extern "C"가 뭐하는 녀석인지 알아봅시다. 


네임 맹글링

 

extern "C"를 알아보기 전에 네임 맹글링에 대해서 먼저 알아봅시다.

 

컴파일러들은 컴파일을 할때 다른곳에서 접근할수 있도록 심볼을 만드는 작업을 합니다. 
여기서 함수를 심볼로 만들때 심볼이름을 함수이름 그대로 생성하는 C컴파일러와 달리 C++컴파일러들은 각각 정해진 규칙에 따라 심볼이름을 변경하여 생성합니다. 
이러한 작업을 네임 맹글링이라고 하며 C와 달리 C++에서는 함수 오버로딩 같은 다형성을 지원할 수 있는 이유이기도 합니다. 

 

그러면 이제 실제로 네임 맹글링이 되고있는지 확인해봅시다.

 

test_c.c

/* C 코드 */
#include <stdio.h> 

void test()
{
	printf("extern c test!!\n");
}

int main()
{
	test();
	return 0;
}

 

test_cpp.cpp

/* C++ 코드 */
#include <iostream>
using std::cout;
using std::endl;

void test()
{
	cout << "extern c test!!" << endl;
}

int main()
{
	test();
	return 0;
}

 

컴파일

# C 컴파일 #
gcc -c test_c.c
gcc -o test_c test_c.o

# C++ 컴파일 #
g++ -c test_cpp.cpp
g++ -o test_cpp test_cpp.o

 

결과

 

readelf 명령어를 사용하여 확인해보면 실제로 C로 컴파일한 파일은 test 라는 이름으로 심볼이 생성되었고 C++로 컴파일한 파일은 _Z4testv 라는 이름으로 심볼이 생성된걸 확인할 수 있습니다.


extern "C"

 

자 그러면 이미 눈치채신 분들도 있을겁니다. 

extern "C"는 네임 맹글링을 사용하지 않는다. 라는 의미로 extern "C"를 선언하면 그 안에 모든 코드들은 네임 맹글링을 하지 않습니다.

 

그럼 실제로 네임 맹글링 작업을 안하는지 알아봅시다.

 

test_cpp_extern_c.cpp

/* C++ 코드 */
#include <iostream>
using std::cout;
using std::endl;

extern "C" 
{
	void test()
	{
		cout << "extern c test!!" << endl;
	}
}

int main()
{
	test();
	return 0;
}

 

컴파일

# C++ extern "C" 컴파일 # 
g++ -c test_cpp_extern_c.cpp
g++ -o test_cpp_extern_c.o

 

결과

 

extern "C"를 적용안한 파일에서는 _Z4testv 로 심볼이 생성되었고 extern "C"를 적용한 파일에는 C코드와 마찬가지로 test라는 이름으로 심볼이 생성된걸 확인할 수 있습니다.


마무리

 

지금까지 extern "C"와 네임 맹글링에 대해서 알아보았습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

C++ 클래스 기본적인 사용법

객체지향 언어인 C++의 클래스 사용법에 대해 알아봅시다.


접근 제어 지시자

 

public 어디서든 접근이 가능한 접근 제어 지시자이며 내부, 외부코드에서 모두 접근이 가능합니다.
private 선언한 클래스 내부에서만 접근이 가능한 접근 제어 지시자이며 외부에서 함부로 사용을 못하게 할때 사용합니다.
protected 기본적으로 private 역할을 하며 추가적으로 상속 받은 클래스에서도 접근이 가능한 접근 제어 지시자입니다.

 

 

기본적인 클래스 모양

 

class 클래스 이름
{
접근 제어 지시자:
    멤버변수
    멤버함수
};

클래스 선언부와 구현부

 

클래스 선언부: 클래스의 모양을 정의하는 곳이며 보통 헤더파일(.h파일)에 많이 정의합니다.

class TestClass
{
private:
	string stringTest;
    
public:
	void SetString(string data);
};

 

클래스 구현부: 클래스 선언부에서 정의한 함수들을 실제로 구현하는 곳입니다.

void TestClass::SetString(string data)
{
	cout << "[SetString] " << data << endl;
	stringTest = data;
}

생성자와 소멸자

 

생성자: 클래스 객체를 생성할때 자동으로 호출되는 함수 입니다. 사용자가 따로 코드작성을 하지 않으면 컴파일러가 알아

 

생성자 선언부

class TestClass 
{
public:
	TestClass();
};

 

생성자 구현부

TestClass::TestClass() 
{
	cout << "Init TestClass!!" << endl;
}

 

소멸자: 생성자와 반대로 클래스 객체가 소멸할때 자동으로 호출되는 함수 입니다. 생성자와 마찬가지로 사용자가 따로  코드작성을 하지 않으면 컴파일러가 알아서 아무런기능이 없는 함수로 만들어 실행합니다.

 

소멸자 선언부

class TestClass 
{
public:
	~TestClass();
};

 

소멸자 구현부

TestClass::~TestClass() 
{
	cout << "End TestClass!!" << endl;
}

클래스 객체 생성 및 사용

 

이제 앞에서 생성한 클래스로 객체를 만들어 사용하는 방법을 알아보겠습니다.

void main() 
{
	/* TestClass 클래스를 obj 이름으로 객체 생성 */
	TestClass obj = TestClass();

	/* 객체 함수 호출 */
	obj.SetString("Ruru TestString");
}

전체 예제 코드

 

헤더파일(.h파일)

#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;

class TestClass 
{
private:
	string stringTest;
	bool boolTest;
	int intTest;

public:
	TestClass();
	~TestClass();

	void SetString(string data);
	void SetBool(bool data);
	void SetInt(int data);

	string GetString();
	bool GetBool();
	int GetInt();
};

.

cpp파일

#include "ctest.h"

TestClass::TestClass() 
{
	cout << "Init TestClass!!" << endl;
}
TestClass::~TestClass() 
{
	cout << "End TestClass!!" << endl;
}

void TestClass::SetString(string data) 
{
	cout << "[SetString] " << data << endl;
	stringTest = data;
}
void TestClass::SetBool(bool data) 
{
	cout << "[SetBool] " << data << endl;
	boolTest = data;
}
void TestClass::SetInt(int data) 
{
	cout << "[SetInt] " << data << endl;
	intTest = data;
}

string TestClass::GetString() 
{
	return stringTest;
}
bool TestClass::GetBool() 
{
	return boolTest;
}
int TestClass::GetInt() 
{
	return intTest;
}

void main() 
{
	/* TestClass 클래스를 obj 이름으로 객체 생성 */
	TestClass obj = TestClass();

	/* 객체 함수 호출 */
	obj.SetString("Ruru TestString");
	obj.SetBool(true);
	obj.SetInt(200);
    
	cout << "[GetString] " << obj.GetString() << endl;
	cout << "[GetBool] " << obj.GetBool() << endl;
	cout << "[GetInt] " << obj.GetInt() << endl;
}

 

마무리

 

이상 C++ 클래스 기본적인 사용법에 대해 알아보았습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

 

728x90
반응형

 

다양한 방법으로 C++ DLL String 사용하기

 

C#에서 C++로 문자열을 전달을 해줄때 자동으로 데이터를 맞춰주지만 C++에서 C#으로 문자열을 전달 할때는 수동으로 데이터를 맞춰야 합니다.
지금부터 다양한 방법으로 C++문자열을 C#에서 사용하는 방법을알아봅시다.


방법 1. PtrToStringAnsi 함수를 사용하여 Marshalling 하기

 

C++

const char* stringTest() 
{
	string testStr = "Ruru Test C++ String !!!";
	return testStr.c_str();
}

C#

using System;
using System.Runtime.InteropServices;
class Program
{
    [DllImport("StringTest.dll", CallingConvention = CallingConvention.Cdecl)]
    static private extern IntPtr stringTest();

    static void Main(string[] args)
    {
    	IntPtr stringPtr = stringTest();
        string testStr = Marshal.PtrToStringAnsi(stringPtr);
        Console.WriteLine(testStr);
        Console.ReadKey();
        //초기화
        Marshal.FreeHGlobal(stringPtr);
    }
}

 

C++의 const char*를 IntPtr 형태로 받아 PtrToStringAnsi 함수를 사용하여 string으로 변환하는 방법입니다.

Marshal 클래스를 사용하기 위해서는 System.Runtime.InteropServices를 추가해야 사용할 수 있습니다.

메모리 누수 방지를 위해 문자열 사용이 끝났으면 꼭 FreeHGlobal 함수를 사용하여 초기화 해주어야합니다.


방법 2. PtrToStringUni 함수를 사용하여 Marshalling 하기

 

C++

const wchar_t* stringTest() 
{
	string testStr = "Ruru Test C++ String !!!";
	wstring testUni(testStr.begin(), testStr.end());
	return testUni.c_str();
}

 

C#

using System;
using System.Runtime.InteropServices;
class Program
{
    [DllImport("StringTest.dll", CallingConvention = CallingConvention.Cdecl)]
    static private extern IntPtr stringTest();

    static void Main(string[] args)
    {
    	IntPtr stringPtr = stringTest();
        string testStr = Marshal.PtrToStringUni(stringPtr);
        Console.WriteLine(testStr);
        //초기화
        Marshal.FreeHGlobal(stringPtr);
    }
}

 

C++의 const wchar_t*를 IntPtr 형태로 받아 PtrToStringUni 함수를 사용하여 string으로 변환하는 방법입니다.

Marshal 클래스를 사용하기 위해서는 System.Runtime.InteropServices를 추가해야 사용할 수 있습니다.

메모리 누수 방지를 위해 문자열 사용이 끝났으면 꼭 FreeHGlobal 함수를 사용하여 초기화 해주어야합니다.


방법 3. ICustomMarshaler를 사용하여 커스텀 Marshalling하기

 

C++

const char* stringTest() 
{
	string testStr = "Ruru Test C++ String !!!";
	return testStr.c_str();
}

 

C#

using System;
using System.Runtime.InteropServices;
internal class StringCustom : ICustomMarshaler
{
    #region ICustomMarshaler Members

    public void CleanUpManagedData(object ManagedObj) { }

    public void CleanUpNativeData(IntPtr pNativeData) { }

    public int GetNativeDataSize()
        => -1;

    public IntPtr MarshalManagedToNative(object ManagedObj)
    {
        throw new NotSupportedException();
    }

    public object MarshalNativeToManaged(IntPtr pNativeData)
        => Marshal.PtrToStringAnsi(pNativeData);

    #endregion

    public static ICustomMarshaler GetInstance(string cookie)
    {
        if (cookie == null)
        {
            throw new ArgumentNullException(nameof(cookie));
        }

        var result = new StringCustom();

        return result;
    }
}

class Program
{
    [DllImport("StringTest.dll", CallingConvention = CallingConvention.Cdecl)]
    [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StringCustom))]
    static private extern string stringTest();

    static void Main(string[] args)
    {
        string testStr = stringTest();
        Console.WriteLine(testStr);
        Console.ReadKey();
    }
}

 

사용자 커스텀 클래스인 ICustomMarshaler 를 사용하여 string으로 리턴받는 방법입니다.

속도가 느려 퍼포먼스가 필요한 코드라면 비추천하는 방법입니다.


방법 4. StringBuilder 함수를 사용하여 C++에서 직접 복사 하기

 

C++

int stringTest(char* buffer) 
{
	string testStr = "Ruru Test C++ String !!!";
	strcpy(buffer, testStr.c_str());
	return testStr.size();
}

 

C#

using System;
using System.Text;
class Program
{
    [DllImport("StringTest.dll", CallingConvention = CallingConvention.Cdecl)]
    static private extern int stringTest(StringBuilder buffer);

    static void Main(string[] args)
    {
        StringBuilder testBuffer = new StringBuilder(100);
        stringTest(testBuffer);
        Console.WriteLine(testBuffer.ToString());
        Console.ReadKey();
    }
}

 

StringBuilder를 이용하여 C++에 buffer를 전달하고 C++에서 문자열을 복사하여 사용하는 방법입니다.

 

StringBuilder를 사용하기 위해서는 System.Text 를 추가하여야 사용할 수 있습니다.


마무리

 

지금까지 다양한 방법으로 C++문자열을 C#에서 사용하는 방법을 알아보았습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

 

728x90
반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] 클래스 구조의 C++ DLL 사용하기  (0) 2024.04.25

+ Recent posts