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

정성태

... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5372민성8/24/20207622안녕하세요 WPF 웹브라우저 컨트롤에서 웹브라우저 자체를 엣지로 할 수가 있나요? [2]
5371서현준8/11/20206636Hyper-V 내부 네트워크 환경 중, VM 에서 인터넷 접속 [1]
5370독자8/11/20205691.net createobject 관련 질문입니다.. [4]
5369독자8/10/20206009c# 8.0 프로그래밍 책에 대한 질문 드립니다 [1]
5368guest8/10/20207298시작하세요! C# 8.0 프로그래밍 책에 오타가 있습니다. [1]
5367박순기8/8/20206214디버깅 시 반전되는 부분 글 색상이나 배경색을 변경하는 방법 [3]파일 다운로드1
5366간절함8/7/20206903하나의 솔루션에서, 32비트 프로젝트에서 다른 64비트 프로젝트 참조하는 방법 궁금합니다. [4]
5365영귤8/6/20206151TimeSpan 구할 때 시간대를 바꿔도 같은 값이 나오는 것 같습니다. [1]
5364박순기8/5/20206200visual studio의 menu bar font size 변경방법 문의 [2]파일 다운로드1
5363클락8/1/20206826c# 9.0 출간 준비 중이신가요? [2]
5361하태7/29/20206439안녕하세요! 바이너리데이터 파싱 질문 드리겠습니다!. [2]
5360진우7/28/20207406엑셀에서 발생하는 모든 이벤트를 감지 할수 있는지 궁금합니다. [6]파일 다운로드1
5358홍길동7/22/20206151개체에서 open 속성이나 매서드가 지원 되지 않읍니다.라고 오류창이 뜨는데. [1]
5357손동섭7/22/20206255책 예제코드... [3]
5355neska7/21/20206635안녕하세요 문의 드립니다 [1]
5354민성7/15/20208110안녕하세요 db연결 문자 보안 [2]
5353형성재7/14/20207137Visual Studio Setup Project에서 VC++2010재배포패키지설치 [4]
5352윤식7/10/20207116닷넷코어 빌드 시 runtimeconfig 파일을 없앨 수 있는지.. [4]
5351runr...7/2/20206959C# 에서 C++ dll 병렬 사용 [1]
5350홍성호6/29/20208567C++에서 정의된 구조체(공유메모리)를 C#으로 공유메모리에서 구조체 변환시 에러가 발생 합니다. [1]파일 다운로드1
5349jero...6/24/20206085logon credential provider 관련 문의드립니다. [1]
5348776/19/20205829시작하세요 C# 8.0프로그래밍 책에 대한 질문입니다. [8]
5347민성6/19/20206636안녕하세요 WPF Binding에서요 [1]
5346dimo...6/18/20206679Task.WhenAll() 메소드를 이용한 코드를 좀더 짧게 사용하고 싶은데 다른 표현이 있을까요? [3]
5345질문요6/12/20205790idc vs 집 속도 [2]
5344하태6/2/20206923c++ .ilb에서 c# dll 호출 질문 드리겠습니다 (콜백함수 전달) [4]
... 16  17  18  19  20  21  [22]  23  24  25  26  27  28  29  30  ...