반응형

Convert String^ to const char*

//String^을 const wchar_t*
#include " vcclr.h"
using namespace System;
using namespace System::Runtime::InteropServices;

//String^ 을 const char*
  String^ fileName = "name";
  const char* filePath = (const char*)(Marshal::StringToHGlobalAnsi(fileName)).ToPointer();
  Marshal::FreeHGlobal((IntPtr)(char*)filePath); // 반드시 호출해 줘야함. 안하면 memory leak 

Convert const char* to String^

using namespace System;
using namespace System::Runtime::InteropServices;

String^ ConvertCharPtrToString(const char* text)
{
    String^ resultStr =  Marshal::PtrToStringAnsi((IntPtr)(char*)text);
    return resultStr;
}

Convert strint to STring^

#include <windows.h>
#include <string>
using namespace System;
using namespace System::Runtime::InteropServices;

String^ ConvertstringToStringCli(std::string text)
{
    String^ resultStr = gcnew String(text.c_str());
    return resultStr;
}

'Programing > C++|CLi' 카테고리의 다른 글

C++ Managed , Exception Catch & Handling  (0) 2022.08.23
C++/CLI 에서 Lock 거는 법  (0) 2019.12.03
반응형

* C++/cli c# Unmanaged code -> managed Code 이벤트 호출.

1. C++에서 FucntionPointer를 만든다.
2. C++/Cli에서 2개의 Delegate Type을 정의한다. 
 1) C# 으로 Event Raise할 대리자
 2) C++ 에서 C++/Cli의 함수를 실행 할 FucntionPointer에 할당할 대리자.
3. Cli 객체에서 맴버에 Event(C# Binding위한)와 Delegate를 선언한다. --> C#으로 Event Raise를 위한 작업.
 
4. OnFireEvent함수를 만들어서  C++ functionPointer에 Assign한다.
5. C++ Unmanaged Code에서 FucntionPointer에 할당된 함수를 실행 시켜서 C++/cli 맴버 함수를(OnFireEvent)를 실행 시킨다.
6. OnFireEvent함수에서 C++/Cli 이벤트를 Raise한다.

 

 

Code

//C++ Unmanaged Code
typedef void(__stdcall *FunctionPointer)(int id);

class TestUnmanageObj
{
public:
    void TestFireMethod()
    {
        m_fucntionPtr(123); //Excute C++/Cli managed Fucntion Call
    }
    void SetFucntionSelPointer(FunctionPointer funcPointer)
    {
        m_fucntionPtr = funcPointer;
    }

private:
FunctionPointer m_fucntionPtr;
};



//C++ Unmanaged Code
typedef void(__stdcall *FunctionPointer)(int id);

class TestUnmanageObj
{
public:
    void TestFireMethod()
    {
        m_fucntionPtr(123); //Excute C++/Cli managed Fucntion Call
    }
    void SetFucntionSelPointer(FunctionPointer funcPointer)
    {
        m_fucntionPtr = funcPointer;
    }

private:
FunctionPointer m_fucntionPtr;

};

//C++/Cli managed Code

//Header
#include "stdafx.h"
#pragma once
using namespace System;
using namespace System::Runtime::InteropServices;

namespace TestCliNamespace {

    //Managed Code C++/Cli

    public delegate void SelectedDelegateCSharp(Object ^j);//For c# Raise
    public delegate void SelectedDelegateCplus(int i); //for C++ Raise


    //Header

    public ref class TestCli
    {
    public:
        TestCli();
        ~TestCli();
        event SelectedDelegateCSharp ^SelctedEventHander
        {
            void add(SelectedDelegateCSharp ^d)
            {
                m_SolidSelDelegate += d;
            }
            void remove(SelectedDelegateCSharp ^d)
            {
                m_SolidSelDelegate -= d;
            }
            void raise(Object ^args)
            {
                SelectedDelegateCSharp ^temp = m_SolidSelDelegate;
                if (temp)
                {
                    temp->Invoke(args);
                }
            }
        }

        void TestRaiseMethod()
        {
            m_testObj->TestFireMethod();
        }

    protected:
        void OnFireEntitySelect(int id);
        SelectedDelegateCSharp ^m_SolidSelDelegate;
        GCHandle^ m_fireSolidSelectEventDelegateHandle;
        TestUnmanageObj *m_testObj;
    };
}


//Body


#include "stdafx.h"
#include "TestCli.h"


TestCliNamespace::TestCli::TestCli()
{
    m_testObj = new TestUnmanageObj();
    auto entityDelegate = gcnew SelectedDelegateCplus(this, &TestCli::OnFireEntitySelect); //Member Function to Delegate
    auto delegateHandlerPtr = Marshal::GetFunctionPointerForDelegate(entityDelegate); //Convert Delegate to functionPointer
    m_fireSolidSelectEventDelegateHandle = GCHandle::Alloc(delegateHandlerPtr);          //prevent GCCollect
    m_testObj->SetFucntionSelPointer(static_cast(delegateHandlerPtr.ToPointer())); //C++ objec Set FunctionPointer
}

TestCliNamespace::TestCli::~TestCli()
{
    m_fireSolidSelectEventDelegateHandle->Free(); //Release Delegate Handle
}

void TestCliNamespace::TestCli::OnFireEntitySelect(int id)
{
    SelctedEventHander(gcnew Object()); //Raise Event To C#
}

'Programing > C++' 카테고리의 다른 글

열혈강의 c++ 정리  (0) 2019.11.22
반응형

만약 로컬에 커밋을 하고 서버에 push까지 했는데 이걸 예전커밋으로 돌려야할 경우가 있다.

이럴 경우 3가지 방법이 있다.


1. Revert 를 이용 하자.


git revert <hashcode> // 해당 커밋내용의 반대되는 내용으로 커밋한다.

       //코드를 추가 했다면 , 삭제하고, 수정했다면 원복하는 커밋이 생긴다.


git revert -n OLDER_COMMIT^..NEWER_COMMIT // Commit Range를 줘서 한번에 여러개의 Commit을 Revert할 때 쓰인다.


만약 돌아가려는 위치까지 커밋이 여러개라면 위에서 부터 순차적으로 Revert를 진행해줘도 하나씩 반대되는 커밋을 생성하면서

원래대로 RollBack을 시켜야 하는 불편함이 있다.

위 커맨드로 실행을 하고 오류가 발생하지 않았다면, 서버에 Push하면 롤백이 완성되었다고 할 수 있다.


주의) 만약에 이미 내가 서버에 올린 소스를 다른사람이 수정해서 중간에 다른 사람의  커밋이 섞여 있다면, Revert중간에 오류가 발생할 소지 가         있다고 생각한다.


2. Reset 이용하자.(위험 하지만 , 간단하다.)


git reset --hard <hashcode> //rollback하고 싶은 시점의 커밋으로 돌린다.


git push origin +master  //강제로 현재 상태를 서버에 Update한다. origin , master 는 자신의 remote 이름과 브랜치 이름에 따라서 바뀔것이고 ,                                 //중요한건 "+" 이 기호이다 이게 강제로 overwrite하겠다는 커맨드 인것 같다.

                                 //이커맨드를 실행하면 정말로 push 할것 인지 확인을 위한 Git Password를 확인한다.

    //아마도 리스크가 큰 커맨드라서 확인을 하는 것 같다.


주의) 만약 내가 올린 코드를 누군가 받아서 이미 작업을 했다면, 그동안 롤백을 진행했고 , 다른 사용자가 이미 받은 코드로 작업을 해서 올린다면

 어떤 오류가 발생할지 난 알 수 없다. ^^;


반응형

git init
//만약에 .git 파일이 없다면 이 커맨드를 입력

git remote add origin <server repo url>
git push --mirror

위와 같이 하면 Local Git의 히스토리 까지 모두 서버로 옮길 수 있다.


만약에 제대로 Remote 서버가 등록 되었는지 알아보려면 아래의 커맨드를 실행하면 알 수 있다.


git remote -v

'Tools > GIT Tutorial' 카테고리의 다른 글

Git SubModule 사용하기  (0) 2017.08.30
Git Server에 커밋을 RollBack해야 할 때  (0) 2017.04.20
Git Alias [유용한 나의 Alias]  (0) 2016.12.01
Git Log Filtering  (0) 2016.11.17
Git 자주 사용하는 Command  (0) 2016.08.27

+ Recent posts