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

정성태

... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4932정환나라12/13/20179049vs2013에서 빌드한 com 컨트롤 객체를 닷넷 2.0에서 사용하려 합니다 [4]
4931Arvid12/12/201710063Visual Studio 2012 c# using문 참조 에러 [5]파일 다운로드1
4929김성대12/8/20178578app.config에 관한질문입니다. [1]
4928김성대12/7/20179238SQL Server 설치에러에 대한 질문입니다. [1]파일 다운로드1
4926heyh...12/6/20178468[삭제] ContextSwitchDeadlock????
4925ho12/5/20178998[삭제] WebBrowser로 드롭박스 로그인 페이지 탐색 시 발생한 문제에 대해 질문 올립니다.파일 다운로드2
4924몽중언12/3/20179451C# 디버깅 모드에서만 DB Insert가 되는 현상 질의 [6]
4923고요한11/23/20179582파일 확장자에 연결된 프로그램을 등록하는 방법에 대한 질문입니다. [2]
4922박성훈11/23/201710542시작하세요! C# 7.1 학습 방법 [3]
4921초보개발자11/20/20177767[삭제] 폼 사이즈 질문드립니다.
4920Ques...11/19/20178885IEnumerable 의 "지연된 평가" 에 관하여 질문드립니다. [2]파일 다운로드1
4919mskim11/16/20179164Split()을 이용하여 문자 구분 시 구분문자도 같이 저장하는 방법이 있나요? [2]
4917ho11/16/20179811WPF XAML 트리거 관련해 문의 드립니다. [3]
4918ho11/16/201710098    답변글 [답변]: 예제 프로젝트 첨부합니다. [4]파일 다운로드2
4916필승11/11/20179766기본 웹 브라우저 체크는 어떻게 해야 하나요? [2]
4915필승11/10/20178833WebBrowser 컨트롤 소리 출력 문의 드립니다. [2]
4914Ques...11/10/20179518c# 버튼 이벤트에 관하여 질문드립니다. [2]
4913Arvid11/8/201711923Log4Net 라이브러리를 이용하여 특정 기간이 지났을 때 자동 로그 삭제 기능 구현 질문 드립니다! [2]
4912조범희11/8/201711595C# FTP 다운로드중 에러 발생.. [2]파일 다운로드1
4911필승11/6/201710049WebBrowser 컨트롤 사용법에 대해 궁금합니다. [2]
4910진우11/6/20179627람다 초보 질문 드립니다. [2]
4909필승11/5/201710550TextBox에 관해 질문 드립니다. [5]
4908필승11/1/201713892특정 시각에 프로그램 종료 또는 재시작시 오류 발생 [8]
4907심너울10/29/20179481선생님이 쓰신 "시작하세요! C# 7.1~"으로 공부하고 있는데요~ [2]
4906guest10/25/20179052.net core, .net standard 관련해서 궁금합니다 [2]
490510/25/20178326watermark 관련문의 [1]
... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...