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#에서 값이 제대로 넘어왔는지, 그 쪽으로 값이 제대로 넘어가는지 테스트가 될 것입니다.

정성태

... 76  77  [78]  79  80  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
554sky1/23/200715108<급질문> interop 를 사용함에 있어 [2]
557sky1/26/200712672    답변글 [답변]: <급질문> interop 를 사용함에 있어
553deve...1/15/200714623오류가 나는데 도저히 모르겠네여...좀 봐주세요... [3]파일 다운로드1
551sky1/23/200713614[급질문] vb6으로 만들어진 dll 를
552정성태1/10/200715366    답변글 [답변]: [급질문] vb6으로 만들어진 dll 를 [1]
546오택성1/2/200714124스마트클라이언트 DebugIEHost.log 좀 봐 주세요. [9]
545심현철12/28/200614271ClickOnce를 이용한 SmartClient의 설치 자동화 방법에 대해서 문의를 드립니다. [1]
53912/26/200613382COM+ 자동등록 하니 속도가 영...?
540정성태12/26/200615389    답변글 [답변]: COM+ 자동등록 하니 속도가 영...? [1]
538오택성12/26/200614607스마트클라이언트에서 그리드 컴포넌트 사용시 화면에 그리드가 올라오지 않네요~ [1]
537김현12/23/200615115스마트클라이언트 CAS배포문제와, ASP.NET에서 SmartClient로 DB인자 넘기는 문제 입니다. [3]
536오택성12/23/200612613스마트 클라이언트에서 A폼에서 B폼에 있는 그리드에 데이타를 담을려고 하는데요... [2]파일 다운로드1
541달봉이12/27/200615206    답변글 [답변]: 스마트 클라이언트에서 A폼에서 B폼에 있는 그리드에 데이타를 담을려고 하는데요...
535김태곤12/22/200618983ActiveX DLL( VB 6.0 )와 관련해 질문드립니다. [1]파일 다운로드1
534심현철12/21/200614529IE Embedded SmartClient관련 질문입니다. [1]
542달봉이12/27/200614813    답변글 [답변]: IE Embedded SmartClient관련 질문입니다.
543심현철12/27/200613722        답변글 [답변]: [답변]: IE Embedded SmartClient관련 질문입니다.
544달봉이12/28/200613449            답변글 [답변]: [답변]: [답변]: IE Embedded SmartClient관련 질문입니다.
53112/20/200615292업로드 시에 로컬의 파일을 페이지 submit 시에 같이 태워보낼 수 있을 까요?
532정성태12/20/200612824    답변글 [답변]: 업로드 시에 로컬의 파일을 페이지 submit 시에 같이 태워보낼 수 있을 까요? [1]
527심현철12/19/200615466VC++과 C# COM의 interop에서 디버깅을 하는 방법에 대해서 물어봅니다.
529정성태12/19/200616762    답변글 [답변]: VC++과 C# COM의 interop에서 디버깅을 하는 방법에 대해서 물어봅니다. [1]
526독불장군12/17/200613069아랫글 과련... [1]
525독불장군12/15/200613247일주일 공부하고 있는데 잘 안되네요 도와 주세요 스마트 클라이언트파일 다운로드1
528정성태12/19/200613538    답변글 [답변]: 일주일 공부하고 있는데 잘 안되네요 도와 주세요 스마트 클라이언트
530독불장군12/20/200613016        답변글 [답변]: [답변]: 답변에 감사 드립니다.
... 76  77  [78]  79  80  81  82  83  84  85  86  87  88  89  90  ...