일하다가 C# UI로 파일 다이얼로그를 열어서 "경로\파일명.확장자명"을 c++ dll로 전달해서 처리할 일이 있어서
삽질하다가 블로그 및 MSDN에서 얻은 성과입니다.
MSDN 그는 신이야!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | // // 파일명.cs [C#] // WrapperClass wc; // C++ dll Wrapper 클래스 OpenFileDialog fileDialog = new OpenFileDialog(); // 파일 다이얼로그 열기 DialogResult dr = fileDialog.ShowDialog(); bool result = true; // 파일명 전달 결과 if(dr == DialogResult.OK) // 파일 다이얼로그 확인 눌렀을 때 { string fileName = fileDialog.Filename; // 로그파일경로\파일명.확장자 result = wc.SetFileName(fileName); if(!result) { MessageBox.Show("파일 열기 실패", "메시지 박스명", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } // // 파일명.cpp [C++] // #include "msclr\"marshal.h" using namespace msclr::interop; bool WrapperClass::SetFileName(String^ _fileName) // C++ dll Wrapper 클래스 { bool result = true; marshal_context^ context = gcnew marshal_context(); const char* tempFileName = context->marshal_as<const char*>(_fileName); // System::String을 const char*로 변환 string fileName = tempFileName; // const char*를 string으로 변환 delete context; return result; } | cs |
요약:
marshal_context를 생성하여 System::String을 const char*로 변경후에 string으로 변환하여 해결함
참고사이트:
https://six605.tistory.com/386
https://docs.microsoft.com/en-us/cpp/dotnet/marshal-context-class?view=msvc-170