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)
1151황기동6/5/201311358무선 패킷 전송관련 질문 [1]
1147이진권6/2/201311372c# 윈폼 facebook과 연동2 [1]
1144황은영5/29/201315875원격지 서버에서 COM+ 호출이 되지 않습니다. [7]
1143김선희5/28/201316790윈도우 8, 익스플로러 10, 64bit->32bit [1]
1142백지훈5/15/201311215음성인식 TTS 관련해서 질문드립니다 ㅜㅜ [2]파일 다운로드1
1141나그네5/10/201311298안녕하세요..전자세금 관련하여.. 보다보다 여기까지 왔습니다. [4]
1140이성환5/8/201311484제네릭과 배열 관련 기초 질문입니다. [11]
1139양영석5/3/201310046페이스북 로그인 관련하여.... [1]
1137김민현4/30/201310083Binary 구조체에 대한 Linq query 관련 질문입니다. [3]파일 다운로드1
1136박상영4/25/201310976ksc5601에서 지원하지않는 확장문자 찾는방법 [3]
1135sequ...4/16/201326534c# dll c++ 에서 사용하기 (event 사용) [17]
1134이성환4/12/201310738volatile 키워드 관련 질문입니다. [3]파일 다운로드1
1133서광석4/8/201313955vb.net 2010에서 배포시 문제점 확인 방법에 대한 질문드립니다 [1]
1131헤딩3/28/201316250IIS 처리 성능을 높이고 싶으면 풀의 proecss 수를 계속 늘리면 될까요? [1]
1130박재율3/27/201310527WCF 서비스가 종종 죽는데 도움좀 부탁드립니다 ㅠ [1]
1129이상민3/21/201314879안녕하세요...IE Embedded Smart Client가 Windows8에서 정상동작을 하지 않습니다. [8]
1125박홍균3/19/20139077안녕하십니까. visual studio 에서 TFS 접속 관련으로 궁금한 점 여쭤봅니다.
1124궁금이3/18/201312115IIS 서버 이중화 구성시 데이터 베이스 트랜잭션 관리에 관해서... [1]
1127궁금이3/19/20139509    답변글 [답변]: IIS 서버 이중화 구성시 데이터 베이스 트랜잭션 관리에 관해서...(정성태님 봐주세요)
1122김시현3/11/201310947 Xamarin 에 관련하여 질문드립니다. [4]
1121롬메달2/14/201311046Assembly.Load로 얻은 객체안에서 제3의 어셈블리를 참조할때의 문제입니다. [8]
1120Lyn2/12/201310565안녕하세요. 블로그에 기술관련글을 꾸준히 포스팅 하실 수 있는 원동력이 궁금합니다. [1]
1119박진영2/4/201334059닷넷 DLL 실행 에러 (보호된 메모리를 읽거나 쓰려고 했습니다..) [2]파일 다운로드1
1118C#조으다1/29/201312127공유기 관리 페이지에 접근시 윈도우 인증창이 뜹니다. [4]
1117최윤호1/28/20139896답변주셔서 감사합니다 질문의 요지는 그게 아니고 [1]파일 다운로드1
1116C#조으다1/27/201317099비프음을 컴퓨터 내장 스피커로 출력하려면.. [2]
... 46  47  48  49  50  51  52  53  54  55  56  57  58  [59]  60  ...