C++ 에 작성된 함수 코드
MCAPI MC_RV MC_CreateObject(IN MC_HSESSION hSession, IN MC_UCHAR *pData, IN MC_UINT nLength, OUT MC_HOBJECT *phObject);
C#에서 dll을 참조하여 선언한 함수 코드
[DllImport("MagicCrypto32V20.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int MC_CreateObject(ulong hsession, ref char *pData, uint nLength, ref ulong *phObject);
C#에서 실제 함수를 호출 하는 코드
unsafe
{
ulong hkey;
ulong* hhkey = &hkey;
char[] key = new char[64];
key[0] = Convert.ToChar(0x11);
key[1] = Convert.ToChar(0xd9);
key[2] = Convert.ToChar(0xa6);
key[3] = Convert.ToChar(0x62);
key[4] = Convert.ToChar(0xc7);
key[5] = Convert.ToChar(0x62);
key[6] = Convert.ToChar(0xeb);
key[7] = Convert.ToChar(0x6e);
key[8] = Convert.ToChar(0xa9);
key[9] = Convert.ToChar(0x39);
key[10] = Convert.ToChar(0x27);
key[11] = Convert.ToChar(0xba);
key[12] = Convert.ToChar(0x82);
key[13] = Convert.ToChar(0x45);
key[14] = Convert.ToChar(0x79);
key[15] = Convert.ToChar(0xe3);
key[16] = Convert.ToChar(0xa9);
key[17] = Convert.ToChar(0x57);
key[18] = Convert.ToChar(0xec);
key[19] = Convert.ToChar(0xba);
key[20] = Convert.ToChar(0x50);
key[21] = Convert.ToChar(0xf0);
key[22] = Convert.ToChar(0x2b);
key[23] = Convert.ToChar(0xb9);
key[24] = Convert.ToChar(0x87);
key[25] = Convert.ToChar(0x87);
key[26] = Convert.ToChar(0x78);
key[27] = Convert.ToChar(0xa7);
key[28] = Convert.ToChar(0xc2);
key[29] = Convert.ToChar(0xf7);
key[30] = Convert.ToChar(0x53);
key[31] = Convert.ToChar(0x28);
fixed(char* ckey = key)
{
result = CCrypto.MC_CreateObject(CConst.hsession, ckey, CConst.keylen, ref hhkey);
}
}
코드 내용이 부족하다면 더 올리겠습니다.
질문.
1. DLLImport를 이용해서 선언한 함수 형식이 C++로 만든 함수 코드와 동일한 형식이 맞는지요?
2. 함수 호출하는 부분에서 포인터와 주소번지를 파라미터로 사용하는데, out 도 써보고, ref도 써보고 했었는데, 빌드 할때는 그냥 넘어가는데 프로그램 실행하면 '보호 된 메모리 를 읽 거나 쓰려고 했습니다'라는 오류와 함께 프로그램이 중단됩니다.
제가 묻고자하는 것은 C++ 함수를 호출하기 위해서 char배열과 ulong 타입 변수의 주소번지를 어떤 방식으로 넘길 수 있는지 입니다.
위의 두가지가 해결되면 다른 부분을 진행 할 수 있을것 같은데 위의 함수 에서 막혀서 며칠동안 고생을 좀 하고 있네요...
초면에 장문의 질문을 드려 죄송합니다...
[최초 등록일: ]
[최종 수정일: 6/3/2016]