닷넷4.0에서 네이티브코드와 매나지드코드의 동거 part 2-1.

CLR 2010. 8. 10. 18:00 Posted by 알 수 없는 사용자
이번에는 저번 강좌에 이어서 클래스를 다뤄 보도록 하겠습니다.

약간 강좌가  외전으로 빠지는데요. ^^;

우선 명시적인 방법으로....

네이티브 코드에서 네이티브코드DLL로 작성된 클래스를 얻는 전통적인 방법부터 알아 보도록 하겠습니다.

class __declspec(dllexport) CTest {
public:
int Add(int a,int b);

static CTest *Create();
static void Delete(CTest* pobj);
};

int CTest::Add(int a,int b)
{
return a+b;
}

CTest* CTest::Create()
{
return new CTest();
}

void CTest::Delete(CTest* pobj)
{
delete pobj;
}

이와 같이 클래스를 선언해줍니다.  외부에서 동적으로 클래스를 참조하기 위해서는 ' __declspec(dllexport) ' 가 꼭 필요합니다.


사용하는 쪽에서는 다음과 같이 클래스를 정의만 해줍니다.



암시적접근은 정적 라이브러리 쓰는것과 동일하지만 명시적으로 접근 할때는 다음과 같이 펙토리 함수등을 통해서 객체를 직접 얻어와야 합니다.



정적 함수인 Create의 함수 포인터를 이용해서 객체에 대한 인스턴스를 직접 얻어옵니다. 이것을 this포인터로 사용합니다.
외부 참조 가능한 클래스멥버함수의 호출규약은 첫번째인자에 this포인터를 넘겨주도록 정해져있습니다. 

CTest::Add 함수의 포인터를 얻어와 첫번째 인자로 방금 얻은 객체 포인터를 넘겨줍니다.

pCalAdd(pCalc,10,7);

pCalc는 Create함수를 통해 얻어진 CTest클래스의 인스턴스포인터 입니다.
pCalAdd는 CTest::Add의 함수 포인터 입니다.

여기서  GetProcAddress 로 넘겨주는 함수이름이 [?Create@CTest@@SAPAV1@XZ] 처럼 이상한데요. 이유는 C++컴파일러가 외부 참조가능하도록 전통적인 c언어형식으로 함수를 다시 만들기 때문입니다.

원래는 2강좌로 마칠려고 했는데 쓰다보니 약간 두서 없이 방향이..... ㅡ.ㅡ;;;

다음번엔 진짜로 매나지드 코드와 네이티브 클래스 연결법에 대해서 알아보도록 하겠습니다. ^^;