Microsoft MVP성태의 닷넷 이야기
글쓴 사람
Jeahoon Jeong (wildcats at paran.com)
홈페이지
첨부 파일
 

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]


비밀번호

댓글 작성자
 



2016-06-03 06시12분
이런 경우, C++ DLL과 C# 코드를 함께 만들어 보세요. 답이 나올 것입니다. 만든 그 최소한의 예제코드로도 해결이 안되면, 그 때 그 프로젝트를 다시 올려서 질문해 주세요.

참고로, "OUT MC_HOBJECT *phObject"와 "ref ulong *phObject" 표현은 같은 것이 아닙니다. (C/C++에서의 OUT은 힌트일 뿐 비어있는 정의에 불과합니다.)
정성태
2016-06-03 06시48분
C++ DLL과 C# 코드를 함께 만들어 보라는 의미를 잘 모르겠습니다. DLL은 이미 만들어져 있는 것이라 별도의 소스가 없습니다(사용 라이브러리를 구매 해서 사용 중입니다.)
--> OUT MC_HOBJECT *phObject 이 부분이 phObject 변수 주소로 값을 반환하는 것으로 알고 있습니다.
예전에 C#으로 값을 반환 받는 함수를 작성시에 파라미터 앞에 out을 붙여서 사용했던 기억이 있는데요...
이처럼 주소로 값을 반환하는 경우에는 C#코드를 어떤식으로 만들어야 할지 모르겠습니다.
Jeahoon Jeong
2016-06-03 10시00분
"MCAPI MC_RV MC_CreateObject(IN MC_HSESSION hSession, IN MC_UCHAR *pData, IN MC_UINT nLength, OUT MC_HOBJECT *phObject);" 와 동일한 포맷을 갖는 C++ DLL을 만들어보라는 의미입니다. 그리고 그 안에서 C#으로부터 전달된 데이터를 접근해 보기도 하고 OUT에 맞게 임의의 데이터를 반환하는 것을 만들어 보면 됩니다.

일단, 그렇게 해서 테스트해보면 C#에서 값이 제대로 넘어왔는지, 그 쪽으로 값이 제대로 넘어가는지 테스트가 될 것입니다.

정성태

... 46  47  48  49  50  51  52  53  54  55  [56]  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1238(non...3/13/201411982(글쓴이의 요청으로 삭제합니다.) [2]
1237(non...3/11/201412076(글쓴이의 요청으로 삭제합니다.) [2]
1236(non...3/11/201412975(글쓴이의 요청으로 삭제합니다.) [2]
1235(non...3/10/201412093(글쓴이의 요청으로 삭제합니다.) [2]
1234(non...3/10/201414128(글쓴이의 요청으로 삭제합니다.) [3]
1233(non...3/9/201412236(글쓴이의 요청으로 삭제합니다.) [4]
1232(non...3/8/201411333(글쓴이의 요청으로 삭제합니다.) [2]
1231(non...3/7/201412629(글쓴이의 요청으로 삭제합니다.) [9]
1230POCO3/7/201412973쓰레드 안에서 DependencyProperty get, set시 또 다른 스레드 오류.. [1]
1229(non...3/6/201412724(글쓴이의 요청으로 삭제합니다.) [11]
1228POCO3/6/201411235안녕하세요. 질문이 있습니다. [1]
1226김형진3/4/201419796안녕하세요 windows azure에 관해 질문했던 사람입니다. [2]
1224(non...3/3/201415926(글쓴이의 요청으로 삭제합니다.) [11]
1223sadf...3/3/201411526아래 질문에 답변 감사드립니다. 한가지 더 궁금한점이 있어 질문드립니다. [1]
1222(non...3/2/201412351(글쓴이의 요청으로 삭제합니다.) [4]
1221(non...3/1/201412424(글쓴이의 요청으로 삭제합니다.) [2]
1220Until2/28/201410947질문드립니다. [1]
1219이성환2/28/201410604string.Join()과 Enumerable.Aggregate()의 차이가 궁금합니다. [2]파일 다운로드1
1218김형진2/25/201412074안녕하세요. window azure에 대해서 질문이 있어서 문의 드립니다 [4]
1217(non...2/23/201412545(글쓴이의 요청으로 삭제합니다.) [1]
1215아리수2/20/201416083C# 공부하면서 WPF에 대한 질문. [2]
1214조광훈2/20/201414313IIS8 응용프로그램 풀 관련 질문 드립니다. [2]파일 다운로드1
1213김태훈2/17/201411199가상화 프로그램 질문입니다. [1]파일 다운로드1
1212조광훈2/13/201410353ISAPI 필터에서 커스텀 헤더 정보 추가 [1]파일 다운로드1
1211조광훈2/12/201413781isapi 필터 로드 오류 [2]
1208박지호2/9/201417132[오타] 시작하세요 C# 프로그래밍 p.267 ~ 350 [1]
... 46  47  48  49  50  51  52  53  54  55  [56]  57  58  59  60  ...