라벨이 mfc인 게시물 표시

MFC 레지스트리 읽고 쓰기

2005년도인가 만들었던(짜집었던) 레지스트리 클래스입니다. 참 쉽죠잉~ /*---------------------------------------------------------------------  레지스트리로 부터 Int형 값을 읽어들이는 함수  ----------------------------------------------------------------------*/  static UINT RegReadInt( HKEY hKey,   LPCTSTR lpKey,   LPCTSTR lpValue,   INT nDefault )  {   HKEY key;   DWORD dwDisp;   UINT Result;   DWORD Size;   if( RegCreateKeyEx( hKey, lpKey, 0, NULL,    REG_OPTION_NON_VOLATILE, KEY_READ, NULL,    &key, &dwDisp ) != ERROR_SUCCESS )    return 0;   Size = sizeof( LONG );   if( RegQueryValueEx( key, lpValue, 0, NULL, (LPBYTE)&Result, &Size ) != ERROR_SUCCESS )    Result = nDefault;   RegCloseKey( key );   return Result;  } /*------------------------------------------------------------------...

c# 구조체 <-> mfc 구조체

이미지
사실 c#에서 구조체따위!!! 사용하지 않습니다. 거의 다 class 로 만들어서 사용하죠. c# 에서 구조체는 Value Type 입니다. 클래스는 reference 형입니다. 구조체는 단순히 데이터의 집합이기때문에 실제적을 값을 복사/대입 등등이 벌어지나 클래스는 메모리 주소만 바뀌기 때문에 실제 연산시 구조체보다 클래스가 월등한 속도의 차이를 보여주며 구조체는 많은 데이터를 입출력하기엔 스택을 너무 잡아먹어서 연산이 점점 느려지기 때문입니다. mfc 혹은 c++ 에서 아래와 같은 구조체를 선언했다고 칩시다. struct Test_Struct {       public float m_float[4];       public unsinged short meter;       public byte m_byte[8]; } ; 여기서 중요한점은 구조체를 꼭 패킹을 해주어야 합니다. #pragma pack(1) 이놈을 선언해줘야 하죠. Visual C++ 에서는 기본적으로 4바이트씩 할당이 됩니다. 즉 1바이트를 선언해도 실제적으로 4바이트를 먹어버리는거죠. sizeof(구조체) 했을때 크기의 차이를 보이는건 이때문입니다. 이것을 방지하기 위해 패킹을 #pragma pack(1)로 해주어서 1바이트는 진짜 1바이트만 사용하게 바꿔줘야 합니다. 그리고 함수에서 사용을 합니다. extern "C" __declspec(dllexport) int DLL_CalMyStruct(Test_Struct * test) {      .      .      . } 자 이제 c# 쪽에서도 구조체를 선언해줍시다. [StructLayout(LayoutKind.Sequential, Pack = 1...

c# string 에서 mfc의 LPCTSTR간의 변환

이미지
mfc 로 만들 DLL 함수중 문자열을 인자로 받는 함수가 있었습니다. 처음 dll을 만들때는 CString으로 만들었었죠. 결과적으로 c# 에서 string을 바로 CString으로 변환하는 방법은 래핑하는 방법밖에 없었구요(잘 찾아보면 있을지도..) 그래서 CString 으로 선언된 인자를 LPCTSTR로 변경하였습니다. extern "C" __declspec(dllexport) int DLL_SetFile(LPCSTR filePath) { CString path(filePath); . . . . } 이런식으로 만들어서 인자값을 간단하게 CString으로 변화하여 MFC에서는 사용을 합니다. 자 그럼 c#에서 이 함수를 어떻게 사용하느냐.. 일단 string값을 바로 대입할 수 는 없습니다. 변환을 한번 해줘야 하는데 바로 IntPtr값으로 변환을 한번 해주어야 합니다. IntPtr 형식은 그 크기가 플랫폼마다 고유한 정수로 디자인되었습니다. 즉, 이 형식의 인스턴스는 32비트 하드웨어 및 운영 체제에서는 32비트로, 64비트 하드웨어 및 운영 체제에서는 64비트여야 합니다. IntPtr 형식은 포인터를 지원하는 언어에서 사용할 수 있으며, 포인터를 지원하는 언어와 포인터를 지원하지 않는 언어 사이에서 데이터를 참조하는 일반적인 방법이 됩니다. 핸들을 보관하는 데도 IntPtr 개체를 사용할 수 있습니다. 예를 들어, IntPtr 의 인스턴스는 파일 핸들을 보관하기 위해 System.IO . . :: .  FileStream 클래스에서 광범위하게 사용됩니다. IntPtr 형식은 CLS 규격이지만, UIntPtr 형식은 그렇지 않습니다. 공용 언어 런타임에서는 IntPtr 형식만 사용됩니다. UIntPtr 형식은 IntPtr 형식과의 구조적 대칭을 유지하기 위해 주로 사용됩니다. 이 형식은 ISerializable 인터페이스를 구현합니다 간단한 함수를 하나 만들...