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 이것처럼 보낼수 있게 마샬링 하는 방법 없을까요?