Привет У меня есть 2 метода в C ++ MF C, который вызывает оба long* lpHandle
и long lHandle
соответственно. Я хотел бы преобразовать эти вызовы в C#.
C ++ MF C пример:
//The api methods
NETCLIENT_API int API_CALL NETCLIENT_MCOpenConfig(long* lpHandle);
NETCLIENT_API int API_CALL NETCLIENT_MCConfig(const char* szDevIDNO, int nType,
GPSConfigData_S* pConfig, void* pUsr, void (CALLBACK * FUNMCMsgCB)(GPSMCMsg_S* pMsg, void* pUsr)
, long lHandle);
...
...
CDlgTransParam::CDlgTransParam(CWnd* pParent /*=NULL*/)
: CDialog(CDlgTransParam::IDD, pParent)
{
//set handle to null
m_lParamHandle = NULL;
}
...
...
void CDlgTransParam::DoConfig(CString strIDNO, int nType, GPSConfigData_S* lpInConfig)
{
//opens config handle
NETCLIENT_MCOpenConfig(&m_lParamHandle);
// Sends message; //m_lParamHandle is the return handle of NETCLIENT_MCOpenConfig
NETCLIENT_MCConfig(strIDNO, nType, lpInConfig, this, FUNGetDevConfig, m_lParamHandle);
}
Преобразование Winform C#, над которым я работал:
//Delegate methods
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void FUNMCMsgCB(int nMsg, Form1 form1);
class NETCLASS
{
//--
[DllImport("libnetclient.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int NETCLIENT_MCOpenConfig(_x);
//--
[DllImport("libnetclient.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int NETCLIENT_MCConfig(string szDevIDNO, int nType,
string pConfig, Form1 form1, FUNMCMsgCB _callback, _x);
}
...
...
private void Sendbutton_Click(object sender, EventArgs e)
{
//opens config handle
int handle = NETCLASS.NETCLIENT_MCOpenConfig(_x);
// Sends message; //m_lParamHandle is the return handle of NETCLIENT_MCOpenConfig
FUNMCMsgCB _callback = new FUNMCMsgCB(FUNMCMsgCB);
int param3 = NETCLASS.NETCLIENT_MCConfig(szDevIDNO, 0, pdata, this, _callback, _x);
}
В примере C# вы увидите _x
. согласно DO C. C ++ long
конвертируется в int
в C#. Я попытался определить это как:
int str = 0;//set value to zero
GCHandle handlel = GCHandle.Alloc(str, GCHandleType.Weak);//handle type
IntPtr pointer = GCHandle.ToIntPtr(handlel);//define pointer
int lHandle = pointer.ToInt32();//convert to int
Это не сработало. Я также заметил, что имя переменной типа long
- это lpHandle, как указано в методе API (e.g "long* lpHandle"
). Что составляет Intptr
в C#, поэтому, естественно, я попытался использовать Intptr
и ref Intptr
, например:
NETCLIENT_MCOpenConfig(ref IntPtr lHandle);//ref pointer
NETCLIENT_MCOpenConfig(IntPtr lHandle);//normal pointer
Все еще не повезло. Если у кого-то есть какие-либо предложения или советы, я буду очень признателен, спасибо.