C ++ (long * lpHandle) преобразование в C# - PullRequest
0 голосов
/ 06 января 2020

Привет У меня есть 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

Все еще не повезло. Если у кого-то есть какие-либо предложения или советы, я буду очень признателен, спасибо.

...