기본 콘텐츠로 건너뛰기

4월, 2014의 게시물 표시

C++ 구조체 포인터의 값을 C# 구조체 배열로 가져오기

원문보기 C++  구조체 포인터의 값을  C#  구조체 배열로 가져오기 -         C++ Struct 1 typedef   struct   _DATASTRUCT  {          wchar_t   name [20];          wchar_t   path [255];          int   level ; }  DATASTRUCT , * LPDATASTRUCT ; -      C# Struct 1 [ StructLayout ( LayoutKind . Sequential ,  CharSet = CharSet . Unicode )] public   struct   DATASTRUCT { [ MarshalAs ( UnmanagedType . ByValTStr ,  SizeConst  = 20)] public   string   name ;        [ MarshalAs ( UnmanagedType . ByValTStr ,  SizeConst  = 255)] public   string   path ; public   int   level ; } C++  과  C#  의 구조체는 앞과 같다 . -      C#  예제 코드 int   MAX_COUNT  = 10; DATASTRUCT []  dataStructs ;  [ DllImport ( @".\SendDataObject.dll" ,  CharSet  =  CharSet . Unicode )] private   static   extern   int   GetDatas ( DATASTRUCT []  dataStruct ,  int bufSizeCount ,  ref   IntPtr   returnPtr ); . . IntPtr   returnPtr  =  IntPtr . Zero ; dataStructs  =  new

C# Interop – C#과 C API의 상호운영

원문보기 C# 은 매우 강력한 각종 기능과 Class를 제공하지만, Windows Application의 작성을 위해서는 C로 작성된 Library를 사용하여야 하는 경우가 많이 발생된다. C#은 기본적으로 C의 Pointer를 지원하지 않고, Managed Code의 메모리 관리 체계는 근본적으로 C(Unmanaged Code)와 차이가 많기 때문에 C와의 호환을 위해서는 특수한 기법을 사용하여야 가능하다. C#은 이를 위하여 PInvoke와 Marshaling 등의 기능을 제공한다 . ? 1. Using C DLL (PInvoke : Plaform Invocation Service) C# 은 C DLL의 Unmanaged Function을 호출할 수 있도록 플랫폼 호출 서비스 (PInvoke)를 제공한다. 이는 일반적인 C로 작성된 DLL이나 Win32 API를 호출하는 용도로 사용된다 . ? 1.1 DLL  함수의 정의 PInvoke 를 이용하여 Win32 API를 정의하는 방법은 “DllImport” 속성을 사용한다. DllImport 속성은 “DllImportAttribute” Class를 사용하는데, 이 Class의 생성자는 아래와 같다 . public DllImportAttribute( string dllName) 즉, 사용하고자 하는 DLL의 파일명을 파라미터로 가지므로, DllImport 속성은 DLL의 파일명을 정의하고, 실제 사용하고자 하는 함수는 속성 하단의 함수선언에 의하여 정의된다 . ? [user32.dll 의 MessageBox 함수의 정의 ] using System.Runtime.InteropServices [DllImport(“user32”)] public static extern int MessageBox( int hWnd, String pText, String pCaption, int uType); 위와 같이 선언하면 C# Code내에서 “MessageBo