c++ DLL의 함수 선언문이구요
typedef BOOL (__stdcall TTransact )(HWND hWnd,int nTransactionID,const char* pszTrCode,const char* pszInputData,int nInputDataSize,int nHeaderType=0,int nAccountIndex=0);
처음에는 string으로 c#에서 선언 했는데 안되구요.
[DllImport("wmca.dll", CharSet = CharSet.Ansi)]
private static extern bool wmcaTransact(IntPtr hWnd, int nTransactionID, string pszTrCode, string pszInputData, int nInputDataSize, int nHeaderType, int nAccountIndex);
구글링 하다가 ref IntPtr 해보란 글을 읽구 해봤는데 안되요.....
[DllImport("wmca.dll", CharSet = CharSet.Ansi)]
private static extern bool wmcaTransact(IntPtr hWnd, int nTransactionID, string pszTrCode, ref IntPtr pszInputData, int nInputDataSize, int nHeaderType, int nAccountIndex);
구조체 만들구요
Tc8102InBlock c8102inblock = new Tc8102InBlock();
구조체에 데이터 다 넣고
IntPtr iPtr = IntPtr.Zero;
iPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(c8102inblock));
Marshal.StructureToPtr(c8102inblock, iPtr, false);
해당 구조체의 포인터를 받아와서 함수 호출 시에 넘겨 줬습니다.
wmcaTransact(
this.Handle,
3,
"c8102",
ref iPtr, // 이부분이지요
Marshal.SizeOf(c8102inblock),
3,
1
}
저 함수 내부 DLL 에서 WndProc 메시지를 보내줍니다.
해당 메시지를 받아보면 뭔가 데이터가 잘못 들어갔는지 데이터를 잘못 입력했다고 나옵니다 (Tc8102InBlock 구조체 안의 값이 틀렸다고)
다른 인자값들은 다 잘 넘어가고, 다른 데이터로 바꿔서 보내면 해당 문제에 대해 정확하게 나옵니다.
샘플 코드에서는 (char*)&c8102inblock 구조체의 포인터를 그냥 char* 로 캐스팅 해서 씁니다...ㅠㅠ(C#에선 불가능)
c#에서 (char*)&c8102inblock 이것처럼 보낼수 있게 마샬링 하는 방법 없을까요?
댓글 0